×

Java日记:集合

我的笔记 我的笔记 发表于2018-11-12 14:56:20 浏览2399 评论0

抢沙发发表评论

1. 总体结构

Java的集合类主要由:Collection和Map两个根接口派生而来。总体结构分别如下:

  • Collection接口

      

  • Map接口

       

2. Collection和Iterator接口

  • 包含了通用的集合编辑方法:add,remove,addAll,removeAll,iterator, retainAll,size等;
 1         Collection collection=new ArrayList();
 2         collection.add("element 1");
 3         collection.add("element 2");
 4         // 使用Lambda表达式遍历集合
 5         collection.forEach(obj->System.out.println(obj.toString()));
 6         // Iterator遍历集合
 7         Iterator iterator=collection.iterator();
 8         while(iterator.hasNext()) {
 9             System.out.println(iterator.next().toString());
10         }
11         // Lambda表达式遍历iterator
12         iterator.forEachRemaining(obj->System.out.println(obj.toString()));
13         // foreach循环遍历集合元素
14         for(Object obj:collection) {
15             System.out.println(obj.toString());
16         }
17         
18         // Predicate操作集合,是函数式接口
19         collection.removeIf(obj->obj.toString().length()>10);
20         // Stream操作集合
21         IntStream intStream = IntStream.builder().add(20).add(10).build();
22         System.out.println(intStream.max());        

3. Set集合

  • 原则:不允许包含重复的元素。
  • HashSet:通过hashCode()决定存储位置,需要确保元素hashCode相同时equals方法也返回true。
  • LinkedHashSet:HashSet基础上增加了链表,具有较好的插入性能;
  • TreeSet:通过红黑树对元素排序,需要确保元素CompareTo和equals方法结果一致。可自行定义比较方式;
  • EnumSet:位向量格式存储,高效,元素按照枚举定义顺序排序,但是只能存储枚举值;

4. List集合

  • 是有序集合,实现List接口和ListIterator接口;
  • ArrayList:基于数组实现的List,初始容量为10个,线程不安全;
  • Vector:基于数组实现的List,线程安全,已过期,不建议使用;
  • Stack:栈,Vector子类,peek,pop,push三个基本方法构成,不就建议使用;
  • 固定长度的List:其实是Arrays.ArrayList类的对象,是固定长度的,不可修改;

5. Queue集合

  • 队列原则:先进先出
  • PriorityQueue:通过Comparator接口排序的队列,每次取得的元素为比较后的最小值;
  • Deque->ArrayDeque:数组实现的双端队列;
  • Deque->LinkedList:链表实现的双端队列;

6. Java8增强的Map集合

  • Set是所有value为null的特殊Map,所以Set接口和Map类似;
1         Map map=new HashMap();
2         map.put("xxx", 109);
3         // 替换指定key对应的value值
4         map.replace("xxx", 666);
5         // 使用当前value和传入参数重新计算value
6         map.merge("xxx", 666, (oldVal, param)->(Integer)oldVal+(Integer)param);
  • HashMap:key不可重复,最多可以有一个null,hashCode与equals方法结果必须一致;value只要通过equals比较相等就认为是相等的。
  • Hashtable:是线程安全的。不建议使用;
  • LinkedHashMap:使用双向链表维护key-value顺序,与插入顺序保持一致;
  • Properties:是Hashtable子类,是线程安全的,维护key-value对;
  • SortedMap->TreeMap:红黑树结构排序的map, compareTo和equals方法结果需要保持一致;
  • WeakHashMap:对于元素是弱引用的,如果元素没有其他地方引用,则GC后会从map中删除;
  • IdentityHashMap:与HashMap一致,但是比较key值采用==而不是equals方法;
  • EnumMap:key值只能是同一类型的enum值,根据枚举值定义顺讯存储;

7. HashSet和HashMap性能

  • 当hashCode相同而equals为false时,value值通过链表形式存储在同一个位置上,称为‘桶’;
  • ‘桶’的出现会降低集合的性能;

8. 操作集合的工具类:Collections

  • 排序操作:reverse,shuffle,sort,swap,rotate;
  • 查找替换:binarySearch,frequency,indexofsublist等;
  • 同步控制:
        List list=Collections.synchronizedList(new ArrayList());
        Set set=Collections.synchronizedSet(new HashSet());

 

我的笔记博客版权我的笔记博客版权