Java常用容器的使用
常用容器就那几个
大概包括
- List 的子类
ArraryList和LinkedList
- Map的子类
HashMap,TreeMap,LinkedHashMap 再加一个ConcurrentHashMap(并发安全)
- Set的子类
HashSet,TreeSet
- Queue及子类(除了并发其他地方用的较少)
说了这么多 这些容器为什么被广泛使用,第一点肯定是数据结构的原因。
从数据结构来看
ArrayList 就是类线性表(广义),LinkedList就是链表。
Map就是键值对。
Set是无序的不含重复元素的集合。
Queue 队列
那么为什么没有Stack 栈呢?
答案是有栈的,在早期版本上有基于Vector的Stack ,了解这个的就知道
创造者为了简单,直接继承的Vector基于数组的Stack ,对于栈来说频繁的插入删除操作对于数组来说无疑是一种灾祸,而且含有中间插入的方法,与数据结构本身不符。
所以不建议使用 Stack 及 Vector
对于栈来说,LinedList已经完全可以满足栈的所有需求。LinkedList也可以完全替代掉Queue。
偷一张图 还是很清楚的
容器的打印
容器打印默认会调用toString() 方法。 如果需要可以重写,不过不建议直接重写,要用适配器模式 重写。
很简单
public class Test {
public static void main(String[] args){
Random random = new Random(11);
List<Integer> list = new ArrayList<>();
Map<Integer,Integer> map = new TreeMap<>();
Set<Integer> set = new LinkedHashSet<>();
for(int i=0;i<5;i++){
list.add(random.nextInt(10));
map.put(i,random.nextInt(10));
set.add(random.nextInt(10));
}
System.out.println(list.toString());
System.out.println(map);
System.out.println(set);
}
}
结果:
[8, 5, 0, 7, 7]
{0=8, 1=3, 2=3, 3=4, 4=9}
[1, 7, 3, 4, 2]
容器的添加和删除
对于Collection 接口下的类
boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
Map
void putAll(Map<? extends K, ? extends V> m);
void clear();
V put(K key, V value);
default boolean remove(Object key, Object value) ;
容器的迭代或遍历
1. 迭代器Iterator遍历
对于Collection容器只需要调用iterator() 方法。获得iterator对象即可。
对于Map对象 只有用entry对象才有iterator方法
public static void main(String[] args){
Random random = new Random(11);
List<Integer> list = new ArrayList<>();
Map<Integer,Integer> map = new TreeMap<>();
Set<Integer> set = new LinkedHashSet<>();
for(int i = 0;i < 5;i++){
list.add(random.nextInt(10));
map.put(i,random.nextInt(10));
set.add(random.nextInt(10));
}
// 获取迭代器对象
Iterator<Integer> iterator1 = list.iterator();
Iterator<Integer> iterator2 = set.iterator();
Iterator<Map.Entry<Integer,Integer>> iterator3= map.entrySet().iterator();
while (iterator1.hasNext()){
System.out.print(iterator1.next()+" ");
}
System.out.println();
while (iterator2.hasNext()){
System.out.print(iterator2.next()+" ");
}
System.out.println();
while (iterator3.hasNext()){
Map.Entry entry = iterator3.next();
System.out.print(entry.getKey()+":"+entry.getValue()+" ");
}
System.out.println();
}
8 5 0 7 7
1 7 3 4 2
0:8 1:3 2:3 3:4 4:9
2. 实现Iterable接口 可以用for each 来遍历
public static void main(String[] args){
Random random = new Random(11);
List<Integer> list = new ArrayList<>();
Map<Integer,Integer> map = new TreeMap<>();
Set<Integer> set = new LinkedHashSet<>();
for(int i=0;i<5;i++){
list.add(random.nextInt(10));
map.put(i,random.nextInt(10));
set.add(random.nextInt(10));
}
for(Integer num: list){
System.out.print(num+" ");
}
System.out.println();
for(Integer num: set){
System.out.print(num+" ");
}
System.out.println();
for(Map.Entry entry :map.entrySet()){
System.out.print(entry.getKey()+":"+entry.getValue()+" ");
}
System.out.println();
}
8 5 0 7 7
1 7 3 4 2
0:8 1:3 2:3 3:4 4:9