文章目录
- 1. 异常
- 异常的分类
- 自定义异常
- 异常的处理
- 资源关闭:try-with-resource
- 2. 泛型
- 泛型类
- 泛型接口
- 泛型方法、通配符、上下限
- 通配符
- 泛型的上下限
- 泛型支持的类型
- 3. 包装类
- 4. Collection集合和Map集合
- 4.1 Collection集合
- Collection集合特点
- Collection的遍历方式一:迭代器遍历
- Collection的遍历方式二:增强for循环
- Collection集合的遍历方式三:Lambda表达式
- 解决并发修改异常问题的方案
- 4.2 List集合
- 4.2.1 ArrayList的底层原理
- 4.2.2 LinkedList的底层原理
- 4.3 Set集合
- 4.3.1 HashSet集合的底层原理
- 4.3.2 LinkedHashSet集合的底层原理
- 4.3.3 TreeSet集合的底层原理
- 4.4 Collection集合总结
- 5. Map集合
- 5.1 HashMap集合的底层原理
- 5.2 LinkedHashMap集合的原理
- 5.3 TreeMap集合的原理
- 6. File、字符集和IO流
- 6.1 File
- 6.2 字符集
- 标准ASCII字符集
- GBK(汉字内码扩展规范,国标)
- Unicode字符集(统一码,也叫万国码)
- UTF-8
- 总结
- 编码、解码
- 6.3 IO流
- IO流的分类
- 缓冲流
- 字符输入转换流
- 打印流
- 特殊数据流
- 6.4 IO框架
- Commons-io框架(commons-io-2.6.jar)
1. 异常
异常的分类
自定义异常
异常的处理
两种处理方式:
资源关闭:try-with-resource
JDK 7开始提供了更简单的资源释放方案:try-with-resource。
try (定义资源1;定义资源2;…){可能出现异常的代码;
} catch (异常类名 变量名){异常的处理代码;
}
该资源使用完毕后,会自动调用其 close() 方法,完成对资源的释放!
2. 泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:E、T、K、V)称为泛型类、泛型接口,泛型方法、它们统称为泛型。
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
泛型类
##形如:
修饰符 class 类名<类型变量,类型变量,…> {
}##例如:
public class ArrayList<E>{. . .
}
泛型接口
##形如:
修饰符 interface 接口名<类型变量,类型变量,…> {
}##例如:
public interface A<E>{. . .
}
泛型方法、通配符、上下限
##形如:
修饰符 <类型变量,类型变量,…> 返回值类型 方法名(形参列表) {
}##例如:
public static <T> void test(T t){. . .
}
通配符
就是 “?” ,可以在“使用泛型”的时候代表一切类型; E T K V 是在定义泛型的时候使用。
泛型的上下限
- 泛型上限(? extends Car)? 能接收的必须是Car或者其子类。
- 泛型下限(? super Car)? 能接收的必须是Car或者其父类。
泛型支持的类型
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
3. 包装类
自动装箱:基本数据类型可以自动转换为包装类型。
自动拆箱:包装类型可以自动转换为基本数据类型。
4. Collection集合和Map集合
Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。
4.1 Collection集合
Collection集合特点
Collection的遍历方式一:迭代器遍历
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
Iterator<String> it = lists.iterator();
while(it.hasNext()){String ele = it.next();System.out.println(ele);
}
Collection的遍历方式二:增强for循环
增强 for 可以用来遍历集合或者数组。
增强 for 遍历集合,本质就是迭代器遍历集合的简化写法。
Collection<String> c = new ArrayList<>();
for(String s : c) {System.out.println(s);
}
Collection集合的遍历方式三:Lambda表达式
得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。
lists.forEach(s -> {System.out.println(s);
});
##
lists.forEach(s -> System.out.println(s));
解决并发修改异常问题的方案
4.2 List集合
4.2.1 ArrayList的底层原理
4.2.2 LinkedList的底层原理
LinkedList底层是基于链表存储数据的。
链表中的数据是一个一个独立的结点组成的,结点在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
链表的特点:
- 特点1:查询慢,无论查询哪个数据都要从头开始找。
- 特点2:链表增删相对快。
- 特点3:基于双链表实现的。(对首尾元素进行增删改查的速度是极快的)
LinkedList的应用场景之一:可以用来设计队列
// 目标:用LinkedList做一个队列对象。
LinkedList<String> queue = new LinkedList<>();
// 入队
queue.addLast("赵敏");
queue.addLast("西门吹雪");
queue.addLast("陆小凤");
queue.addLast("石观音");
System.out.println(queue); // [赵敏, 西门吹雪, 陆小凤, 石观音]// 出队
System.out.println(queue.removeFirst());
System.out.println(queue.removeFirst());
System.out.println(queue);
LinkedList的应用场景之二:可以用来设计栈
// 做一个栈
LinkedList<String> stack = new LinkedList<>();
// 压栈
stack.push("第1颗子弹");
stack.push("第2颗子弹");
stack.push("第3颗子弹");
stack.push("第4颗子弹");
System.out.println(stack); // [第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]// 出栈
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack);
4.3 Set集合
Set集合特点:
4.3.1 HashSet集合的底层原理
HashSet基于哈希表存储数据的。
4.3.2 LinkedHashSet集合的底层原理
4.3.3 TreeSet集合的底层原理
4.4 Collection集合总结
5. Map集合
Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。
常用方法
5.1 HashMap集合的底层原理
HashMap用的最多,HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。
5.2 LinkedHashMap集合的原理
5.3 TreeMap集合的原理
6. File、字符集和IO流
File是java.io.包下的类, File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹),不能读写文件里面存储的数据。
IO流用于读写数据的(可以读写文件,或网络中的数据…)。
6.1 File
File提供的判断文件类型、获取文件信息功能
File提供的创建和删除文件的方法
File提供的遍历文件夹的方法
6.2 字符集
标准ASCII字符集
GBK(汉字内码扩展规范,国标)
Unicode字符集(统一码,也叫万国码)
UTF-8
总结
注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。
注意2:英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。
编码、解码
6.3 IO流
IO流的分类
缓冲流
BufferedInputStream缓冲字节输入流、BufferedOutputStream缓冲字节输出流
BufferedReader缓冲字符输入流
BufferedWriter缓冲字符输出流
字符输入转换流
打印流
特殊数据流
DataOutputStream(数据输出流)
DataInputStream(数据输入流)
6.4 IO框架
封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。