您的位置:首页 > 编程语言 > Java开发

java基础高级特性

2016-09-04 20:44 295 查看
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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: