Java集合学习

1.集合的定义

Java的集合类属于java.util包,它是允许以各种方式将元素分组,将相同种类的元素放在一起方便进行统一操作,是一个用来存放对象的容器

1.1 集合中只能存放对象,如果存入的数据是基本数据类型的元素,会自动转换成对应的包装器类也就是基本类型对应的引用类型后再存入。

1.2 集合存放的都是对象的引用而对象本身还是放在堆内存中,而非存入对象本身,即集合中的对象就是集合中对象的引用。

1.3 集合可以存放不同引用数据类型,并且如果不设置他的大小时,是不限数量的。

2.集合的分类

2.1 集合主要分为Collection和Map两个接口。

2.2 Collection分别被List和Set接口继承。

2.3 List接口被AbstractList抽象类进行实现后被3个子类进行继承,就是我们所熟悉的ArrayList,LinkList和VectorList。

2.4 Set接口被AbstractSet抽象类进行实现后分被2个子类进行继承,就是我们所熟悉的HashSet和TreeSet。

2.5 Map接口被AbstractMap抽象类进行实现后分为2个子类进行继承,就是我们所熟悉的HashMap和TreeMap。Map接口还有个特殊的实现是直接被Hashtable类实现。

2.6 由于Collection和Map接口间接的都继承了Interator接口,而Iterator是一个用来遍历集合中元素的接口,主要有hashNext(),next(),remove()三种方法,因此Iterator接口作为迭代器经常用于遍历Collection接口和Map接口下的实现类的集合元素,子接口ListIterator继承了Iterator接口又添加了三种方法分别是add(),previous()和hasPrevious()方法。

3.底层数据结构

3.1 List 中Arraylist是Object[]数组,Vector是Object[]数组,LinkedList是双向链表。

3.2 set 中HashSet是无序的并且不允许重复,底层采用HashMap类来进行保存元素,因此HashSet是基于HashMap进行实现的;LinkedHashSet:其内部是通过 LinkedHashMap 来实现的,TreeSet是有序的并且不允许重复,是自平衡的排序二叉树即红黑树。

3.3 Map 中HashMap在 JDK1.8之前由数组和链表组成,其中数组是HashMap的主体,而链表则是主要为了通过“拉链法”解决哈希冲突,而JDK1.8以后在解决哈希冲突时有了较大变化,当链表长度大于阈值(默认是 8),是将链表转换成红黑树前进行判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容而不是转换为红黑树以减少搜索时间;LinkedHashMap是继承自HashMap类,底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成的,并且增加了一条双向链表使得结构可以保持键值对的插入顺序并且通过对链表进行相应的操作实现了访问顺序的相关逻辑;TreeMap是红黑树结构,可以进行Comparator排序。

4.集合的遍历

4.1 List遍历可以通过Interator迭代器遍历或者通过for循环或者增强for循环进行遍历

 List<String> list = new ArrayList<String>();
 list.add("aaa");
 list.add("bbb");
 list.add("ccc");
 Iterator it = list.iterator();
 while (it.hasNext()){
     Object obj = it.next();
     System.out.println(obj);
  }
 List<String> list = new ArrayList<String>();
 list.add("aaa");
 list.add("bbb");
 list.add("ccc");
 for(String str : list){
     System.out.println(str);
 }

4.2 Map遍历

4.2.1 通过获取key的集合,再遍历key的集合,通过key找value

HashMap<String, String> map = new HashMap<String, String>();
map.put("01", "aaa");
map.put("02", "bbb");
 map.put("03", "ccc");
 Set<String> keys = map.keySet();
keys.forEach(item -> {
     System.out.printf("map中key为 %s 的值为 %s \n",item,map.get(item));
});

4.2.2 通过entrySet()方法获取Set<Map.Entry<K,V>的集合,通过for循环再获取key和value的值

map.entrySet().forEach(item ->{
      System.out.printf("map中key为 %s 的值为 %s \n",item.getKey(),item.getValue());
});

4.2.3 通过通过Interator迭代器获取key和value的值

Iterator<Map.Entry<String, String>> ite  = map.entrySet().iterator();
while (ite.hasNext()){
      Map.Entry<String,String> entry = ite.next();
      System.out.printf("map中key为 %s 的值为 %s \n",entry.getKey(),entry.getValue());
}

(完)