Java集合干货版1

Java集合与数据结构(java版)

1.集合简介

  • 简介:用来存储对象的容器,与数组类似,但又有所区别,实质内部封装了数组,链表等数据结构;此时的存储是定义在内存上的存储,不涉及到持久化的存储(.txt、.jpg、.avi、硬盘上的文件储存)
  • 愿景:集合的出现是为了代替数组(非100%)

2.集合与数组的区别

  • 数组
     特点:
       ① 一旦初始化后,长度(即容量)就确定了;
       ② 只能操作指定类型的数组元素;例如:int[]、String[]、Integer[]、Object[] 等等。
     缺点:
       ① 初始化长度后就无法修改;
       ② 数组提供的方法有限,无法对数组中的元素进行客观操作;
       ③ 是有序的,可以重复的,对无序,不可重复的需求无法满足。
  • 集合
       完全克服数组的缺点

3.集合框架简易描述(分为两大接口)

  • Collection接口:是单列集合,用来储存对象 (Collection n.采集)

  List接口:存储有序的,可重复的数据,类似于数组,但功能比数组强,是个动态的数组(理解:列表,有序的,内容可重复的表)
   (1)ArrayList类
      ① List接口的主要实现类,JDK 1.2 ,线程不安全,效率高;
      ② 底层使用Object类型数组存储

   (2)LinkList类
      ① List接口的主要实现类,JDK 1.2 ,线程安全,效率低;
      ② 底层使用双向链表存储(内置内部类),对于频繁的插入和删除操作效率贼高
        铁链式:1=2=3=4=5…
        若要将2删除,则将1指向3,3指向1即可 1=3=4=5=6…
        若要将2添加,则将1指向2,2指向1,2指向3,3指向2,即可…

   (3)Vector类(一个古老类JDK 1.0出现)

  Set接口:存储无序的,不可重复的数据,类似于高中数学中的集合,具有唯一性,互异性,无序性(理解:set,放置,往一个容器中放置数据,不管有序无序,但里面一旦存在的数据,就无法再放置相同的数据)
   (1)HashSet类
      ① Set接口的主要实现类,无序的不可重复的数据,线程不安全,效率高;
      ② 可以存储 null 值
        > 存储形式:数组 + 链表
        > 不可重复:(利用hashCode()与equals())
      ③ 不可重复性理解:先 利用hashCode(),算出将要存储的元素(对象)的哈希值,根据散列函数得到此元素(对象)在数组中的位置编号:(以下为简要思想)

  if (此编号位置上是否没有元素) {
      直接添加成功;
  } else if(此编号位置上元素个数 >= 1) {
  	if (两个元素的哈希值是否相同) {
  		if ( 则调用新元素的equals()进行判断二者是否相同) {
  			 只有相同,才能完全确定两个是同一个对象,就不进行添加;
  		} else {
  			按 七上八下 方式进行存储;
  		}
  	} else {
  		以链表的形式添加这个数据,(同一编号下的一系列数据)七上八下,JDK 7 时,新元素在上面,指向旧元素,JDK 8 时,新元素在旧元素下面,由旧元素指向新元素(与JDK 7 相反);
  	}
  }


   (2)LinkHashSet类
      ① 是HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历
        > 作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据的前一个数据和后一个数据;
        > 对于比较频繁的遍历操作:LinkedHashSet效率会高于HashSet

   (3)TreeSet类
      ① 可以按照添加的对象指定属性,进行排序
        > 向TreeSet中添加的数据,要求是相同类的对象(不能添加不同类的对象)
        > 两种排序方式:自然排序、 定制排序;

  • Map接口:双列集合,用来存储一对(key - value)数据或对象,类似于函数的映射,y = f(x),且多个key可以指向同一个value。key-value相当于一个哑铃,key和value分别是哑铃的两端重物,从而组成了一个entry。

   > Key的存储:无序性、不可重复性、使用Set存储
       要求:key所在的类要重写equals()和hashCode(),以HashMap为例;
   > Value的存储方式:无序性、可重复性,使用Collection存储
       要求:value所在的类要重写equal()
   > Entry的引入:一对key-value就是一个entry,使用put(key,value)相当于存放一个entry,且是无序的,不可重复的,使用Set进行存储

   (1)HashMap类
      ① JDK 1.2出现,作为Map的主要实现类;线程不安全,效率高;
      ② 可以存储null的key-value
        底层:数组+链表(JDK 7之前)
        数组+链表+红黑树(JDK 8及之后)

   (1-1)LinkHashMap类
      ① 是HashMap的子类,保证在遍历map元素时,可以按照添加的顺序实现遍历(原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素);
      ② 对于频繁的遍历操作,此类执行效率高于HashMap

   (2)TreeMap类
      ① 保证按照添加的key-value对 进行排序,实现排序遍历。此时是考虑key的自然排序和定制排序;
      ② 底层使用红黑树

   (3)Hashtable类
      ① JDK 1.0出现,比较古老的实现类,线程安全,效率低;
      ② 不能存储null的key-value

   (3-1)Properties类
      ① 是Hashtabled的子类
      ② 常用来处理配置文件,key-value都是String类型


PS:汇总各类视频(尚硅谷为主)以及一些个人心得整理而出(整理不已,请多支持。会持续更新)…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值