容器(集合框架) - 承载其他对象的对象
泛型(generic) - 让类型不在是程序中的硬代码(hard code)
此处的extends不是继承而是泛型限定 限定T类型必须是Comparable接口的子类型
public static <T extends Comparable<T>>void bubbleSort1(T[] array)
GoF设计模式 - 策略模式(用一个继承结构封装可变的打折策略)
Collection
List
ArrayList
LinkedList
-
Set
- HashSet
- TreeSet
Map
HasMap
TreeMap
public class Test01 {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1, "apple");
map.put(2, "grape");
map.put(100, "shit");
map.put(1, "banana");
map.remove(100);
System.out.println(map.size());
for (Integer key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
}
}
去重、排序
- 要使用TreeSet ,那么对象必须是可比较的 ,因为TreeSet底层是一棵排序树
- 可以通过实现Comparable接口并重写compareTo方法来实现比较的功能
从Java5开始容器可以指定泛型参数来限定容器中对象引用的类型带泛型参数的容器比不带泛型参数的容器在使用上更方便
从Java7开始构造器后面的泛型参数可以省略 - 钻石语法
List两个实现版本的比较
ArrayList - 底层实现是一个数组 使用连续内存 可以实现随机存取
LinkedList - 底层实现是一个双向循环链表 可以使用碎片内存 不能随机存取,
但是增删元素是需要修改引用即可 所以增删元素时有更好的性能容器中只能放对象的引用不能放基本数据类型
所以向容器中添加基本数据类型时会自动装箱(anto-boxing)
所谓自动装箱就是将基本数据类型处理成对应的包装类型
基本类型 包装类型(Wrapper class)
byte ---> Byte ---> new Byte(1)
short ---> Short
int ---> Integer
long ---> Long
float ---> Float
double ---> Double
char ---> Character
boolean ---> Boolean
从Java8开始可以给容器发送forEach消息对原色进行操作
forEach方法的参数可以使方法引用也可以使Lambda表达式
方法引用
list.forEach(System.out::println);
Lambda表达式
list.forEach(e -> {
System.out.println(e.toUpperCase());
});
创建匿名内部类的对象给窗口或者窗口上的控件注册事件监听器有三种做法:
- 1.创建匿名内部类的对象(就地实例化)
- 2.创建一个内部类对象来充当监听器(因为有名字随时都可以创建对象)
- 3.让窗口实现接口用窗口对象充当监听器
从Java8开始,对于单方法接口(函数式接口)可以使用Lambda表达式
写一个匿名方法来编写事件回调代码
写一个工具类的要点:
- 所有的方法都应该是静态方法
- 将构造器私有 不允许调用构造器创建对象
- 工具类一般不会被继承所以通常是final的
哈希存储只要能设计出一个好的哈希函数就是存取性能都特别好的存储方案
好的哈希函数应该是:不同的对象尽可能产生不同的哈希码
哈希存储或者哈希函数 有的地方也称之为散列存储或者散列函数
-
如果要使用HashSet那么一定重写两个方法:
- hashcode() ---> 让相同的对象产生相同的哈希码,让不同的对象尽可能产生不同的哈希码
- equals() ---> 定义比较两个对象的规则(引用,类型,属性)
- 自反性
- 对称性
- 传递性
- 一致性
StringBuffer 和 StringBuilder代表可变字符串
对字符串做修改时不会创建新的字符串
StringBuffer是线程安全的 - 多个线程可以操作同一个StringBuffer对象
StringBuilder是线程不安全的 - 多个线程同时操作一个StringBuilder时会发生错误
StringBuilder是Java5引入的可变字符串类型,它拥有更好的性能如果要频繁的修改一个字符串请不要使用String因为每次修改都有可能创建一个新的字符串对象 所以在这种场景下应该使用StringBuilder或者StringBuffer
正则表达式 - regular expression
定义字符串的匹配模式
"\w"字母数字下划线 "\d"0-9的数字 "\s"任意空白符
"*"0个或多个 "+"一个或多个 "?"零次或一次