学习笔记(Java集合)

一、Java集合概述

只有map及其相关的类不继承自Collection,其余都是

二、List、Set、Map三者的简要说明

  • List是有序的,可重复的。
  • Set是无序的,不可重复的。
  • Map是使用键值对来存储的,key是无序的、不可重复的,value是无序的,可重复的

三、List

  • ArrayList:用Object[]数组实现。
  • Vector:用Object[]数组实现。
  • LinkedList:用双向链表实现。

ArrayList和Vector区别

两者都是Object[,但Vector是线程安全的。

ArrayList和LinkedList的区别

  1. ArrayList是Object[]实现的,LinkedList底层是双向链表。
  2. ArrayList索引某个位置的元素时可以直接获取,时间复杂度为O(1),LinkedList底层是双向链表索引时要移动到指定位置,时间复杂度约为O(n)。
  3. 增删的区别:

    ①ArrayList默认是在尾部添加或删除,此时时间复杂度为O(1),若是要在指定位置增删,则该位置后面的元素都要前移一位或后移一位,时间复杂度为O(n - i)。

    ②LinkedList在首尾增删是与位置无关的,时间复杂度为O(1),但在指定位置增删时,要用O(n),因为要先找到该位置。
  4. 总的来说,LinkedList增删较快,但访问元素是ArrayList较快。
  5. 二者的内存占用情况,ArrstList内存花费体现在它总会预留一部分空间,而LinkedList则是每一个元素占用的空间大(直接前驱、直接后继和数据)。

RandomAccess 接口

ArrayList实现了RandomAccess 接口,代表了可以快速随机访问,但这个只是一个标识,没有什么功能和作用,ArrayList可以快速随机访问与这个接口无关,表明了他具有快速随机访问功能。

四、Set

set具有无序性和不可重复性。

无序性并不是指随机性,加入的数据不是根据加入的顺序排序的,而是有数据的哈希值决定的,也就是说数据的排序是有规律的,不是随机排列,但与加入的顺序无关。

HashSet、LinkedHashSet和TreeSet

HashSet是Set接口的主要实现类,HashSet的底层是 HashMap,线程不安全的,可以存储 null 值;

LinkedHashSet 是HashSet的子类,能够按照添加的顺序遍历;

TreeSet底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。

五、Map

  • HashMap在JDK1.8之前用的是数组 + 链表,链表是为了解决哈希冲突,1.8后是数组 + 链表/红黑树,当链表长度大于8时(将链表转化为红黑树前,会先判断该数组长度是否小于64,若小于,则要先对数组进行扩容),会将链表转化为红黑树。
  • LinkedHashMap继承自HashMap,在其基础上加上了一个双向链表,可以保持键值对的插入顺序。
  • Hashtable: 数组+链表组成的,数组是Hashtable的主体,链表则是主要为了解决哈希冲突而存在的。
  • TreeMap:底层是红黑树,拥有根据键排序的能力,默认是键的升序排序,也可重写比较器定制排序。

HashMap和HashTable

  1. 线程安全:HashMap不是线程安全的,HashTable是线程安全的,里面的方法基本都用synchronized修饰过,所以效率是HashMap要高一些的,但HashTable基本不用了,线程安全的话最好用ConcurrentHashMap。
  2. 容量与扩容:HashMap默认是16,HashTable默认是11,HashTable每次扩容都会变成2n + 1,HashMap每次扩容都会变成2倍;给定了初始大小的话,HashTable会直接用,HashMap会扩容成2的幂次方(减少哈希冲突)。
  3. 对null的存储:HashMap可以有null键和null值,但null键只能有一个;HashTable两个都不能有。

HashMap和HashSet

HashSet底层是由HashMap实现的,HashMap的Key值就是HashSet的元素,Value是系统自定义的一个名为PRESENT的Object常量。

HashMap和TreeMap

二者都继承自AbstractMap,但TreeMap还实现了NavigableMap接口和SortMap接口,NavigableMap让TreeMap有了对集合内元素的搜索能力,SortMap让TreeMap有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器;
总的来说,TreeMap比HashMap多了根据键进行排序的能力和集合对元素的搜索能力。

ConcurrentHashMap

ConcurrentMap相当于线程安全的HashMap,底层都是数组 + 链表/红黑树;
ConcurrentMap线程安全,在1.7之前,使用Segment(分段锁),对每个桶数组进行分割分段,每一把锁只锁容器的一部分数据,当多线程访问不同数据时,就不会发生锁竞争,提高并发访问率,HashTable是共用一把锁,效率不高;
1.8之后,ConcurrentMap改成了Node数组 + 链表/红黑树来实现,并发控制用synchronized + CAS来操作。

HashTable

ConcurrentMap 1.7  Segment 数组 + HashEntry 数组 + 链表

ConcurrentMap 1.8   Node 数组 + 链表 / 红黑树,链表转化为红黑树是,Node也会转化为TreeNode(链表长度超过8时会转化为红黑树)

六、Connections工具类

排序操作

void reverse(List list)//反转
void shuffle(List list)//随机排序
void sort(List list)//按自然排序的升序排序
void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
void swap(List list, int i , int j)//交换两个索引位置的元素
void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面

 查找、替换操作

int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)


void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素
int frequency(Collection c, Object o)//统计元素出现次数


int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)


boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素
 

 

七、Comparable 和 Comparator 的区别

  • Comparable接口实际上是出自java.lang包它有一个conpareTo(Object obj)方法用来排序
  • Comparator 接口实际上是出自 java.util 包它有一个conpare(Object obj1,Object obj2)方法用来排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值