数组都是对多个数据进行存储,java容器

  • 数组特点:初始化,长度就确定了,元素类型也确定了
  • 缺点:
    • 一旦初始化,长度不可修改
    • 数组中添加插入,删除添加数据不方便,效率不高
    • 有序,可重复,对无序,不可重复的需求,不能满足

      集合

      用于存放对象的容器,集合的长度是可变的,不可存储基本数据类型(只能存储应用类型)。
      集合容器因为内部的数据结构不同,有多种具体容器
      不断向上抽取,就形成集合框架
      框架的顶层Collection接口

Collection和Map体系

  • Collection(单列数据)
    • List(存储有序,可重复的集合)
      • ArrayList : list的主要实现类.,线程不安全的,效率高,底层Object [] 存储
      • LinkedList :频繁的插入,删除操纵,使用比ArrayList效率高.底层双向链表存储的
      • Vector : list的古老实现类,线程安全的,效率低.底层Object [] 存储的
    • Set(存储无序,不可重复的集合)
      • HashSet : 作为Set接口的主要实现类,线程不安全,可以存储null值
      • LinkedHashSet : 作为HashSet的子类,遍历其内部的数据时,可以按照添加的顺序遍历,线程不安全的
      • TreeSet : 底层实现为红黑树,元素排好序,必须添加相同类的对象,线程不安全,可以按照添加对象的指定属性,进行排序.
  • Map(双列数据)
    • HashMap 主要实现,线程不安全的,效率高,存储null的key和value
      • LinkedHashMap : 频繁的遍历,效率高于HashMap.
    • TreeMap : 添加key-value对比进行排序,考虑key的自然排序和定制排序,底层红黑树
    • Hashtable : 古老实现类,线程安全的,效率低,不能储null的key和value
      • Properties : 常来处理配置文件,key和value都是String类型

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

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 next;
Node prev;

  1. 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如下图所示:
image.png

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(实现类对象)
第二种的比较器更常用优先级也更高
image.png
image.png

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:

内部结构是哈希表,同步的.不允许null作为键和值

子类: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);替换成同一个元素