集合
这里要说的集合主要有三种:List集合、Set集合以及Map集合
一、List集合:
List集合继承collection类,其实现类有:ArrayList:异步;非线程安全;随机访问效率高。
LinkedList:异步;非线程安全;随机插入、删除效率高。
vector:同步;线程安全。(除非需要考虑线程安全问题,不然一般用ArrayList)
1.ArrayList:
最常用的集合之一,是一个数组队列,相当于动态数组,由数组实现,因此它的随机访问效率较高。
示列:List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
遍历方式:
推荐使用foreach进行遍历;
for(String string : list){
System.out.println(string);
}
2.LinkedList:
它是一个双向链表;可以被用做堆栈(stack)、队列(queue)、或双端队列(deque);
堆栈:
元素先进后出;
示列:
Deque<String> deque = new LinkedList<>();
deque.push("1");
deque.push("2");
deque.push("3");
deque.push("4");
for (String string : deque) {
System.out.println(string);
}
队列:
示列:
Queue<String> queue = new LinkedList<>();
queue.add("1");
queue.add("2");
queue.add("3");
queue.add("4");
for (String string : queue) {
System.out.println(string);
}
双端队列:
可以分别从集合首部或尾部加入元素;
示列:
Deque<String> deques=new LinkedList<>();
deques.addFirst("3");
deques.addLast("4");
deques.addFirst("2");
deques.addFirst("1");
for (String string : deques) {
System.out.println(string);
}
3.vector:
它除了线程是安全的以外其它基本与ArrayList相同;同时,还有一个子类为Stack。
示列:
List<String> vector=new Vector<>();
vector.add("1");
vector.add("2");
vector.add("3");
vector.add("4");
for (String string : vector) {
System.out.println(string);
}
4.Stack:
它与deque类似(虽然说是先进后出,但我用foreach遍历完全没看出,用pop一个个取值到是可以看出来;比较凌乱,不过不常用,用了也不会错,有缘再去了解,hhh),不过是线程安全的;它有两个重要的方法:peek(查询首元素但不删除)、pop(查询首元素并删除)。
示列:
Stack<String> stack=new Stack<>();
stack.push("1");
stack.push("2");
stack.push("3");
stack.push("4");
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack.peek());
最后打印出来的值为:4
4
3
二、Set集合:
Set同样继承了collection类,是非线程安全的,它的主要特性便是元素的唯一性;其实现类有:HashSet、LinkedHashSet、TreeSet。
1.HashSet:
HashSet是抽象类AbstractSet的子类,实现了Set接口,使用哈希方法储值,具有最好的性能,但它的元素是无序的;
示列:
Set<String> set=new HashSet<>();
set.add("d");
set.add("c");
set.add("b");
set.add("靖");
set.add("边");
set.add("安达");
for (String string : set) {
System.out.print(string+"==");
System.out.println(string.hashCode());
}
2.LinkedHashSet:
它继承了HashSet,实现了Set接口,但它是有序的。
示列:
LinkedHashSet<String> lhset=new LinkedHashSet<>();
lhset.add("a");
lhset.add("d");
lhset.add("c");
lhset.add("b");
lhset.add("靖");
lhset.add("边");
lhset.add("安达");
for (String string : lhset) {
System.out.print(string+"==");
System.out.println(string.hashCode());
}
3.TreeSet:
HashSet的性能总比TreeSet好,继承AbstractSet,实现了SortedSet接口,不可放null值,使用自然顺序对元素进行排序;
具体规则:当放数字时,按第一个数字从小到大排序,如果一样则继续排第二个,无值则优先前排,以此类推;
当放字母时,按第一个字母字母表顺序排序,如果一样则继续排第二个,无值则优先前排,以此类推;
当放汉字时,按其哈希值数字顺序从小到大排序,其规则与数字排序一样;
当混合值时,按数字先于字母先于汉字排序,其它基本与上一致。
示列:
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("大");
treeSet.add("ge");
treeSet.add("geg");
treeSet.add("小");
treeSet.add("多");
treeSet.add("少");
treeSet.add("9344");
treeSet.add("4999999922");
for (String string : treeSet) {
System.out.print(string+"==");
System.out.println(string.hashCode());
}
三、Map集合:
Map没有继承collection类,提供了从key到value的映射,key的值不能重复,所以它的key类似于一个Set,value类似于一个List;Map的实现类有:HashMap、TreeMap、Hashtable、LinkedHashMap、Properties。
1.HashMap:
实现map接口,元素是无序的,并且是非线程安全。
示列:
Map<Object, Object> map = new HashMap<>();
map.put("z", "4");
map.put("d", "zz");
map.put("9", "zz");
map.put("4", "艾斯");
map.put("阿道夫", "value");
for (Object string : map.keySet()) {
System.out.println("map的key为" + string + "--value为" + map.get(string));
}
2.TreeMap:
它的元素是根据键(key)按自然顺序排序的,具体方法与TreeSet相同,但键不可为null,并且是非线程安全的。
示列:
TreeMap<Object, Object> tm = new TreeMap<>();
tm.put("d", "班2");
tm.put("1", "班1");
tm.put("e", "班");
tm.put("和", "高");
tm.put("i", "周");
for (Object string : tm.keySet()) {
System.out.println("tm的key为" + string + "--value为" + tm.get(string));
}
3.Hashtable:
它是无序的,还是线程安全的,但它的键(key)和值(value)都不可以为null。
示列:
Hashtable<Object, Object> ht = new Hashtable<>();
ht.put("a", "a");
ht.put("c", "c");
ht.put("b", "b");
ht.put("", "");
ht.put(" ", " ");
for (Object string : ht.keySet()) {
System.out.println("ht的key为" + string + "--value为" + ht.get(string));
}
4.LinkedHashMap:
有序的,线程不安全的。
示列:
LinkedHashMap<String, String> lhm = new LinkedHashMap<>();
lhm.put("a", "a");
lhm.put("b", "b");
lhm.put("", "");
lhm.put(" ", " ");
lhm.put(null, null);
for (Object string : lhm.keySet()) {
System.out.println("lhm的key为" + string + "--value为" + lhm.get(string));
}