泛型
概念
泛型概念十分重要,它是程序的增强器,它是目前支流的开发方式。
泛型是(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
发表回复