目录
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接口: