常用类继承结构概览: Collection中常用方法:
boolean add(Object e)int size()void clear()boolean isEmpty()Object[] toArray()boolean remove()boolean contains(Object e)要使用这两个函数,在函数底层调用的是对象的equals()方法进行比较,因此集合中的对象应该重写equals()这个方法。
使用迭代器来遍历集合,不用根据下标一个个遍历,for each就是一个迭代器原理 迭代器对所有Collection通用,因为Iterable是Collection的父接口
Collection c=new ArrayList(); Iterator it=c.iterator();迭代器方法:
boolean hasNext(),判断迭代器后一位是否有对象可以迭代next():迭代器向后走一位并返回元素 if(it.hasNext()){ Object o=it.next(); }当集合结构发生改变时:必须重新获取迭代器,否则会出现异常 因此,在迭代过程中不能调用collection.remove(),但是可以调用iterator.remove(),通过迭代器对象来改变集合元素是没问题的。
常用方法:
void add(int index,E element)E get(int index)E remove(int index)E set(int index,E element)int indexOf(E element)集合底层是一个数组结构的对象 ArrayList对象的扩容:是重新建一个更大的对象,然后将就对象中的内容拷贝过去,因此对于ArrayList可以做的优化就是在最初创建的时候就给一个合适的大小,尽量减少底层扩容的次数
底层是一个双向链表
用泛型指定只能存储的类型 List<String> list=new ArrayList<>();
Map<K,V>常用方法
void clear()boolean containsKey(Object key)boolean containsValue(Object value)V get(Object key)V put(K key,V value)V remove(Object key)int size()Set keySet() 返回Key的Set集合Collection values() 返回Value的集合Set<Map.Entry<K,V>> entryset() 返回以<Key,Value>节点作为集合元素的Set集合Map底层中存储的对象是一个Key和value结合的节点对象,Node<K,V> Node<K,V>: 两个属性:key 和value 两个方法: getKey()、getValue Map.entrySet()返回的就是以Map.Entry<K,V>作为对象的Set集合,Map.Entry<K,V>就是一个Node<K,V>
HashMap底层是一个哈希表/散列表, 哈希表是一个数组和链表结合的结构,首先是是一个node<k,v>[]数组,下面是node<k,v>的链表。 node<k,v>的一个结构是: node<k,v>{ final K key; V value; final int hash;//哈希值 node<k,v> next;//志向下一个node }
每一个node对象都有一个确定的哈希值,根据hashnode()方法得出。 HashMap的put的实现原理:
底层调用hashnode()算出hash值,然后通过hash算法将hash值转换成数组下标如果下标位置上无任何元素,那么添加Node上去,如果有,将k和链表上每一个node进行equals比较,若所有比较结果为False,则将Node添加到链尾。因此,如果HashMap中放置的自定义类型,得重写hashnode()和equals()方法。
底层结构是红黑树,节点node有五个属性(key,value,left,right,parent),节点有自身Kv和指向相关节点的引用。 TreeMap中的key根据排序规则可以进行排序形成红黑树,因此存放的对象必须可以比较,实现排序规则,有两种方式:
对象实现comparable接口并实现compareTo方法 Class Student implement Comparable<Student>{ private String name; @Override public int compareTo(Student s){ return this.name.compareTo(s.name); } } 第二种实在构造TreeMap的时候传一个比较器对象 TreeMap<Student> students=new TreeMap<>(new Comparator<Student>(){ public int compare(Student s1,Student s2){ return s1.name.compareTo(s2.name); } });两种方式的比较: 在比较规则不经常发生改变时,一般实现comparable接口,若比较规则有多个或经常改变,一般使用传比较器对象的方式。
常用方法:
Collections.synchronizedList(List list):将List变成线程安全Collections.sort(List list):对list进行排序,元素必须有比较器。