Java高级
一、集合框架和泛型
1.集合框架
1) 定义:JAVA API的一部分,用于处理一组长度可变得数据。
2) 和数组的区别:
数组的长度不可变,但是集合框架处理的数据长度可以动态变化。
3) 结构:
接口:Collection、List、Set、Map、Iterator
类:ArrayList、LinkedList、HashSet、HashMap、Collections
4) 特点:
n List:存储有序、不唯一的元素。
² ArrayList:以数组的形式实现;遍历和查找元素很快;
² LinkedList:以链表的方式实现;添加和删除元素时很快;
n Set:存储无序、唯一的元素。
n Map:以键值对的形式存储数据。
6) ArrayList和LinkedList的区别
ArrayList:查找元素速度快,性能高;但是不适合频繁的对集合元素进行插入、修改、删除。
LinkedList:在频繁对集合元素进行插入、修改、删除时效率高,速度快;但是查找速度不如ArrayList。
7) 常用的方法:
n Collection接口
add()、remove()、iterator()、size()、clear()、contains()、isEmpty()
n ArrayList类
get()
n LinkedList类
addFirst()、addLast()、removeFirst()、removeLast()、getFirst()、getLast()
n HashSet类
Add()、remove()、clear()、没有get方法
n HashMap类
put(key, value)、remove(key)、get(key)、keySet()、containsKey()、containsValue()
n Iterator接口(迭代器)
hasNext()、next()
8) 注意:
上述类在处理数据时,均是以Object类型进行处理的。这样就需要频繁的数据类型转换(向上转型、向下转型)。同时,所有的数据类型均直接或间接继承自Object,所以任何类型的数据均可以添加到集合中,这样就很容易出现错误,不安全。
2.泛型
定义:
层次结构:
集合框架中所有的接口和类均提供了对应的泛型类型(泛型接口、泛型类)。
List<Student> list = new ArrayList<Student>();
只能向list中添加Student类型的数据,不能添加其他类型的数据。
泛型集合在添加和遍历元素时,不需要频繁的进行类型转换。
二、包装类和实用类
1.枚举
定义 : 一组固定的常量。
语法
访问修饰符 enum 枚举名{ 常量一, 常量二, … … } |
用法
声明枚举变量并赋值:Season season = Season.Spring;
switch:
switch(枚举变量){ 常量一: … … Break; 常量二: … … Break; } switch(season){ case Spring: ... break; case Summer: ... break; case Autumn: ... break; case Winter: ... break; } |
2.包装类
1) 定义:
所有的基本数据类型,均提供了对应的引用类型。
n 整形:byte -> Byte、short -> Short、int -> Integer、long -> Long
n 浮点型:float -> Float、double -> Double
n 字符型:char -> Character
n 布尔型:boolean -> Boolean
n Byte、Short、Integer、Long、Float、Double均继承自:Number类。
2) 装箱和拆箱
n 装箱:将基本数据类型转换为引用数据类型。
Integer a = new Integer(5);
n 拆箱:将引用数据类型转换为基本数据类型。
int a = new Integer(“5”);
3) 相互转换
n 基本类型转引用类型
Integer a = new Integer(“123”);
Integer b = new Integer(123);
Double c = new Double(“12.5”);
Double d = new Double(12.5);
Boolean e = new Boolean(“true”);
Boolean f = new Boolean(true);
n 引用类型转基本类型
int a = new Integer(“123”);
int b = new Integer(“123”).valueOf();
n 将字符串转换为基本数据类型
int a = Integer.parseInt(“123”);
double b = Double.parseDouble(“12.5”);
short c = Short.parseShort(“12”);
3.实用类
1) Random类
用于生成随机数字,所有生成的数字,都是等概率的。
n nextInt():生成的值介于int的所有取值范围(-231 ~ 231-1)
n nextInt(int value):生成的值介于0 ~ value之间的值(包含0,不包含value)。
2) Math类
用于常规的数学运算。
n random():生成介于0-1之间的随机小数(包括0,不包括1)。
n abs(double):取绝对值。
n pow(double, double):计算m的n次方
n sqrt(double):计算m的开方。
n floor(double):获取比m小的最大整数值。
n ceil(double):获取比m大的最小整数值。
n round():四舍五入取整。
3) String类
n indexOf():获取一个字符串在另一个字符串中的索引位置(一个字符串是否包含另一个字符串)。
n lastIndexOf():获取一个字符串在另一个字符串中的最后一次索引位置。
n substring():从一个字符串的指定位置取子串。
n concat():将两个字符串拼接成一个字符串。
n equals():比较两个字符串的内容是否相同(注意和==的区别)。
n toLowerCase():将字符串转换为小写字符。
n toUpperCase():将字符串转换为大写字符。
n equalsIgnoreCase():比较两个字符串是否相同(不区分大小写)。
4) StringBuilder和StringBuffer类
当需要对字符串进行频繁的拼接操作时,需要使用StringBuilder或者StringBuffer。
5) Date类和SimpleDateFormat类
Date类用于处理日期对象;SimpleDateFormat用于对日期进行格式化操作。
注意:Date类中提供的很多方法,都是过时方法,推荐使用Calendar类提供的方法。
不论是通过Date还是通过Calender,获取月份时,都是介于0-11之间。
//获取系统当前时间 Date date = new Date(); //格式化时间 yyyy-MM-dd HH:mm:ss SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); String text = dateFormat.format(date); //知道一个日期字符串,如果将其转换为时间对象 String time = “2016-10-05 12:10:05”; Date date2 = dateFormat.parse(time); |
6) Calendar类
//创建Calendar类对象 Calender cal = Calendar.getInstance(); //获取年份 Int year = cal.get(Calendar.YEAR); //获取月份 Int month = cal.get(Calendar.MONTH); //Calendar.Date、Calendar.HOUR、Calendar.MINITE、Calendar.SECOND //添加时间段(年、月、日、时、分、秒) Cal.add(Calender.YEAR, 1);//加1年 cal.add(Calender.Hour, -2);//减2小时 //Calcender转换为Date Date date = cal.getTime(); |
三、输入/输出(I/O)
IO操作相关的包:java.io
1.File类
功能:实现对文件和目录的常规操作。
方法名 | 作用 |
exits() | 判断文件或目录是否存在 |
Delete() | 删除文件或目录 |
mkDir() | 创建目录 |
list() | 获取子目录和文件 |
2.流的分类
² 根据方向分类:
输入:InputStream、Reader
输出:OutputStream、Writer
² 根据流操作的数据单位分类:
字节流:InputStream、OutputStream
字符流:Reader、Writer
² 实现类
(抽)InputStream | (抽)OutputStream | (抽)Reader | (抽)Writer |
FileInputStream | FileOutputStream | InputStreamReader | OutputStreamWriter |
DataInputStream | DataOutputStream | FileReader | FileWriter |
ObjectInputStream | ObjectOutputStream | BufferedReader | BufferedWriter |
3.序列化和反序列化
序列化是指将内存中对象的状态转换为可以存储或传输的格式的过程。
四、多线程
1.进程和线程的区别
n 计算机中一个正在运行的可执行程序的实例就是进程。一个进程可以包含多个线程。单个线程用于完成一个任务,而同时创建多个线程来完成多项任务,便是多线程。
n 二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。
n 用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。
2.Java中定义线程的2种方式
n 继承Thread类
n 实现runnable接口
3.线程的优先级
4.线程的生命周期
5.线程的同步
6.线程常用方法
五、网络编程
1.什么是TCP和UDP,他们的差异是什么?
n TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接(信任连接)。
n UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
n UDP适用于一次传送少量数据、对可靠性要求不高的应用环境,但是传输速度快。
n TCP适用于一次传送大量数据、对可靠性要求较高的环境,数据传输速度慢。
六、XML操作
1.XML基本概念
XML即可扩展标记语言。一般用来存储数据和在网络间传输数据。
XML很像超文本标记语言(HTML);但它又未规定固有的标记有哪些。
XML使用规范大致包括:
n 每个XML文件的第一行为XML声明,定义了XML版本和编码等信息。
n 一个XML文档有且仅有一个根节点。
n XML对大小写敏感,区分大小写。
n 每个XML标记必须包含开始标记和结束标记。
n XML的标记必须正确的嵌套。
2.XML 与 HTML 的主要区别
n XML用于存储和传输数据,而HTML则用于显示数据。
n XML区分大小写字母,而HTML不区分。
n HTML的开始标记可以没有对应的结束标记,而XML的开始标记必须要有结束标记相对应。
n 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
n 在HTML中可以有不带值的属性名。但是在XML中,所有的属性都必须带有相应的值。
n XML中的标记可由用户自定义,而HTML则约定了可以使用哪些标记。
3.JAVA中操作XML有哪些技术
n DOM方式
DOM 是 W3C 处理 XML 的标准 API,它是许多其它与 XML 处理相关的标准的基础。它根据XML文档中节点间的关系进行操作,最大的问题就是需要将整个XML文档一次性加载到内存中。
n SAX
SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。
n Dom4j
Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用Java集合框架实现,并完全支持DOM,SAX和JAXP。
4.什么是xpath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
表达式 | 说明 | 示例 |
nodename | 选取此节点的所有子节点 | bookstore() |
/ | 从根节点选取 | /bookstore(选取根元素bookstore) |
// | 从匹配的当前节点选择节点,不考虑位置 | //book选取所有book子元素,不管其位置 |
. | 选取当前节点 |
|
.. | 选取当前节点的父节点 |
|
@ | 选取属性 | //@lang选取名为lang的所有属性 |