java笔记(8)

 

目录

65、类集框架:

(1)Collection接口:

(2)List接口(允许重复元素):

(3)ArrayList子类:

(4)LinkedList子类:

(5)Vector类:

(6)Set接口(不允许重复元素):

(7)HashSet子类:

(8)TreeSet子类:

(9)重复元素的判断:

66、集合输出:

(1)Iterator迭代输出:

(2)ListIterator双向迭代输出:

(3)Enumeration枚举输出:

(4)foreach输出:

67、Map接口(二元偶对象集合):

(1)HashMap子类:

(2)LinkedHashMap子类:

(3)TreeMap子类:

(4)HashTable子类:

(5)Map.Entry:

68、Stack栈:

69、Queue队列:

70、Properties属性文件类:

71、Collections工具类(JDK1.2):

72、Stream接口:


65、类集框架:

 

(1)Collection接口:

注意:之所以定义有泛型,是为了保证所存储的内容数据类型统一

 

 

 

(2)List接口(允许重复元素):

 

 

 

(3)ArrayList子类:

注意:ArrayList类在调用构造方法,没有指定数组大小时,那么此时其内部是一个空数组,而当第一次使用add方法添加元素时,会将数组扩容到10,之后每次扩容为原始长度的50%

注意:ArrayList是基于数组实现的存储,数组最大的问题就是数组长度的问题,因此一旦集合中的元素个数超过了数组长度,那么就要进行数组扩充,扩充就意味着会产生垃圾空间。因此最佳的做法是在使用之前预估保存数组的最大长度,以此来避免垃圾的产生以及不断引用修改所带来的的性能问题。

注意:直接输入ArrayList对象默认会调用toString方法,将ArrayList对象转为对象数组再输入

之所以引入抽象类,主要的原因在于List接口有许多的子类,这样就会存在一些公共方法的实现,利用抽象类来实现公共方法,各个子类只完成自己特殊的方法即可,同时为了强调ArrayList是List接口的子类,就在ArrayList定义的时候多实现了一次List接口

 

ArrayList类的构造方法:

 

(a)ArrayList与自定义类对象:

注意:使用ArrayList保存自定义类对象时要想实现contains和remove方法就必须在自定义类中覆写equals方法

 

(4)LinkedList子类:

注意:LInkedList是基于链表实现存储的,其内部的节点内保存有上一个节点和下一个节点,是双向链表

 

(5)Vector类:

注意:Vector类是在JDK1.0的时候提出的最早的动态数组实现类,并且在JDK1.2之后将这个重新修改并且归纳到了类集框架之中,这个类的定义机制和ArrayList是相同的

 

 

(a)ArrayList与Vector的区别:

 

(6)Set接口(不允许重复元素):

注意:重复元素的判断使用的是hashCode和equals方法,排序使用的是comparable

注意:Set接口是Collection接口的直接子接口,但是Set接口并没有像List接口那样对Collection接口进行了大量的扩充,而仅仅是维持了Collection接口定义,唯一多的就是JDK1.9后增加的of方法

 

(7)HashSet子类:

注意:HashSet是无序的:即添加元素的顺序和输出元素的顺序不一致

注意:HashSet内部依赖的是HashMap的数据结构

 

(a)LinkedHashSet:

注意:LinkedHashSet是有序的:即添加元素的顺序和输出元素的顺序一致

注意:LinkedHashSet是HashSet的子类,基于链表结构

(8)TreeSet子类:

注意:TreeSet的去重和hashcode,equals方法没有关系

注意:TreeSet可以自动对添加的内容实现排序效果

注意:底层是使用TreeMap实现的

注意:如果相对自定义类进行排序,那么自定义类中必须实现Comparable比较器接口,如果没有实现此接口程序执行时会出现“java.lang.ClassCastException",但是在使用Comparable实现大小关系比较的时候有一点需要特别引起注意:此时要将类中所有的属性都拿来实现大小关系的判断,如果仅仅是使用了部分属性,而这部分属性的内容又正好相同,那么也会认为是同一个对象

 

(9)重复元素的判断:

注意:在JDK1.7以后可以使用Objects类中的hash方法实现hashCode码的生成

Set集合是不允许有重复元素的,那么对于自定义类要想实现不能存储同一元素,那么就要基于Object类中的两个方法来判断:

  • 获取对象编码:public int hashCode () ,首先依据编码来获取数据

  • 对象比较:public boolean equals (Object obj),然后将获取的数据和传入的数据进行比对

66、集合输出:

(1)Iterator迭代输出:

注意:Iterator接口是在JDK1.2的时候提供的专门用于类集数据输出的标准化操作接口

Iterable接口方法:

 

Iterator接口方法:

 

(a)List接口和Iterator接口中remove方法的区别?

如果在使用Iterator接口进行集合输出的时候,使用了list集合中的remove方法删除元素,那么就会出现一个“ConcurrentModificationException”(并发修改问题)的异常,因为在整个集合里面,都会有一个防止多线程访问时数据修改不准确的计数变量,此时如果使用Iterator接口中的remove方法就可以成功删除

(2)ListIterator双向迭代输出:

注意:要实现由后向前的迭代输出则必须先实现由前向后的迭代输出

 

 

(3)Enumeration枚举输出:

注意:想要获得Enumeration接口对象,就只能通过Vector类中的elements()方法获得

注意:Enumeration接口是JDK1.0的时候出来的,下图中有错误

 

 

(4)foreach输出:

注意:在JDK1.5以后为了方便数组和集合的输出,推出了foreach的for循环结构

注意:

  • 集合:之所以集合能够使用foreach结构进行输出,是因为集合都是Iterable的子类,子类中的某个抽象方法中,或者子类中实现了Iterator方法(例如:ArrayList之所以能够使用,是因为其父类AbstractList抽象方法中实现了Iterator方法)

  • 自定义类:如果是自己定义的类要想使用foreach循环遍历,那么就得实现Iterable接口并实现其Iterator方法

  • 数组:之所以数组没有实现Iterable接口,但是还是能使用foreach遍历,是因为java内部将其转换成了对数组的每个下标进行遍历

67、Map接口(二元偶对象集合):

注意:如果要使用自定义的key,那么就必须在自定义key的类中实现hashCode与equals方法

注意:如果hashCode值重复了,那么就会出现hash冲突的问题,java中解决这个问题的方法是“链地址法”就是将重复hashCode值的元素存入同一个链表中

 

(1)HashMap子类:

如果要对HashMap中的key进行排序,就将HashMap转为所有key的Set集合,然后使用比较器进行排序

如果要对HashMap中的value进行排序,就将HashMap转为EntrySet的集合,然后将Set中的元素放入List集合,然后使用sort方法传入比较器进行排序,也可以使用Arrays.sort和Collections.sort

注意:HashMap是无序的,并且键和值都可以为null

注意:当我们使用HashMap(int initialCapacity)来初始化容量的时候,HashMap并不会使用我们传进来的initialCapacity直接作为初识容量。JDK会默认帮我们计算一个相对合理的值当做初始容量。所谓合理值,其实是找到第一个比用户传入的值大的2的幂。()例如传入6,JDK初始的容量为8

注意:HashMap的默认初始元素时16,达到默认的75%阈值的时候就会进行扩容(以16为例,75%是12,所以当存入第13个元素的时候会进行扩容),扩容大小为一倍。所有操作为了保证性能都直接通过移位进行处理

注意:链表在进行数据查询的时候时间复杂度为“O(n)”,二叉树结构的时间复杂度为“O(log以2为底的n)”,当二叉树失去平衡的时候,性能就会下降,所以,从JDK1.8开始,为了保证性能,如果链表长度大于等于8且数组长度大于64的时候(如果链表长度大于8但是数组长度小于64,那么会先进行扩容),就会将链表结构转为红黑树结构。这个判断是在put()方法中调用的内部的putVal()里面

 

 

(2)LinkedHashMap子类:

LinkedHashMap输出数据的顺序和存储数据的顺序一致

 

(3)TreeMap子类:

注意:TreeMap中由于Key作为排序的依据,因此Key不能为空,否则会出现“NullPointExceptin”异常。value值可以为空

特点:TreeMap会对数据自动实现排序效果,要想实现此效果对应的Key实现的子类就必须强制性的实现Comparable接口

 

(4)HashTable子类:

注意:HashTable的key和value都不能为空

 

 

(5)Map.Entry:

注意:Entry接口是定义在Map接口中的,并且是static接口

LinkedList中的Node仅仅是实现单一的数值,而HashMap中的Node继承了Map.Entry接口,可以存放key和value

 

 

(a)Map与Iterator:

注意:要想使用foreach也需要使用entrySet方法先转为Set集合,因为foreach方法需要Iterable接口的支持

注意:Map中有keySet获取全部key的Set集合的方法,使用此方法获取key之后再遍历获取value的值,这样相比使用entrySet方法更加简明,但是时间复杂度来说,entrySet方法获取value的值只需要遍历一次O(n),而使用keySet方法则是O(n)+O(log以2为底的n)

 

 

68、Stack栈:

 

69、Queue队列:

 

Queue中的方法(单端队列):

 

Deque中的方法(双端队列):

 

70、Properties属性文件类:

注意:Properties类是HashTable的子类,也是JDK1.0的时候有的

 

注意:对于资源文件读取有了两种方法,一种是通过Properties类完成,另一种是通过ResourceBundle类完成,ResourceBundle类最大的特点在于可以方便的读取CLASSPATH下的资源文件

71、Collections工具类(JDK1.2):

可以实现集合反转,排序,一次添加多个元素等操作

还可以实现将所有collection转用枚举输出

72、Stream接口:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值