数组都是对多个数据进行存储,java容器
- 数组特点:初始化,长度就确定了,元素类型也确定了
- 缺点:
Collection和Map体系
- Collection(单列数据)
- List(存储有序,可重复的集合)
- ArrayList : list的主要实现类.,线程不安全的,效率高,底层Object [] 存储
- LinkedList :频繁的插入,删除操纵,使用比ArrayList效率高.底层双向链表存储的
- Vector : list的古老实现类,线程安全的,效率低.底层Object [] 存储的
- ArrayList : list的主要实现类.,线程不安全的,效率高,底层Object [] 存储
- Set(存储无序,不可重复的集合)
- HashSet : 作为Set接口的主要实现类,线程不安全,可以存储null值
- LinkedHashSet : 作为HashSet的子类,遍历其内部的数据时,可以按照添加的顺序遍历,线程不安全的
- TreeSet : 底层实现为红黑树,元素排好序,必须添加相同类的对象,线程不安全,可以按照添加对象的指定属性,进行排序.
- HashSet : 作为Set接口的主要实现类,线程不安全,可以存储null值
- List(存储有序,可重复的集合)
- Map(双列数据)
- HashMap 主要实现,线程不安全的,效率高,存储null的key和value
- LinkedHashMap : 频繁的遍历,效率高于HashMap.
- LinkedHashMap : 频繁的遍历,效率高于HashMap.
- TreeMap : 添加key-value对比进行排序,考虑key的自然排序和定制排序,底层红黑树
- Hashtable : 古老实现类,线程安全的,效率低,不能储null的key和value
- Properties : 常来处理配置文件,key和value都是String类型
- Properties : 常来处理配置文件,key和value都是String类型
- HashMap 主要实现,线程不安全的,效率高,存储null的key和value
Collection接口中的方法
- add(E e) : 添加元素
- addAll(Collection coll) : 添加coll集合元素添加到当前集合
- size() : 获取元素的个数
- isEmpty() : 判断当前集合是否有元素
- clear() 清空集合元素
- contains(Object obj): 判断当前集合是否包含obj,会调用对象的equals()方法进行判断
- containsAll(Collection coll) : 判断coll中所有的元素是否都存在当前集合中
- remove(Obeject obj) : 移除元素
- removeAll (Collection coll) : 删除调用者之中两个集合中的交集
- retainAll(Collection coll): 保留相同元素,删除不同元素
- equals( Collection coll) : 判断当前集合,和形参集合的是否相等
- hashCode() :放回当前对象的哈希值
- toArray() :集合转换成数组
- iterator() : 获取迭代器
迭代器(Iterator接口)
- hasNext()有元素可迭代,返回trun
- next(): 指针下移,返回迭代的下一个元素
- remove(): 删除集合中的元素
- 注意未调用next() 或者上一次调用next方法已经调用了remove方法,在调用remove都会报IllegalStateException
- 注意未调用next() 或者上一次调用next方法已经调用了remove方法,在调用remove都会报IllegalStateException
Collection collection = new ArrayList();
collection.add(“aaa”);
collection.add(“bbb”);
collection.add(“ccc”);
Iterator it = collection.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
foreach遍历集合元素
java5.0提供foreach循环遍历集合数组(内部仍然调用迭代器 )
for(Object obj : collection){
System.out.println(obj);
}
List
ArrayList :
- JDK7 : new ArrayList()底层创建了长度为10的object数组,添加导致数组容量不够,默认扩容原来容量的1.5倍,同时将原有数组复制到新的数组中,建议使用带参的构造器 ArrayList(int capacity);
- JDK8 : new ArrayList(),Object[] 初始化为{} ,没有创建长度为10的数组,第一次调用add() 底层才创建长度为10的数组.后续一样.
LinkedList :
new LinkedList():内部申明了first和last的属性默认值为null,add()添加到Node中,创建Node对象.Node为双向链表.
private static class Node
E item;
Node
Node
Node(Node<E> prev, E element, Node<E> next) {<br /> this.item = element;<br /> this.next = next;<br /> this.prev = prev;<br /> }<br />}
Vector:内部是数组数据结构,是同步的.
他有一个与迭代器实现效果一样的方法东西Enumeration如下图所示:
List中的特有方法
- add(int i ndex , Object obj) : 将obj添加到index索引上
- addAll(collection coll) : 将coll添加到集合中
- addAll(int index,collection coll) :从index索引开始将coll添加到集合中
- get(int index) : 获取index位置的元素
- indexOf(Object obj) : 返回obj在集合中首次出现的位置
- lastIndexOf(Object obj) : 返回obj在当前集合中末尾出现的位置
- remove(int index) : 删除指定index的位置元素,返回删除的元素
- set(int index,Object obj) : 设置指定index为obj
- subList(int fromIndex ,int toIndex) : 返回fromIndex到toIndex位置的子集合.
linkedList方法:
- offerFirst(): 添加元素到列表开头
- offerLast(): 添加元素的列表的结尾
- peekFirst() 获取列表开头元素,链表为空,抛出空,NoSuchElementException
- peekLast() :获取列表结尾元素
- pollFirst() : 移除链表开头元素,并返回
- pollLast() : 移除链表结尾元素,并返回
Set:不可以重复,是无序的
无序性 : 存储数据不是按照数组的顺序添加,而是根据数据的哈希值决定的
不可重复的 : 保证添加的元素,对象是不同的
HashSet:
数组+链表的结构
添加元素,判断所在类的hashCode()方法,计算出存放位置,没有其他元素,添加成功,
如果有就比较哈希值,hash值不相同,添加成功,
hash值相同,就调用方法的equlas() 方法 , 返回true添加失败,false添加成功.
JDK 7 : 元素a添加到数组中,指向原来的元素
JDK 8 : 原来的元素在数组中,指向元素a
像Set添加数据,其类一定要重写hashCode()和equals()方法.
LinkedHashSet
是HashSet的子类不重复且有序(怎么进去,怎么出来) ,添加数据的同时还维护了两个引用.记录此数据前后引用.
对于频繁的遍历操作LinkedHashSet效率高于HashSet. 是哈希表和链接列表实现的
链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。所以元素输出顺序和你的存储顺序是一样的.
TreeSet:
只能添加相同类的对象
判断元素的唯一性:就是根据比较compareTo(object obj)方法的返回值是否为0;是零就是相同元素,不存.每次添加元素时都会调用 二叉树中对象.compareTo(添加的对象)方法根据返回值大小去确定他们的位置和是否相等,
如果该方法返回0,则表示两个对象相等,如果该方法返回一个正整数,则表明添加的元素小;如果该方法返回一个负整数,则表明添加的元素大。
1.自然排序 : 对元素自身具备比较功能,就要实现Comparable接口覆盖compareTo()方法
2.定制排序 : 自定义类实现Comparator接口,覆盖compare方法,将实现类的对象传入new TreeSet(实现类对象)
第二种的比较器更常用优先级也更高
Map结构:
Map中的key:是无序的,不可重复的,使用Set存储所有的key
map中的value无序,可重复的,使用Collection存储所有的value
一个键值对:key-value构成了一个Entry对象
Map中的entry无序的.不可重复的,使用set存储所有的entry
在自定义对象存储是,要重写equals,hashcode(),或者compareTo(),
HashMap :
JDK7及之前: 数组+链表
HashMap map = new Map() ;实例化底层创建长度16的一维数组,map.put(key,value),调用对象相对应类的hashCode()计算哈希值,得到Entry数组的存放位置,位置没有数据,则添加成功
有数据,则去比较一个或多个已存在的数据的哈希值,没有一个相同存储成功
有相同,就去比较他们的类对应的equals()方法,返回true,添加失败(表示他们是同一个对象)那么就用添加的value去替换原来存在的value值,false就添加成功.
不断添加,默认的扩容方式,扩容是原来的2倍,并将原来的数据复制过来.
JDk8 中:
- new HashMap(),底层没有创建长度16的数组,
- 底层是Node[],而非Entry[],首次调用put()方法时添加长度为16的数组,
- JDK8 : 数组+链表+红黑树.
当数组的某一索引位置上的元素以链表的形式存在的数据的个数>8且数组的长度 > 64 ,此索引上的所有数据改成红黑树存储
DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
- MAXIMUM_CAPACITY : : HashMap的最大支持容量,2^30
- DEFAULT_LOAD_FACTOR :HashMap的默认加载因子 0.75
- threshold:扩容的临界值= 容量*0.75 =>12
- TREEIFY_THRESHOLD :Bucket中链表长度大于该默认值,转化为红黑树 : 8
- MIN_TREEIFY_CAPACITY :桶中的Node被树化时最小的hash表容量。 64
LinkedHashMap:
里面添加了before,after记录添加元素的先后顺序,遍历建议使用,
Map常用方法
- put(object key,object value),将数据添加(修改)到map中
- putAll(Map n) : 将m的key-value对存放当前map中
- remove(object key) : 移除指定的key的键值对,返回value,没有元素为null
- clear() 清空map中的所有数据
- get(object key): 获取key对于的value
- containsKey(object key) : 是否包含指定的key
- containsValue(object value) : 是否包含指定的value
- size() : 返回当前key-value对的个数
- isEmpty() : 判断当前map是否为空
- equals(object obj) : 判断当前map对象和参数对象obj是否相等
元视图的操作
- keySet() 获取key的集合
- values() 获取value的集合
- entrySet() : 获取key-value的集合
Hashtable:
子类:Properties:
用来存储键值对型的配置文件的信息
- 该集合存储都是String类型的键和值都是String
可以存储在流中,或者从流中获取<br /> list(System.out); 输出全部数据<br /> load(InputStream); 读取输入流中数据<br /> stringPropertyName(); 将存到set数据中<br /> stroe(输出流,String 注释信息) 将输出流中写到文件<br /> setProperty(String key,String newValue);修改数据<br /> getProperty(String key); 获取数据
Collections工具类 : (操作list,set.map的工具类)
- reverse(List) : 反转List中元素的顺序
- shuffle(List) : 对元素进行随机排序
- sort(List) : 根据元素自然排序对指定List集合进行元素升序排序
- sort(List , Comparator) :根据Comparator对list排序
- swap(List,int,int) : 交换list中两个索引的元素的值
- max(Collection) : 根据自然排序,返回集合中的最大值
- max(Collection,Comparator) : 根据Comparator顺序,返回集合中的最大值
- min(Collection) : 根据自然排序,返回集合中的最小值
- min(Collection,Comparator) : 根据Comparator顺序,返回集合中的最小值
- frequency(Collection,object) : 返回集合中指定元素出现的次数
- copy(List dest ,List src) : 将src中的内容复制到dest中
- replaceAll(List list,object oldval,object newVal) :使用新值替换List
- synchronizedList(List) : 返回l线程安全的list
- synchronizedSet(set) : 返回l线程安全的set
- synchronizedMap(Map) : 返回l线程安全的map
- fill(list,obj);替换成同一个元素