Java集合工具包位置是java.util.*
Java集合主要包括2块:数据结构(Collection接口,Map接口)和工具类(Arrays,Collections,Iterator迭代器)。
• 静态数组类:即我们通常意义上说的数组,是最特殊的Java类,Object的直接子类(遵循Object类的所有规则,比如a=b是传递对象地址),但是没有类文件,也没有构造函数。它的大小一旦初始化后就不能变化了。
⁃ 声明:int[] intarray或int intarray[]。
⁃ 初始化:new int[3];intarray ={1,2,3};或者new int[]{3, 1, 2, 6, 4, 2}
⁃ 属性:length,
• 工具类:java.util.Arrays类提供了一系列的静态方法,以数组对象实例作为入参。
⁃ System.arraycopy(arr, index, copytoarr, index + 1,size - index);native方法,浅拷贝一个数组。
⁃ Copytoarr=Arrays.copyOf(arr,size);深拷贝一个数组,本质上还是调用了arraycopy方法,但是返回了一个新的数组对象。
⁃ Copytoarr=Arrays.copyOfRange(arr,from,to),
⁃ Arrays.fill(arr,匹配arr类型的值value);
⁃ Arrays.fill(arr,fromindex,toindex,value);
⁃ Arrays.sort(arr);只能对基本数据类型升序排。
⁃ Arrays.sort(Object,实现Comparator接口的类);或者让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法。
⁃ Arrays.binarySearch(Object[]arr,Object keytosearch);二分法查找,arr排序后才能使用
• 工具类:java.util.Iterator类
⁃ 所有的集合都会实现Iterator,它屏蔽了访问不同种类集合时的差异。
⁃ Iterator iter = list.iterator();
⁃ iter.hasNext();
⁃ iter.next();
• fail-fast:当某一个线程遍历集合的过程中,集合的内容被另外一个线程所改变了;就会抛出ConcurrentModificationException异常,产生fail-fast事件。
Collection接口:包括2个子接口,List和Set。
List接口:List的实现类有LinkedList, ArrayList, Vector(子类Stack)。
• ArrayList:线程不安全。基于数组实现,通常被称为动态数组(大小可变)。每次增加删除元素是利用System.arraycopy拷贝并生成一个新的数组。第一个元素序号是0。
⁃ ArrayList list = new ArrayList();
⁃ List<String> list = new ArrayList<String>();
⁃ list.add("1");
⁃ list.add(0, "5");
⁃ list.remove("3");
⁃ list.get(i);
⁃ list.size();
⁃ list.contains(3);
⁃ list.set(1, "10");
⁃ list.clear();
⁃ list.isEmpty();
⁃ 遍历 Integer value
1.迭代:
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
2.索引: value = (Integer)list.get(i);
3.for循环:for (Integer integ:list) {...}
⁃ list转数组Integer[] newText = (Integer[])list.toArray(new Integer[0]);
⁃ 数组转list ArrayList list=Arrays.asList(arr);
• CopyOnWriteArrayList(java.util.concurrent):List<String> list = new CopyOnWriteArrayList<String>();
• LinkedList:线程不安全。基于内部类Entry作为链表元素实现,是双向链表。每次增加删除元素通过遍历链表的方式,无法利用数组的索引,所以访问效率低于数组,但是增删元素效率高。
⁃ list.add("1");
⁃ list.addFirst("10");void方法,抛异常
⁃ list.offerFirst(e) ;返回false
⁃ list.remove("3");
⁃ llist.removeFirst();
⁃ list.pollFirst();返回null
⁃ list.get(i);
⁃ llist.getFirst();
⁃ llist.peekFirst();
⁃ llist.getLast();
⁃ llist.peekLast();
⁃ list.size();
Set接口:
• HashSet:基于HashMap实现,map存储的键值对为(key=set值,value=固定值PRESENT)
⁃ HashSet set = new HashSet();
⁃ set.add("1");
⁃ set.remove("e");
⁃ set.clear();
⁃ set.isEmpty();
⁃ set.size();
⁃ HashSet set2 = (HashSet)set.clone();
Map接口:
• HashMap:线程不安全。key对应的哈希值相同的元素Entry(包括hash,key,value,next成员变量)会存在同一个单向链表中,数组table则存储所有链表的第一个元素。key可以是任意实现了hashCode()方法和equals方法的对象(所以不能是基本数据类型,因为没有实现这些方法),也可以是null(只能存一个)。size是HashMap的大小,它是HashMap保存的键值对的数量。
⁃ HashMap map = new HashMap();
⁃ map.put(“key1”,”value1”);
⁃ map.remove("key1");
⁃ value=map.get(“key1”);
⁃ map.size();
⁃ map.containsKey(“key1”);
⁃ map.containsValue(“value1”);
⁃ map.clear();
⁃ map.isEmpty();
⁃ Entry对象
Map.Entry entry=(Map.Entry)it.next();
⁃ entry.getKey();
⁃ entry.getValue();
⁃ 和集合关系:entrySet(),values(),keySet()
map.keySet().Interator();
⁃
⁃
⁃
• ConcurreentHashMap
查询效率:比较常见的是ArrayList