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
*
*泛型集合中的数据不再转换为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页.