关于java:Java-集合

42次阅读

共计 2429 个字符,预计需要花费 7 分钟才能阅读完成。

泛型

概念

泛型概念十分重要,它是程序的增强器,它是目前支流的开发方式。

泛型是(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

正文完
 0