泛型
概念
泛型概念十分重要,它是程序的增强器,它是目前支流的开发方式。
泛型是(Generics)是 JDK1.5 的一个新个性,其实就是一个『语法糖』,实质上就是编译器为了提供更好的可读性而提供的一种小伎俩,小技巧,虚拟机层面是不存在所谓『泛型』的概念的。
作用
通过泛型的语法定义,束缚汇合元素的类型,进行安全检查,把谬误显示在编译期
代码通用性更强
泛型能够晋升程序代码的可读性,但它只是一个语法糖(编译后这样的货色就被删除,不呈现在最终的源代码中),对于 JVM 运行时的性能是没有任何影响的。
泛型的 <> 里只能写援用类型。
泛型申明
泛型能够在接口、办法、返回值上应用:
java.util.List 泛型接口 / 类:
public interface Collection<E> {}
泛型办法的申明:
public <E> void print(E e) {}
在办法返回值前申明了一个 <E> 示意前面呈现的 E 是泛型,而不是一般的 java 变量。
罕用名称
l E – Element (在汇合中应用,因为汇合中寄存的是元素)
l T – Type(Java 类)
l K – Key(键)
l V – Value(值)
l N – Number(数值类型)
l ? – 示意不确定的 java 类型
汇合
Collection 接口
概述
英文名称 Collection,是用来寄存对象的数据结构。其中长度可变,而且汇合中能够寄存不同类型的对象。并提供了一组操作成批对象的办法。
数组的毛病:长度是固定不可变的,拜访形式繁多,插入、删除等操作繁琐。
汇合的继承构造
Collection 接口
— List 接口:数据有序,能够反复。
— ArrayList 子类
— LinkedList 子类
— Set 接口:数据无序,不能够存反复值
— HashSet 子类
Collection 接口的共性办法
2.2 List 接口
概述
有序的 collection(也称为_序列_)。此接口的用户能够对列表中每个元素的插入地位进行准确地管制。用户能够依据元素的整数索引(在列表中的地位)拜访元素,并搜寻列表中的元素。
特点
1、数据有序
2、容许寄存反复元素
3、元素都有索引
4、容许寄存多个 null 元素
罕用办法
listIterator()和 iterator()的区别:
listIterator()来自 List 子接口特有的遍历办法,iterator()是来自父接口 collection 的遍历办法; 返回值也是父子关系。
listIterator 子接口中还扩大了逆向遍历的办法 hasPrevious()
ArrayList
概述
1) 存在于 java.util 包中。
2) 外部用数组存放数据,封装了数组的操作,每个对象都有下标。
3) 调用 add()时,才开始主动扩容,外部数组默认初始容量是 10。如果不够会以 1.5 倍容量增长。
4) 查问快,增删数据效率会升高。
5) JDK1.6 里,一旦创立数组对象,就会主动调配 10 个容量。JDK1.8 里,如果不向汇合中存放数据,默认是空数组。
6) ArrayList 实质上是保护了一个 Object[], 能够寄存各种元素。
LinkedList
概述
双向链表,两端效率高。底层是链表,因为不像数组一样,不是间断空间所以不适宜查问,不便增删业务。由 Node 节点组成。
Set 接口
概述
一个不蕴含反复元素的 collection。
数据无序(因为 set 汇合没有下标)。
因为汇合中的元素不能够反复。罕用于给数据去重。
最多蕴含一个 null 元素
特点
HashSet:底层是哈希表,包装了 HashMap,相当于向 HashSet 中存入数据时,会把数据作为 K,存入外部的 HashMap 中。当然 K 依然不许反复。
TreeSet:底层就是 TreeMap,也是红黑树的模式,便于查找数据。
HashMap 实现中,当哈希值雷同的对象,会在同一个 hash 值的地位存储不同属性的数据。
HashSet
概述
此类实现 Set 接口,由哈希表 / 散列表(实际上是一个 HashMap 实例)反对。它不保障 set 的迭代程序;特地是它不保障该程序恒久不变。此类容许应用 null 元素。
HashSet 底层是 HashMap,每次往 HashSet 里存入值时,其实是作为 Key 存入 HashMap 中,这时 HashMap 中,value 值为了什么都能存是 new 了一个 Object。而 Map 中 Key 是不能反复的,所以 Set 里也不能存入反复的值;Map 是无序的,所以 Set 也是无序的。
Map 接口
概述
java.util 接口 Map<K,V>
类型参数:K – 此映射所保护的键的类型 V – 映射值的类型。
也叫哈希表、散列表。罕用于存 键值对 构造的数据。其中的键不能反复,值能够反复.
特点
能够依据键 提取对应的值
键不容许反复,如果反复值会被笼罩
寄存的都是无序数据
初始容量是 16,默认的加载因子是 0.75
原理:
HashMap 中存放数据时,拿着你的数据,开始计算存储地位(哈希算法)。
存储步骤:
1. 这个地位是空的,没存过数据,把数据间接存入数组。
2. 这个地位存过了,有数据了,就会产生哈希碰撞 / 哈希抵触,那么就会造成链表的构造(把新的数据挂载在老数据的上面),链表的构造越长,查问就越慢。JDK1.8 里对链表的查问进行了优化,当链表的长度 >8 时,转成红黑树,当红黑树的长度 <6 时,再转回成链表。
3. 影响 HashMap 性能的两个因素: 初始容量和加载因子。
初始容量: 是指哈希表中桶的数量,也就是数组 (以前是 Entry 数组,当初是 Node 数组) 的容量,初始容量是 16
加载因子: 是指哈希表在其容量主动减少之前能够达到多满的一种尺度,默认是 0.75;当容量超出阈值 (16*0.75) 后,会产生 rehash 的景象(即重建外部数据结构),会主动扩容,大略是原来容量的两倍。咱们应该尽量避免 rehash 的景象,因为须要底层再次开拓空间,初始化,赋值,复制等动作。默认加载因子 (0.75) 在工夫和空间老本上寻求一种折衷。加载因子过高尽管缩小了空间开销,但同时也减少了查问老本。
Collections 工具类
是专门用来给汇合服务的,然而不蕴含 Map