java基础高级特性

来源:互联网 发布:c语言数组最大长度 编辑:程序博客网 时间:2024/05/16 11:11
java集合框架和泛型
1.java中所有的集合API存在与java.util.*;
2.java集合框架中的API层次结构
      Collection                     Map
           |
     List     Set                       
所有的接口,其中java俗称的三大接口:List,Set和Map
接口存储特性:
Collection 存储的一组无序,不唯一的对象。
List存储的一组有序,不唯一的对象。
Set存储的一组无序,唯一的对象。
Map存储的K-V对。其中所有的K组成的keySet,所有的V组成了Collection的Values集合。其中Map提供K到V的映射,即get(key)。


List的两个实现类:
ArrayList和LinkedList
ArrayList存储同数组:连续的空间,通过下标访问元素。
LinkedList存储的(双)链表式结构,只能通过一个元素直接访问到其前后的元素,元素存储地址不要求连续。
ArrayList擅长随机访问元素和遍历元素。
LinkedList擅长增加,删除元素,以及对头尾两个元素的查询,增加和删除。


Set的两个实现类:
HashSet和TreeSet
常用的HashSet:已Hash散列表的形式存储元素。
Set无法单独通过方法获取元素,一般结合循环遍历元素。


Map的两个实现类:
HashMap和TreeMap
常用HashMap:同Set存储。
Set keySet = map.keySet();
Collection values = map.Values();
Map中的每个元素由一个Key和对应的Value组成。
map.put(key,value);
Map中的Key可以为NULL


集合的遍历:
for循环和Iterator迭代器
List接口的集合对象:可以使用for循环,增强for循环和Iterator迭代器遍历元
素。
Set接口的集合对象:增强for循环和Iterator迭代器遍历元
素。
Map接口的集合对象:不可以直接遍历Map集合,需要间接遍历KeySet结合get方法遍历Map集合。


Map<Integer,String> strMap = new HashMap<Integer,String>();
strMap.put(1,"张三");
strMap.put(2,"莉莉");
// 增强for循环
for(Integer key : strMap.keySet()){
     System.out.println(key + "对应的中文名:"+ strMap.get(key));
}
// Iterator迭代器
Iterator<Integer> keyIt = strMap.keySet().iterator();
while(keyIt.hasNext()){
    // 在循环中只能使用一次keyIt.next();方法获取元素
    Integer key = keyIt.next();
    System.out.println(key+"对应的中文名:"+strMap.get(key));
}


Java实用类:
1.枚举类型:表示一组既定的取值范围,定义在一个enum类型的java文件中,相当于在一个class中定义了一组静态常量值。
2.枚举的使用:枚举类型定义的变量,在赋值时,只能使用枚举类.枚举值。
switch结构的表达式中可以使用枚举类型。其case后的常量直接书写枚举值。


3.java中的8种基本类型:byte,char,short,int,long,boolean,float,double
其对应的封装类型:Byte,Character,Short,Integer,Long,Boolean,Float,Double
基本类型和其封装类型之间可以实现自动类型转换。
封装类型的对象提供了一组转换方法。
String  <- - ->  XXX
XXX.parseXXX(String);
XXX.toString();


4.Math数学函数类:
Math.random()获取0~1之间的随机小数。
Math.min(num1,num2)
Math.max(num1,num2)
Math.floor(小数) 返回比该小数小的最大整数
Math.ceil(小数) 返回比该小数大的最小整数


5.Random类
Random rand = new Random();
int num = rand.nextIn(9); // 获取0~8的随机数字


6.Date日期类和Calendar日历类
日期类一般用于整体日期或时间的显示。
日历类一般用于部分(如:天,小时)的显示。且日历类提供一些常用的日期计算常量。如每年中的第几天,每月中的第几周的第几天,周几等。
// 获取当前日期时间
java.util.Date;
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String st = sdf.format(today);
Calendar c = Calendar.getInstance();
int month = c.get(Calendar.MONTH); // 0~11


java中输入和输出:java.io.*;
1.文件类:File表示一个文件或目录的对象。
File dir = new File("E:/temp");
File file = new File("E:/temp/abc.txt");


新建目录:
File dir = new File("E:/temp");
dir.mkDir(); // 表示创建temp目录
File dir = new File("E:/temp/aaa");
// 当前不存在temp和aaa
dir.mkDirs(); // 表示创建temp目录和aaa目录


流:表示程序和目标源直接的连接通道。负责传输字节或字符的数据串。按照先进先出的形式传输数据。


流分类:
1.按照方向分类:输入(InputStream和Reader)和输出(OutputStream和Writer)
2.按照数据单元分类:字节流(InputStream和OutputStream)和字符流(Reader和Writer)
3.按照操作对象分类:低级流(直接操作目标源的流)和高级流(直接操作低级流的流)


输入流的使用步骤:
// 创建输入流对象(字节,字符)
FileInputStream fis = new FileInputStream("E:/abc.txt");
// 创建存储读取内容StringBuffer对象和读取容器数组
StringBuffer sub = new StringBuffer();
byte[] b = new byte[1024];
// 循环读取内容
while(fis.available() > 0){
     fis.read(b);
     sub.append(new String(b));
     b = new byte[1024];
}
String fileContent = sub.toString().trim();
// 关闭流
fis.close();


输出流的使用步骤:
// 创建输出流对象(文件若不存在,则输出流自动创建文件)
FileOutputStream fos = new FileOutputStream("E:/aaa.txt",true);
// 将内容写到文件中
Stirng str = "hello";
fos.write(str.getBytes());
// 清空流(一般用于高级输出流)
fos.flush();
// 关闭流
fos.close();


创建流链接
// 首先创建低级流对象
FileInputStream fis = new FileInputStream("E:/abc.txt");
// 根据低级流的操作单元创建对应的高级流对象
ObjectInputStream ois = new ObjectInputStream(fis);
// 使用一些高级流的方法


FileReader fr = new FileReader("E:/abxc.txt");
BufferedReader br = new BufferedReader(fr);
String str = br.readLine();// 一次读取一行内容返回字符串


对象的序列化和反序列化
前提:对象的类型必须实现序列化接口
序列化(ObjectOutputStream)
反序列化(ObjectInputStream)
在序列化的过程中如果某个类的属性不允许读写可以使用transient关键字修改属性。


java多线程
进程和线程的关系:
进程指的是一个应用程序执行过程中的一个标识。
一个进程可以有至少一个线程。
线程是一个应用程序中执行任务的最小单元。
java多线程就是指一个应用程序执行过程中的多任务表现。如迅雷。


java多线程的使用:
1.继承Thread类
2.实现Runnable接口(可以实现多个线程间共享资源)
注意:必须使用Thread类或其子类的对象.start()方法来启动一个线程,该线程用于执行对象的run()方法。
// 方式一:
public MyThread extends Thread{
    public void run(){...}
}
main方法中:
MyThread mt = new MyThread();
mt.start();
// 方式二:
public MyThread  implements Runnable{
    // 定义共享资源
    // 编写任务方法run
}
main方法中:
MyThread  mt = new MyThread();
Thread t1 = new Thread(mt,"t1");
Thread t2 = new Thread(mt,"t2");
Thread t3 = new Thread(mt,"t3");
t1.start();t2.start();t3.start();


线程的优先级:
在windows系统中,java线程默认级别为5,最大为10,最小为1.
使用setPriority(level);


线程调度方法:
join();// 使用对象调用,表示当前对象立即执行并直到运行完毕后,其他线程才能解除阻塞。
sleep();// 休眠方法,使用Thread.sleep(毫秒值),表示当前线程处于阻塞状态指定时长,无论是否有其他线程在运行,都会达到休眠时间后,才能解除阻塞。在其休眠状态下,其他线程获取运行权的概率均等。
yeild();// 暂停方法,Thread.yeild(),使当前线程处理暂停运行状态,当其暂停时,只允许优先级相同或更高的线程进行获取运行权。


线程的同步:
当多个线程使用同一资源时,可能存在“前后脚关系”,导致资源不统一使用。
同步方式二种:
1.同步方法:
将需要同步使用的方法增加:synchronized
表示,当一个线程获取该方法的执行权时,该方法将被锁定,直到方法运行结束,才将锁打开,以便另一个线程获取执行权。


2.同步代码块:
在一个方法中,特定代码块部分使用需要同步的资源时,使用同步代码块。
public void dosomething(){
    // 代码行....
    synchronized(同步资源对象){
        // 同步代码块
    }
    // 代码行....
}


特殊说明:当使用synchronized实现线程同步时,需要注意避免死锁。


XML技术:
XML指定的可扩展标记语言。是以.xml结尾的文本文件。
语法:
使用<?xml version="1.0" encoding="UTF-8" ?>来定义XML
一个XML只能有一个根元素(跟标签)
例如:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="1">
        <name>张三</name>
        <age>18</age>
        <address>江苏徐州</address>
    </student>
</students>
格式良好的XML需要满足最低要求集:
1.需要有XML定义
2.只能有一个根元素
3.大小写区分
4.标签必须关闭
5.标签必须正确嵌套


使用DTD来约束XML文档的内容:
DTD指的是定义一些元素或元素间关系的约束语句,用于限制指定XML文件的内容格式的文件。后缀.dtd。引入方式,内部DTD和外部DTD。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 内部DTD -->
<!DOCTYPE poems [
    <!ELEMENT poems (poem*) >
    <!ELEMENT poem (title?,author,content+) >
]>
<poems>
    <poem>
        <title>春晓</title>
        <author>孟浩然</author>
        <content>春眠不觉晓......</content>
    </poem>
</poems>


外部DTD(poem.dtd)
<!ELEMENT poems (poem*) >
<!ELEMENT poem (title?,author,content+) >




XML文件(poem.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 外部DTD -->
<!DOCTYPE poems SYSTEM "poem.dtd">
<poems>
    <poem>
        <title>春晓</title>
        <author>孟浩然</author>
        <content>春眠不觉晓......</content>
    </poem>
</poems>


XML文件使用场景:存储数据,传输数据,作为配置文件
解析XML文件:
常用方式:DOM,SAX,JDOM,DOM4J(第三方组件)
DOM4J使用步骤:
1.在项目引入dom4j.XXX.jar
2.使用DOM4j提供的API操作XML
步骤例如:
// 获取解析器
SAXReader reader = new SAXReader();
// 获取XML文档解析对象
Document doc = reader.read(new File("poem.xml"));
// 读取根元素
Element root = doc.getRootElement();
// 获取指定元素
Element poem = root.element("poem");
// 获取元素集合
List<Element> poemList = root.elements("poem");
// 遍历元素集合
for(Element poem : poemList){
     // 读取元素的属性值
     String id = poem.attributeValue("id");
     // 读取子元素文本
     String title = poem.elementText("title");
}





















































0 0