集合

集合

集合概述

一、常用集合概览

单列集合:
----| Collection 单列集合根接口
---------| List 实现List接口具备的特点:有序、可重复。
-------------| ArrayList   底层用Object数组实现,特点:查询快、增删慢。
-------------| LinkedList  底层用链表结构实现的,特点:查询慢、增删快。
-------------| Vector      实现与ArrayList是一样,不过是线程安全的,操作效率低。
---------| Set  实现Set接口的特点:无序、不可重复。
-------------| HashSet   底层用哈希表实现,存取顺序不能保证一致。保证元素唯一性需hashCode()equals()方法。 
-------------| TreeSet   底层用二叉数实现。
-------------| LinkedHashSet  底层结构用哈希表结构 + 链表结构实现,元素唯一不能重复,元素存取顺序一致
双列集合:
----| Map 双列集合根接口  
---------| HashMap   底层使用哈希表实现 
-------------| LinkedHashMap
---------| TreeMap   底层使用二叉数实现,可对集合中的键进行排序
---------| LinkedMap HashMap的子类,保留了元素插入的顺序  
---------| HashTable

Java中集合架构图:
在这里插入图片描述

二、Collection接口

  boolean add(Object o)   返回truefalse
  boolean addAll(Collection c)           把一个集合的元素添加到另外一个集合中
  boolean remove(Object o)
  void clear()  
  boolean removeAll(Collection c)   删除交集元素
  boolean retainAll(Collection c)           保留交集元素,删除非交集元素
  int size()   查看元素个数
  boolean isEmpty()
  boolean contains(Object o)   比较对象的是它们的地址,要重写equals()
  boolean containsAll(Collection c)  
  Object[] toArray()   把集合转成数组

1.List接口:

在指定位置上添加元素

 void add(int index,Object o)
  boolean addAll(int index,Collection c)
  Object remove(int index)
  Object get(int index)
  List subList(int fromIdex,int toIndex)

查找元素

int indexOf(Object o)
  int lastIndexOf(Object o)

修改位置上的元素

 Object set(int index,Object o)

转换成迭代器元素

  ListIterator listIterator()
  ListIterator listIterator(int index)

① ArrayList :

ArrayList使用数组方式实现List接口,它的检索效率很高。
  ArrayList可以按照List使用
  boolean add(int index,  Object obj)           在集合中指定index位置,添加新元素ob
  Object set(int index, Object obj)           用指定元素obj替代集合中指定index位置的元素
  Object remve(int index)   从集合中删除指定index处的元素,返回该元素
  void clear()   清空集合中所有元素

② LinkedList :
特有的方法:

addFirst(E e)
  addLast(E e)
  getFirst(E e)
  getLast(E e)
  removeFirst(E e)
  removeLast(E e)

数据结构实现了堆栈和队列两种数据结构

注:由于LinkedList实现了Deque接口,其中Deque接口继承了Queue接口。Deque接口定义的是双端队列,所以即实现了队列数据结构,又实现了堆栈的数据结构。

堆栈 先进后出,后进先出

  push()   将该元素插入集合的开头处
  pop()   移除并返回集合中的首元素

队列 先进先出,后进先出

 add() 将元素添加到列表末尾,不会校验列表容量,如果插入成功返回true,否则会抛出异常
 offer()   将元素添加到列表的末尾,offer和add类似但是,如果没有容量空间会插入失败,但是不会抛出异常
 remove()  将元素从列表头删除,如果成功并返回删除的元素,如果列表为空会抛出异常
 poll()   获取并移除集合中的首元素,poll和remove不同的是,如果列表为空不会抛出异常,会返回空。
 element()  检索出列表头元素并返回,但是不会删除元素,如果列表为空会抛出异常
 peek()  peek和element类似,但是列表为空不会抛出异常会返回空值。

返回逆序迭代器

  descendingIterator()

③ArrayList和LinkedList的比较:

  • ArrayList
    使用数组方式实现List接口
    检索效率很高
    删除效率很低。
  • LinkedList
    使用双向链表方式实现List接口
    删除效率很高
    检索效率很低。

④ Vector (向量):
一种动态数组,元素只能是对象,对象类型可以不同。

创建向量:

  Vector  v = new Vector();

添加元素:

  v.addElement(anObject);

获取元素:

  Object anObject = v.elementAt(0);

获取向量中元素个数:

  int num = v.size();

插入一个元素:

  v.insertElement(anObject , 4);

替换指定下标的元素:

v.setElement(anObject,4);

删除指定下标的元素:

  v.removeElement(4);

2.Set接口

① HashSet :

  • 一个实现Set接口的具体类
  • 集合中元素无序
  • 元素不重复
  • 元素值可以为空(null)

② Hashtable :

  • 实现了Map接口的具体类,用于存储映射(Map)关系。
  • 与ArrayList使用下标数字来确定对象不同,它使用一个对象(键)来确定另一个对象(值)。
  • 键不能重复,也不能为空(null)

三、Map根接口(键key不能重复,值value可以重复)

添加元素方法

  Object put(Object key,Object value)
  void   putAll(Map m)

获取元素方法

  Object get(Object key)
         size()

删除元素方法

  Object remove(Object key)   根据指定的键(key)删除元素,返回被删除元素的值(value)clear()

判断方法

  boolean containsValue(Object value)
  boolean containsKey(Object key)
  isEmpty()

转换成其他集合的方法

  Set entrySet()
  Collection values()
  Set keySet()

遍历方式

第一种:  
Set<String> keys = map.keySet();  
        for (String key : keys) {  
    Student s = map.get(key);  
    System.out.println( key + "..." + s.getName() + "..." + s.getAge() );  
}  
第二种:  
Set< Map.Entry<String, Student>> entrySet = map.entrySet();  
    for (Map.Entry<String, Student> entry : entrySet) {  
    String key = entry.getKey();  
    Student s = entry.getValue();  
    System.out.println( key+"..."+s.getName()+"..."+s.getAge() );  
}  

Map实现类总结:

  1. HashMap
    存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

  2. LinkedHashMap
    HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

  3. 其他接口:
    SortedSet接口
    一种按升序排列的Set
    其实现类 TreeSet
    SortedMap
    与SortedMap类似
    实现类 TreeMap

四、Iterator(迭代器)
提供了一种对各种对象集合统一遍历的方式。
主要方法:

  boolean hasNext()
  Object next()
  void remove()

五、Collections集合工具类和Arrays数组工具类

Collections类常见方法:

 sort(list);    //排序
  sort(list,comaprator);   //排序,比较器
  reverse(list);   //反转
  int binarySearch(list,key);   //对list进行二分查找
  int binarySearch(list,key,Comparator);  
  max(Collection)
  max(Collection,comparator)
  Set synchronizedSet(Set<T> s)   //将不同步的集合变成同步的集合,变安全
  Map synchronizedMap(Map<K,V> m)  
  List synchronizedList(List<T> list)  

Arrays类常见方法:

 toString(int[])   //将数组变成字符串
  sort(int[])
  sort(char[])  
  copyOf();
  copyOfRange();   //复制部分数组
  equals(int[],int[]);           //比较两个数组是否相同
  List asList(T[]);           //将数组变成集合
  binarySearch(int[])   //二分查找,数组需要有序

六、总结

  • ①数组保存类型明确的对象,可以是多维的,也可以保存基本数据类型数据,但是数组一旦生成,其容量不能改变。
  • ②Collection保存单一元素,而Map保存相关联的键值对。
  • ③与数组类似,List也建立数字索引与对象的关联,可以认为数组和List都是排好顺序的集合。List是可以自动扩充容量。但是,List不能保存基本数据类型的数据,只能保存Object引用,因此,取元素后需要作类型转换。
  • ④如果需要作大量的随机访问(检索),就使用数组或ArrayList,如果要经常从集合中插入或删除元素,应该使用LinkedList。
  • ⑤队列、双向队列以及栈的行为,可以由LinkedList来实现。
  • ⑥Map是一种将对象与对象相关联的设计。常见HashMap、TreeMap和Hashtable,其中HashMap与Hashtable相似,TreeMap侧重于排序。
  • ⑦Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。

集合类详解

HashMap

通过key哈希值确认数组索引位置
HashMap 每次扩容结果都是2的N次方,正常通过key值经过hash方法处理后的返回值对扩容后的数组大小进行取余操作即可,得到的值就是对应数组的索引位置,每个索引位置对应的值是一个链表(桶),实际JDK源码使用key hash后的值和2的N次方减一进行位与操作(&),得出的值和取余是一致的。
hash(key)&(2^n-1) 等同于 hash(key)%(length)

2次方位与的原理分析:

HashMap 2的N次方减一后进行 二进制的位与操作,相当于只有都是1才会有值所以不会出现大于2N次方的情况,就相当于取余操作。

//比如1000长度是2的3次方,减一后是111
1000  
111
//hash值是11,和111取余,因为位与是同为1才会是1其他都是0,而且2的n次方减一后位上都是1,如果是有高位就按0补位,所以和该数取余就会保留小于2的n次方原hash值,如果是比2的n次方大的高位和0位与后也是0。所以这就符合了取余的结果,小于length就返回原值,大于length就去掉length的倍数返回剩余值就行。
11 & 111 = 11

1011 & 0111 = 11
10011 & 0111 = 11

比如说对8取余,111所以小于8的与后都会保持不变,大于8的相当于减去8或者8的倍数取小于8的那一部分位数。

这样做通过位与操作可以提高计算效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值