-
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
-
Set下有HashSet,LinkedHashSet,TreeSet
-
List下有ArrayList,Vector,LinkedList
-
Collection接口下还有个Queue接口,有PriorityQueue类
-
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
-
Queue, Stack, Deque
Map 接口下面的集合类
Collection 接口下面的集合类
Set
Set 保证了元素唯一,同一个元素只会出现一次。
所以 Set 可以用来去除重复元素。
HashSet
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 是按照 Hash 算法来存储集合中的元素。因此具有很好的存取和查找性能。
HashSet 具有以下特点:
-
不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
-
HashSet 线程不安全的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其线程安全。
-
集合元素值可以是 null。
HashSet检查相同的元素:
HashSet不存入重复元素的规则.使用hashcode和equals
把对象加入HashSet的时候,HashSet会使用对象的hashCode来判断对象加入的位置。同时也会与其他已经加入的对象的hashCode进行比较,如果没有相等的hashCode,HashSet就会假设对象没有重复出现。
如果元素的hashCode值相同,会继续使用equals 进行比较.如果 equals为true 那么HashSet认为新加入的对象重复了。如果equals 为false那么HashSet 认为新加入的对象没有重复.新元素可以存入.
小总结:
元素的哈希值是通过元素的hashcode方法 来获取的, HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。如果equals 为false就不是同一个元素。
元素一样, hashcode 一定一样,元素不一样,hashcode也有可能一样。
TreeSet
继承了 Set 的接口,也有Set 的特性, 同时保证了元素是有序的。
TreeSet 底层是由红黑树实现的,存取速度为 log。红黑树的性质保证了当前节点大于左节点,小于右节点。中序遍历一遍就是顺序结构了。
TreeSet 比较规则:
一、添加的元素自带比较规则
二、自定义元素的比较规则
-
如果元素是类的话, 可以在类里面写比较的规则。
-
可以写一个比较器,实现比较规则。
TreeSet 判断相同的元素:
就是在比较的时候判断元素是不是一样。由于红黑树的性质,最多比较 log 次就可以知道元素是不是存在。
比较器的使用可以看 https://km.sankuai.com/page/626813559
import java.util.*;
public class Person implements Comparable<Person>{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
Person p1 = new Person("0001", 220);
Person p2 = new Person("0002",204);
Person p3 = new Person("0003",25);
Person p4 = new Person("0004",211);
Person p5 = new Person("0005",25);
Set<Person> set = new TreeSet(new idComparator());
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
for (Person person : set) {
System.out.println(person.getName() + " " + person.getAge());
}
}
}
class idComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o2.getAge() - o1.getAge();
}
}
总结:
Map
Map 的一个元素分成两个部分,分别是 Key 和 Value。Key 是不能重复的,Value 是可以重复的。 所以Map就是保存有映射关系的数据结构。
Set 就是用了 Map 里面的 Key。
常用的方法:
1、添加:
1、V put(K key, V value) (可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,如果没有就返回null)
2、删除
1、remove() 删除关联对象,指定key对象
2、clear() 清空集合对象
3、获取
1:value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
3、判断:
1、boolean isEmpty() 长度为0返回true否则false
2、boolean containsKey(Object key) 判断集合中是否包含指定的key
3、boolean containsValue(Object value) 判断集合中是否包含指定的value
4、长度:
Int size()
HashMap
HashMap 底层用的是哈希表 + 链表。
如果HashCode 一样的话,后面就会跟一个链表。
判断key是不是存在:
同上面 HashSet 一样。
TreeMap
底层结构用的是二叉树,二叉树的遍历就可以实现排序功能。
所以元素的 Key 要有比较性质,或者写一个比较器。
import java.util.Map;
import java.util.TreeMap;
public class Demo1 {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<>();
map.put("444", "444");
map.put("222", "222");
map.put("111", "111");
map.put("999", "999");
map.put("100", "999");
for (Map.Entry<String, String> StringEntry : map.entrySet()) {
System.out.println(StringEntry.toString());
}
}
}
总结
List
List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推。
LinkedList
LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是 LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。
LinkedList 的常用方法:
addFirst()可以在列表头增加元素
addLast()可以在列表尾部增加元素
getFirst()可以获取第一个元素
removeFirst()可以删除第一个元素
removeLast()可以删除最后一个元素
getFirst() 返回此列表的第一个元素
getLast() 返回此列表的最后一个元素
ArrayList
ArrayList 类实现了可变数组的大小,存储在内的数据称为元素。它还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过向 ArrayList 中插入与删除元素的速度相对较慢。
add() 可以在数组尾部增加一个元素
get(int index) 获取 index 位置的元素
indexOf() 返回此集合中第一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
lastIndexOf() 返回此集合中最后一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
set(int index, int element) 修改index 位置元素的值
总结
-
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高 -
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
其他
队列是先进先出的。可以直接用LinkedList模拟,从队尾插入,然后从队首取出来。
栈是先进后出的。 也可以用LinkedList模拟,从队尾插入,然后从队尾取出来。
双端队列就像一个链表,队首队尾都可以插入和删除。