Java高级特性-笔记

Java高级特性-笔记
Java高级特性-笔记

Java高级应用技术

一、集合框架和泛型.

1、集合框架.

<1>Collection接口存储一组不唯一、无序的对象.

<2>List接口存储一组不唯一、有序的对象.

<3>Set接口存储一组唯一、无序的对象.

<4>Map接口存储一组键值对象, 提供key-value(k-v)的映射.

<5>Iterator:迭代器.

<6>Collections:工具类.(提供了对集合进行排序、遍历等多种算法实现)

2、List接口.

List接口的实现类:

<1>ArrayList:实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素效率高.

*常用方法:

<2>LinkedList:采用了链表存储方式,插入、删除元素是效率较高.

*常用方法:

3、Set接口.

<1>存储唯一、无序的对象.

<2>Set里面存放的是对象的引用.

<3>Set使用对象的equals()方法比较是否为同一对象.

Set接口的实现类:

<1>HashSet.

<2>TreeSet.

4、迭代集合.

<1>增强型for

<2>迭代器Iterator

*获取Iterator:Collection接口的iterate()方法.

*Iterator的方法:

*boolean hasNext(): 判断是否存在另一个可访问的元素.

*Object next(): 返回要访问的下一个元素.

5、Map接口.

Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作.

Map接口实现类:

<1>HashMap.

*常用方法:

<2>遍历Map集合:

*增强型for

*迭代器Iterator

获得Map键和值的方式:

<1>keySet() --Set

迭代这个Set(Iterator)

get(key)

<2>entrySet()--Set(Map.Entry)

增强型for(或者Iterator)

getKey()

getValue()

6、泛型.

<1>将对象的类型作为参数指定到其他类或者方法上,从而保证类型转换的安全性和稳定性.

<2>典型的泛型集合:

ArrayList HashMap

*表示该泛型集合中的元素类型.

*泛型集合中的数据不再转换为Object.

7、Collections算法类.

Collections和Cillection不同,前者是集合的操作类,后者是集合接口. Collections提供的常用静态方法:

<1>sort();排序

<2>binarySearch():查找

<3>max()\min():查找最大\最小值

<4>Type implements Comparable 实现Comparable接口;

override compareTo() 重写compareTo()方法;

二、实用类

1、枚举(enum):指由一组固定的常量组成的类型.

【注】:<1>枚举类型的取值默认为:public static final;

<2>可以定义属性和方法.

<3>构造器必须是私有的.

2、包装类 https://www.360docs.net/doc/d316206664.html,ng包

包装类基本类型

Boolean boolean

Character char

<1>构造方法.

所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例.

public Type(type value)

如:Integer i=new Integer(1);

除Character类外,其他包装类可将一个字符串作为参数构造它们的实例.

public Type(String value)

如: Integer i=new Integer("123");

【注】:

*Number类型的构造时,参数必须能转换为相应的数字,不然NumberFormatException异常.

*Boolean类型构造方法参数为String类型时,若该字符串内容为true(不考虑大小写)则 Boolean对象表示true,否则全都是false.

<2>**Value():

*Number包装类型转换为基本数据类型.(Byte、Short、Integer、Long、Float、Double)

*Boolean 包装类型转换为基本数据类型.

*Character包装类型转换为基本数据类型(charValue()).

<3>toString():以字符串形式返回包装对象表示的基本类型数据.

<4>valueOf():包装类型

*所有包装类valueOf(type type)

*包装类valueOf(String s) ->除Character之外

<5>parse**():把字符串转换为相应的基本数据类型数据(Character除外).

<6>装箱:基本-->包:基本类型转换为包装类的对象.

拆箱:包--->基本:包装类对象转换为基本类型的值.

3、Math类https://www.360docs.net/doc/d316206664.html,ng.Math

*提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率).

4、Random类.java.util.Random

*random():0(包括)-1(不包括)之间的随机浮点数

*Random random=new Random(种子);

random.nextInt();返回下一个伪随机数,整型的.

5、操作字符串的实用类

5-1、String字符串类:

<1>length():确定字符串的长度,返回字符串中的字符数.

<2>equals():判断字符串的内容是否相同.返回boolean类型的值.

equalsIgnoreCase():忽略大小写的比较字符串内容.

toLowerCase():转换字符串中为英文字符为小写.

toUpperCase():转换字符串中为英文字符为大写.

<3>equals()与==

开始,equals()与==作用一样;

比较两个字符串内存地址是否一致,是否为同一对象.

后来,字符串类对equals()方法进行了重写,equals()变成了比较两个字符串的内容是否相等.

<4>字符串连接

*使用”+”

*使用String类的concat()方法.

【注】:

字符串方法操作的(产生变化的方法:变大写、小写、连接、截取......)变化都作用于字符串的副本,而不是本身.

<5>字符串常用的提取方法.

substring(int start):从start(包含)开始截取,截取到字符串的末尾.

substring(int start,int end):从start(包含)开始截取,截取到end(不包含)位置为止.

<6>字符串拆分.

split():对字符串进行拆分,结果作为String[]返回.

5-2、StringBuffer类:操作字符串

<1>频繁修改字符串的操作,效率比String高.

<2>常用方法:

*toString():StringBuffer->String

*StringBuffer s=new StringBuffer("content");:String->StringBuffer

*append():追加字符串.

*insert():在某个位置插入字符串.

5-3、操作日期和时间:java.util.Date

【例】:输出现在时间:

//创建日期对象

Date date = new Date();

//定制日期格式

SimpleDateFormat formater = new SimpleDateFormat("yyyy- MM-dd HH:mm:ss");

String now = formater.format(date);

System.out.println(now);

补充:Calendar类:抽象类 java.util.Calendar

Calendar类提供一些方法和静态字段来操作日历.

三、输入和输出处理

Java API:java.io.File类

1、File类:文件的属性或操作

路径:\\ /

常用方法:

2、流

2-1:流的概念:

*流是一组有序的数据序列.

*以先进先出方式发送信息的通道.

2-2:流的分类:

*按数据方向分:

输入流:InputStream、Reader

输出流:OutputStream、Writer

*按数据类型分:

字节流:InputStream、OutputStream

字符流:Reader、Writer

下图为常用的IO流:

2-3:各种流的使用

(1)字节流-输入流:

public abstract class InputStream

*常用方法:

<1>int read():从输入流中读取下一个字节,返回0-255之间的int值.返回值代表着都出来的字节对应的整型数字.

<2>int read(byte[] b):从输入流中读取一堆字节,把这些字节存储在字节数组b中。返回值代表着真实的读到的字节的个数(b的长度).

<3>int read(byte[] b,int off,int len) :

从输入流中读取一堆字节,把这些字节存储在字节数组b中。off对应的是

b开始存储字节的标识或下标(将读取的第一个字节存储在元素 b[off] 中)。len对应的是读到的字节的个数或长度.

<4>void close();关闭此输入流并释放与此流有关的所有系统资源.

<5>int available(;:可以从输入流中读取的字节数目.

<6>long skip(long n;:跳过和放弃此输入流中的n个数据字节,该方法有可能失效.

<7>void mark(int n);在此输入流中标记当前的位置.

<8>void reset();将此流重新定位到对此输入流最后调用mark方法时的位置.

<9>boolean markSupported();测试此输入流是否支持mark和reset方法.

*其子类:FileInputStream

常用的构造方法:

*FileInputStream(File file)

*FileInputStream(String name)

使用FileInputStream读取文本文件步骤:

a:引入相关类.

b:创建输入流对象.(FileInputStream对象)

c:读取文本文件.(read())

d:关闭流.

(2)字节流-输出流

public abstract class OutputStream

常用方法:

<1>void write(int c):将指定的字节写入此输出流.

<2>void write(byte[] b):将b.length个字节从指定的字节数写入此输

出流.

<3>void write(byte[] b,int off,int len):将指定字节数组中从偏移

量off开始的len个字节写入此输出流.

<4>void close():关闭此输出流并释放与此流有关的所有系统资源.

<5>void flush():刷新此输出流并强制把缓冲区的数据写到输出流中.

*其子类FileOutputStream

常用的构造方法:

*FileOutputStream (File file)

*FileOutputStream(String name)

*FileOutputStream(String name,boolean append) 使用FileOutputStream往文本文件中写数据步骤:

a:引入相关类

b:创建输出流对象(FileOutputStream对象)

c:写入文本文件(write())

d:关闭流

(3)字符流-输入流

public abstract class Reader

常用方法:

<1>int read():从输入流中读取下一个字符,返回0-65535之间的int值.返回值代表着读出来的字符对应的整型数字.

<2>int read(char[] b):从输入流中读取一堆字符,把这些字符存储在字符数组b中。返回值代表着真实的读到的字符的个数(b的长度).

<3>int read(char[] b,int off,int len) ;

从输入流中读取一堆字符,把这些字符存储在字符数组b中。off对应的是b开始存储字符的标识或下标(将读取的第一个字符存储在元素 b[off] 中)。len对应的是读到的字符的个数或长度.

<4>close():关闭输入流.

其子类:InputStreamReader

常用的构造方法:

*InputStreamReader(InputStream stream)

*InputStreamReader(InputStream stream, String charsetName)

文本文件读取FileReader是InputStreamReader的子类

常用的构造方法:

*FileReader(File file)

*FileReader(String pathName)

*FileReader只能按照本地平台的字符编码来读,不能通过用户特定的字符编码来读

*本地平台的字符编码获得:

System.getProperty("file.encoding");

使用FileReader读取文本的步骤:

a.引用相关类.

b.创建FileReader对象.

c.读取文本文件.(read())

d.关闭流.

BufferedReader:带有缓冲区的字符输入流

常用的构造方法:

BufferedReader(Reader reader)

子类BufferedReader特有的方法:

readLine()-->String 当他的返回值是null时,就表示读取完毕了.

【注】:再写入时要注意写换行符,否则会出现阻塞.

(4)Writer:字符流-输出流

public abstract class Writer

常用的方法:

<1>write(char[]);

<2>write(String str);将str字符串里包含的字符输出到指定的输出流中.

<3>write(String str,int off,int len);将str字符串里从off位置开始长度为len的字符输出到输出流中.

<4>void close();关闭输入流.

<5>void flush();刷新输出流.

其子类:OutputStreamWriter

常用的构造方法:

*OutputStreamWriter(OutputStream stream)

*OutputStreamWriter(OutputStream stream,String charsetName)

写入文本文件FileWriter类是OutputStreamWriter的子类

常用的构造方法:

*FileWriter(File file)

*FileWriter(String pathName)

FileWriter只能按照本地平台的字符编码来写,不能通过用户特定的字符编码来写.

使用FileWriter写入文本的步骤:

a.引用相关类.

b.创建FileWriter对象.

c.写入文本文件.writer();

d.关闭流.

BufferedWriter:带有缓冲区的字符输出流

常用的构造方法:

*BufferedWriter(Writer out);

常用方法:

*write();

*Flush();

2-4:字节流和字符流的区别

<1>*字节流读取的时候,读到一个字节就返回一个字节;

*字符流使用了字节流读到一个或多个字节(中文对应的字节是两个,UTF-8码表中是三个)时,先去查指定的编码表,将查到的字符返回.

<2>*字节流可以处理所有类型数据,如图片、mp3等.

*字符流只能处理字符数据.

<3>*字节流输入流都是以InputStream结尾,字节流输出流都是以OutputStream结尾.

*字符流输入流都是以Reader结尾,字符流输出流都是以Writer结尾. 2-5:二进制文件读取和写入(图片、音频等等)

<1>DataInputStream类

*FileInputStream的子类.

*与FileInputStream类结合使用读取二进制文件.

<2>DataOutputStream类

*FileOutputStream的子类.

*与FileOutputStream类结合使用写二进制文件.

3、序列化和反序列化

*序列化是将对象的状态写入到特定的流中的过程.

*反序列化则是从特定的流中获取数据重新构建对象的过程.

<1>序列化的步骤:

*实现Serializable接口.

*创建一个对象输出流 ObjectOutputStream.

*通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象.

<2>反序列化的步骤:

*实现Serializable接口.

*创建一个对象输入流 ObjectInputStream.

*通过对象输入流的readObject()方法来读取对象,该方法返回一个object类型的对象,如果程序知道该java对象的类型,则可以将该对象强制转换成其真实的类型.

【注】:

可以为对象某些属性添加transient,这些属性将不再被序列化.

四、进程及线程

1、了解进程和线程关系

进程:同一操作中执行的一个子程序,包含了三部分虚拟CPU、代码、数据.

多进程:同一操作系统中执行的多个并行的子程序.可以提高CPU的使用率.

线程:在同一个进程当中执行的子程序流.

多线程:同一个进程当中并发执行的多个子程序流.可以提高CPU的使用率. 【注】进程与线程的区别:

*进程有独立的进程空间,进程中的数据存放空间(堆空间和栈空间)是独立的.

*线程的堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的.

2、创建线程

<1>写一个类,extends Thread类,重写run()方法.

<2>写一个类,implements Runnable接口,实现run()方法.

启动线程:start()而非run().

【补】:

Thread中的一些方法:

<1>currentThread();返回对当前正在执行的线程对象的引用(实现接口方式时使用).

<2>sleep(long millis);在指定的毫秒数内让当前正在执行的线程休眠(暂停执行);本线程不会去抢,除非sleep结束;多个线程之间都会去抢执行权限,不会考虑优先级.

<3>yield();暂停当前正在执行的线程对象,并执行其他线程;只给本类或者优先级大于本类优先级的线程去抢.

<4>join();等待该线程终止;放在start()前面则没有用处.

<5>setDaemon(boolean on);将该线程标记为守护线程,守护线程需要依赖其他线程,会在虚拟机停止的时候停止.

五、网络编程

1、网络编程的基础知识

<1>IP地址:*IP网络中每台主机都必须有一个唯一的IP地址.

*IP地址是一个逻辑地址.

*32位,4个字节,常用点分十进制的格式表示,例:192.168.0.200 <2>协议:*为进行网络中的数据交换而建立的规则、标准或约定.

*不同层具有各自不同的协议.

<3>查看本机IP(ipconfig)

<4>测试网络通畅(ping 目标IP地址)

2、DNS:域名解析器

3、网络服务器

客户机-->服务器(Client/Server)(C/S)

浏览器-->服务器(Browser/Server)(B/S)

4、网络通信协议

<1>TCP:是一种面向连接的、可靠的、基于字节流的传输层通信协议;TCP

要求通信双方必须建立连接之后才开始通信,通信双方都同时可以进行数据传输,它是全双工的,从而保证了数据的正确传送.

<2>UDP:是一个无连接协议,在传输数据之前,客户端和服务器并不建立和

维护连接.UDP协议的主要作用是把网络通信的数据压缩为数据报的形式.

5、Socket:套接字 https://www.360docs.net/doc/d316206664.html,包

5-1:流式套接字:基于TCP协议的Socket网络编程

服务器端:

<1>创建一个服务器Socket.

ServerSocket serverSocket=new ServerSocke(5000);

<2>使用accept()等待客户的通信.

Socket socket=serverSocket.accept();

<3>获得输入流,读取数据获得相应的用户请求.

InputStream is=socket.getInputStream();

。。。。。

通过输出流,给客户端一个响应.

OutputStream os=socket.getOutputStream();

。。。。。

<4>释放相应资源.

客户端:

<1>创建一个客户端Socket.

Socket socket=new Socket("localhost",5000);

<2>通过输出流写数据发送请求.

OutputStream os=socket.getOutputStream();

。。。。。。。。。。

socket.shutdownOutput();

通过输入流接收服务器给我的响应.

InputStream is=socket.getInputStream();

。。。。。。。。。。

<3>释放相应资源.

5-2:数据包式套接字:基于UDP协议的Socket网络编程.

服务器端:

<1>创建接收端Scoket对象.DatagramSocket(int port)

<2>创建一个数据包.DatagramPacket(byte[] buf,int length)

<3>调用Socket对象的接收方法(receive();)接收数据.

获取对方IP:public InetAddress getAddress();

<4>解析数据包,并显示在控制台.

*public byte[] getData();获取数据缓冲区.

*public int getLength();获取数据的实际长度.

<5>释放相应资源.

客户端:

<1>创建发送端Socket对象.DatagramSocket();

<2>创建数据,并把数据打包.DatagramPacket(byte[] buf,int

length,InetAddress address,int port);

<3>调用Socket对象的发送方法(send();)发送数据包.

<4>释放相应资源.

六、XML

1、XML,可扩展标记语言

<1>特点:*XML与操作系统、编程语言的开发平台无关.

*实现不同系统之间的数据交换.

<2>作用:*数据交互.

*配置应用程序和网站.

*Ajax基石.

2、XML文档基本结构

<1>XML声明(一般位于文档的第一句话)

<2>每个XML文档都有且只有一个根元素.

<3>每个元素如果成对出现,要一起敲出来.

<4>各元素之间如果有层级关系,注意缩进.

<5>xml注释

语法:*属性值用双引号包裹.

*一个元素可以有多个属性.

*属性值中不能直接包含<、“、&(不建议:‘、>)

XML编写【注】:

*所有XML元素都必须有结束标签

*XML标签对大小写敏感

*XML必须正确的嵌套

*同级标签以缩进对齐

*元素名称可以包含字母、数字或其他的字符

*元素名称不能以数字或者标点符号开始

*元素名称中不能含空格

3、XML中常用的转义符表

4、解析XML技术

<1>DOM

*基于XML文档树结构的解析

*适用于多次访问的XML文档

*特点:比较消耗资源

<2>SAX

*基于事件的解析

*适用于大数据量的XML文档

*特点:占用资源少,内存消耗小

<3>DOM4J

*非常优秀的Java XML API

*性能优异、功能强大

*开放源代码

5、DOM解析XML

<1>DOM解析XML文件步骤:

*创建解析器工厂对象.

DocumentBuilderFactory

factory=DocumentBuilderFactory.newInstance();

*解析器工厂对象创建解析器对象.

DocumentBuilder builder=factory.newDocumentBuilder();

*解析器对象指定XML文件创建Document对象.

Document document=builder.parse(“xxx.xml”);

*以Document对象为起点操作DOM树.

NodeList:节点集合,循环遍历集合

Node node=*.item();

Element e=(Element)node;获取元素

调用getAttribute();获取属性

调用getChildNodes();获取子节点

。。。。。。。。。。。。。。

<2>保存XML文件步骤:

*获取转换器.

TransformerFactory factory=TransformerFactory.newInstance();

Transformer transformer=factory.newTransformer();

*指定特定的转换格式.

transformer.setOutputProperty(Outputkeys.ENCODING,”GB2312”);

*源.

DOMSource source=new DOMSource(document);

*目标.

StreamResult result=new StreamResult(new FileOutputStream(path));

*转换.

Transformer.transform(source,result);

<3>为XML文件添加元素.

*创建元素.

Element element=document.createElement();

*设置元素的属性.

element.setAttribute( , );

*将添加的元素加到DOM树中.

document.getElementByTagName();

<3>修改元素.

*获取到要修改的元素.进行循环遍历.

NodeList nl=document.getElementByTagName();

*对每一个元素进行修改.

setAttribute();

<4>删除元素.

*遍历节点集合里的元素,找到要删除的元素

*用equals做判断

*通过getParentNode()方法获得父节点对象

*调用父节点的removeChild()方法删除节点

6、DOM4J解析

DOM4J的主要接口都在org.dom4j这个包里定义:

*Attribute:定义了XML的属性.

*Branch:为能够包含子节点的节点,如XML元素(Eelement)和文档(Documents)定义了一个公共的行为.

*CDATA:定义了XML CDATA元素.

*CharacterData:是一个标识接口,标识基于字符的节点,如CDATA、Comment和Text.

*Comment:定义了XML注释的行为.

*Document:定义了XML文档.

*DocumentType:定义XML DOCTYPE声明.

*Element:定义XML元素.

*ElementHandler:定义了Element对象的处理器.

*ElementPath:被ElementHandler使用,用于取得当前正在处理的路径层次信息.

*Entity:定义XML entity.

*Node:为所有的dom4j中XML节点定义了多态行为.

*NodeFilter:定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)

*ProcessingInstruction:定义XML处理指令.

*Text:定义XML文本节点.

*Visitor: 用于实现Visitor模式.

*XPath:在分析一个字符串后会提供一个XPath表达式.

【注】

具体使用DOM4J解析的案例见书本P196-201页.

相关文档
最新文档