容器、持有对象、集合类、Collection;基本类型:List、Set、Queue和Map
与容器密切相关的是泛型。建议看源码
数组变容器
//数组变容器
public static <T> List<T> Arrays.asList(T... a)
public static <T> boolean Collections.addAll(Collection<? super T> c, T... elements)
//所有的容器都重写了toString方法 会打印出含有的元素
public String toString(){}
List 列表--有顺序
- ArrayList:随机访问速度快,插入删除慢。
- LinkedList:链表--插入和删除比ArrayList快
//Collections方法
//使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的
public static void shuffle(List<?> list)
//使用指定的随机源对指定列表进行置换。所有置换发生的可能性都是相等的,假定随机源是公平的
public static void shuffle(List<?> list, Random rnd)
public static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T> void sort(List<T> list, Comparator<? super T> c)
//Collection方法
//此 collection 中未包含在指定 collection 中的所有元素
boolean retainAll(Collection<?> c)
迭代器原理:
实现iterator()获得Iterator对象(cursor=0表示当前游标,lastRet=-1表示当前位置)
- hasNext()---cursor是否与size相等
- next() 获取get(cursor) lastRet=cursor cursor+1
- remove remove(lastRet)
List专属迭代器ListItertor获取方式List类型.listIterator,增加的方法
- nextIndex 返回cursor
- previousIndex 返回lastRet
- set(T) 替换cursor 所在的位置
- listIterator(int i)直接定位一个指定位置的迭代
- hasPrevious 反面的hasNext
- previous 反面的next()
LinkedList可用作栈(先进后出)、队列(先进先出)、双端队列
方法及差异
- getFist()、element()完全一样,返回列表的头(第一个元素)而并不移除,若列表为空,throw NoSuchElementException。poll与前两者的方法一样,不过在列表为空时返回null
- removeFirst、remove(),移除并返回列表的头。列表为空throw NoSuchElementException;poll返回null
- addFirst与add(后)、addLast、offer(后),将元素插入列表的端部
- removeLast()移除并返回列表的最后一个元素。
Set-集合:HashSet、TreeSet(红黑树、顺序的)、LinkedHashSet
HashMap-键值对: entrySet\keySet\contain
Statck:已废弃 可用LinkedLIst实现
Queue:PriorityQueue
容器总结:
这部分涉及的API过多,建议读源码以及查看API学习,不一一罗列
容器有两个大部门Collection与Map(键值对),Arrays和Collections提供了很多有用的工具方法。
Collection有多个分部,类似数组的List、像数学集合一样的Set、先进先出的Queue、先进后出的Stack(废弃)
对于不同的接口,使用时按照逻辑走就可以,比如list,像数组一样就可以直接get(int),Set不刻意重复,就要便利去,栈、队列这些就要操作端
迭代器总结:只可以像前跑不能后退
使用时继承实现接口Iterable,并重写方法Iterator<T> iterator(); 用来返回Iterator
Iterator就有了我们熟悉的hasNext() next() remove
特殊的List有个自己的ListIterator 特殊之处在于他可以向后退hasPrevious() previous() nextIndex() previousIndex()
工具类关键点:
Collections.shuffle(List<?> list)
Integer[] ia = {1,2,3,4,5}
若list = new ArrayList(Arrays.asList(ia )) 则list顺序为乱序,ia依旧是顺序的;;原因使用构造器会生产一个新的数组对象(List底层为数组)
若list = Arrays.asList(ia ) 则都为乱序