总集合为collection
collection中的元素只能为引用变量
构造方法:
基本的空构造方法和参数为Collection并将其中元素复制成为新集合的方法
基本方法:
Iterator<E> i=new xx.iterator()迭代器,如果不写明E,则集合中元素会被当做Object处理,不可与collection中方法混用
size()返回集合中元素的个数而不是集合的容量
isEmpty()判断集合是否为空
主要子接口为set、list,另外介绍map
List(有序的,即按照加入的顺序存储)
ArrayList
ArrayList<E> array=new ArrayList<>();
第二个<>中的E省略掉了,因为反正都是一样的,但也是后来才可以省略的
构造方法多一个定大小的:ArrayList(int) int即为设定的容量大小
实现的底层机制是数组,其方法多是查询,常用语查询较多的情况
当向集合中添加对象时 先检查底层数组的容器剩余是否充足 如果不充足 将会扩充容器大小(1.5)
通过Arrays.copyOf将原来数组的内容放置在新的容器大小的数组中 并且将新数组赋值给原来的接收变量
加入元素用add(E),add(E,i)插入元素到指定位置i,若该位置已经有元素x,则将x及其之后的后移
加入集合用add(C),add(i,C)将集合C插入到指定位置i,C中可以是E及其子类
列表操作用clear() subList(i,i)
复制列表用clone(),此方法只是复制了里表中引用变量的地址,并不是复制了其本身
查找元素用contains(E) indexOf(E) lastIndexOf(E) remove(E) remove(C) retainAll(C),使用equals确定是否为同一元素的
处理i位置元素get(i) remove(i) removeRange(i,i) set(i,E)
元素排序用sort(C)根据比较器C进行排序
是否扩容用ensureCapacity(i)不足i则扩容
调整容量用trimToSize()将容量调整至现在的大小
迭代器补充listIterator(),listIterator(i),返回系列表迭代器,spliterator()返回一个遍历器
批量处理用replaceAll(operator)按参数处理全部元素(UnaryOperator<E>)
LinkedList
LinkedList<E> linked=new LinkedList<>();
底层实现机制为双向链表,因为是一个一个连起来的,所以无初始大小不允许null元素,即初始状态为空
不支持随机访问,指定位置访问需要重头开始找
方法以修改为主
与ArrayList相比新增函数:
添加元素:addFirst(E) addLast(E) offer(E) offerLast(E) offerFirst(E)
删除元素:remove() removeFirst() removeLast() removeFirstOccurrence() removeLastOccurrence() poll() pollFirst() pollLast()
迭代器:descendingIterator()返回逆向迭代器
获取元素:element() peek() peekFirst() peekLast() getFirst() getLast() get(i)(peek家族空不报错)
栈操作:pop() push(E)
不要慌,很多长得像的作用都是一样的,实现也没什么区别
Stack(Vector)
Stack<E> stack=new Stack<>();
只有空参这一种构造方法,模仿堆栈结构先进后出,是vector的子类,其实现是同步的
Stack从父类继承了很多方法,但是常用的是只有5个,一般不用父类方法以防混乱
empty() peek() pop() push(E) search(E)
Set(不包含重复元素)
HashSet
HashSet<E> array=new HashSet<>();
其中元素的放置并不按加入顺序,而是按照他自己设置的hash表地址
在集合中存放数据 根据数据的hashCode值来放置数据的位置 如果两个数据hashCode值一样再去比较两个元素的equals方法 返回false 放置在对应位置 返回true就代表的是相同的元素,
不能对特定位置元素进行操作(因为进入位置未知)
虽然不能用for循环,但是可以用for-each和iterator
重写了add(E)并用其加入元素
LinkedHashSet
LinkedHashSet <E> array=new LinkedHashSet<>();
通过hashCode来决定元素位置,同时又通过链表来维护元素的次序
同样不支持指定位置操作,是HashSet的子类但是无新增的方法
TreeSet
TreeSet<E> array=new TreeSet<>();
底层实现是红黑二叉树版的TreeMap,比较过后放入集合中,是自动比较的
当加入元素为null且用自然顺序或比较器不允许使用null元素时抛出异常
构造方法多两种,其中一种是new TreeSet<>(Comparator);--->根据比较器中的compare函数进行比较
或者是E实现Comparable接口,重写其中的compareTo()方法,根据该方法进行比较,不需要调用equals,但还是要保证相同的
若比较方法返回值为负数,则需要将新元素的位置提前再与之前比较,所以默认升序
新增方法:
ceiling(E) floor(E) higher(E) lower(E) descendingSet() first() last() headSet(E) headSet(E,boolean)
pollFirst() pollLast() subSet(E,boolean,E,boolean) subSet(E,E) tailSet(E) tailSet(E,boolean)
Map(采用键值对,key不能重复)
HashMap
HashMap<E,R> array=new HashMap<>();
底层采用hash表的方式存储(就是数组加链表),hash地址和hashCode没有半毛钱关系
值得注意的是:用put(<E,R>)加入新元素,(不用add!)
没有迭代器,不能用for、for-each,因为Map不是Collection的子接口,其中的键值对为map的内部接口Entry
如要遍历Map,
Set<Map.Entry<E,R>> newarray=array.entrySet();
然后用newarray的迭代器遍键值对Entry
再用Entry.getValue()获取R
或者是 Set<E> newarray=array.keySet();
然后用Set的迭代器遍历E集合
再用array.get(E)获取R
TreeMap
TreeMap<E,R> array=new TreeMap<>();
底层实现采用红黑二叉树,注意事项与HashMap、TreeSet的相同。