集合分为单列集合(collection)和双列集合(map).
单列就是每个位置只有一个值,双列则是每个位置都是一对键值对,类似于python的字典。
ArrayList的底层数据结构是数组,但不同于数组,arraylist的长度是可变的。同时由于实现的底层数据结构是数组,arraylist因此也具有数组的一些缺点:在进行增删操作时需要大批量的移动元素,非常不方便。
同时与链表数据结构的Linkedlist相比,ArrayList可以通过索引访问元素,在遍历和查找时很方便。
LinkedList顾名思义就是通过链表这种底层数据结构实现的集合,因此具备链表的一些特性:查询慢,但增删快。
LinkedList是基于双链表实现的,可以往后遍历,也可以往前。
LinkedList有一些定义好的方法:addFirst/addLast , getFirst/getLast , removeFirst/removeLast.
如上两图,由于队列和栈都是重点操作首尾元素,所以LinkedList可以用来设计这两种场景。
set元素不重复,无索引,无序。
HashSet不保证插入去除顺序:
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> s1 = new HashSet<>();
// Add a few elements
s1.add("HTML");
s1.add("CSS");
s1.add("XML");
s1.add("XML"); // Duplicate
// Create another set by copying s1
Set<String> s2 = new HashSet<>(s1);
// Add a few more elements
s2.add("Java");
s2.add("SQL");
s2.add(null); // one null is fine
s2.add(null); // Duplicate
System.out.println("s1: " + s1);
System.out.println("s1.size(): " + s1.size());
System.out.println("s2: " + s2);
System.out.println("s2.size(): " + s2.size());
}
}
但LinkedSet在插入时保证元素的顺序。
import java.util.LinkedHashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> s1 = new LinkedHashSet<>();
s1.add("A");
s1.add("B");
s1.add("C");
s1.add("D");
System.out.println("LinkedHashSet: " + s1);
}
}
HashMap
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
TreeMap
能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
Hashtable
与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
LinkedHashMap
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
Map<String, String> map = new HashMap<String, String>();
插入元素
map.put("key1", "value1");
获取元素
map.get("key1")
移除元素
map.remove("key1");
清空map
map.clear();