1 LinkedList集合类
LinkedList集合类底层是使用双向链表实现的,相较于ArrayList,更方便进行增删操作。
在增删查改方面,新增了头尾操作,比如从头部插入、尾部插入、头部删除、尾部删除、头部查询和尾部查询等操作。由于有头尾的引用地址,链表对于头尾进行操作效率很高。
节点Node的代码:
private static class Node<E>{
E item; //数据元素
Node<E> next;
Node<E> prev;
//构造器
Node(E item, Node<E> next, Node<E> prev){
this.item = item;
this.next = next;
this.prev = prev;
}
}
源码分析
add(int index): 需要先查找对应node的位置
remove(int index):同样需要循环查找位置
但是在头尾进行增删查改没有循环,时间复杂度是常量级的,效率很高。
队列和栈
队列:先进先出,应用:消息队列
栈: 后进先出, 应用:jvm方法栈
栈和队列图形化网址:http://www.rmboot.com
可以使用链表来实现栈和队列。
2. HashSet集合类
该集合类的主要作用是去除重复元素。要实现该效果,需要元素对象类的equals和hashCode方法。
2.1 使用
- 新建HashSet对象
Set<Student> set = new HashSet<>();
- 重写学生对象的equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
- 遍历所有元素
for (Student student : hashSet) {
System.out.println(student);
}
HashSet集合判断两个元素相等的标准:
- 先通过hashCode来比较;
- 再通过equals来比较是否相等
3. LinkedHashSet子类
HashSet的子类,底层是哈希表+双向链表实现的。元素特点为:
- 元素唯一,有序。
- 物理上先按照哈希表存储,然后使用链表来记录元素的顺序。
- 由于需要维护链表,性能上略低于HashSet。
4. TreeSet类
Set抽象类的子类,底层是红黑树实现的,是一棵相对平衡的二叉搜索树。TreeSet会对元素进行排序,故集合内的对象必须实现Comparable接口或者在创建集合时传入一个comparator比较器。否者会报出classCastException, 因为集合默认存放的元素可以比较。
特点为:
- 元素唯一,无序,但是实现了排序,遍历打印时已经排序好了。
Set<Integer> set = new TreeSet<Integer>();
set.add(3);
set.add(2);
set.add(4);
//遍历
for(Integer i : set){
System.out.println(i);//2 3 4
}
注意在对自定义类实现Comparable接口时,可以使用泛型来指明CompareTo方法参数中的类型。
元素排序原理:要求元素必须可以比较大小。
- 集合元素实现Comparable接口
- 创建集合时传入Comparator比较器
5. Map顶层接口初步认识
map<key, value>, 其中key不可以重复, value可以是重复。key只能指向一个value。
分类:LinkedMap、 TreeMap、HashMap
常用方法:
- 创建
//创建map
Map<String, String> map = new HashMap<>();
- 添加元素
//如果添加时覆盖了其他元素,返回被覆盖的值
//没有覆盖时,返回null
value = map.put(key, value);
- 删除元素
map.clear();//清空集合
value = map.remove(key);//通过key来删除元素,返回的是value
- 查询元素
String value = map.get(key);//根据key返回对应的value
map.containsKey(key);//是否包含该关键字
map.containsValue(value);
map.isEmpty();//判断是否为空
map.keySet();//返回所有的Key
map.values();//获取所有的values
map.entrySet();//获取所有的键值对
//通过key来获取对应的值,如果没有对应的key,就设置默认值
map.getOrDefault(Object key, V defaultValue);