1,java集合体系

2,Colletion集合

子接口有List和Set

(1)List接口:ArrayList,Vector,LinkedList

list是collection接口的子接口,特点是元素有序(是指存取有序,不是元素排列按照某种规则排序)可重复,

 A:ArrayList:底层是一个数组开始在初始化的时候是0,但add的时候,默认会变成10,扩容的话,每次扩容是                                   原来的1.5倍,因为底层是数组,通过下标查询,所以查询会比较快,删除比较慢。

B:Linkedlist:底层是一个双向链表,就是带头结点和尾结点的双向链表,提供了两种插入方式,一个是头插                                      (linkedfirst)一个是尾插(linkedlast),由于是链表,他比较适合增删改操作。但是查询慢,主要是因为在                                  查询过程中,由于底层是链表,查询的时候它会从第一个开始一个一个比较,这样会导致很慢。

C:Vector:底层数据结构是数组,查询快,增删慢,实现原理基本和arraylist一样,有点区别的是vector在实现                                       的时候,方法都加了synchronized锁,这是为了保证在多线程环境下保证其安全性,但就是由于线程是                                          安全的,效率也会变慢,扩容大小是原来的2倍。

一般情况下,我们也不会使用,而是使用collections工具类的synchronizedLsit方法解决arraylist的线程安全                                   问题。

(2)   Set集合:hashset(子类:LinkedHsahSet),treeset

Set集合的特点是元素不重复无序的。

A:Hashset:源码解析,哈希表结构。而哈希表结构底层依赖:hashCode()和equals()方法。(或者是基于HashMap)

进入add方法

 public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

看源码可以看出return一个map的put方法,put方法传进来的e,其中value是一个常量PRESENT

 public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

首先比较哈希值,如果相同,继续走。比较地址值或者走equals(),如果不同,就直接添加到集合中

按照方法的步骤来说:

先看hashCode()值是否相同,

相同:继续走equals()方法,返回true: 说明元素重复,就不添加,返回false:说明元素不重复,就添加到集合

不同:就直接把元素添加到集合, 如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。 而String类重写了        hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

B:TreeSet:能够对元素按照某种规则进行排序。

排序有两种方式: A:自然排序, B:比较器排序,TreeSet集合的特点:排序和唯一

通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。

C:LinkedHashSet:底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性,链表保证元素有有序。

3,Map集合:键值对的方式存贮,键唯一,值可重复

子实现类:hashmap(子类:linkedhashmap),treemap,hashtable,

(1)Hashmap:他的底层结构在1.7和1.8有点不一样,1.7的话底层数据结构是一个单链表和数组。1.8之后底层                                    结构式单量表和数组,但是单链表的长度大于等于八的时候,单链表会向红黑树转化,如果红黑树的节点                                      树小于等于六的时候,它又会转到单链表。1.7的时候吧,put的时候,是头插,会有个resize的过程,会形成一个                                   环形链表导致死循环,1.8的时候改成尾插了。一般put的时候,第一次会根据key的值计算hash值,通过hash                                值得到元素所在的数组的下标如果已经有其他元素,在这个位置的元素就会以链表的形式存在,新加入放在头部                            (1.8是在尾部),如果不存在,就放在数组的该位子上面。

(2)Treemap:TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据                                    创 建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的本质是R-B Tree(红黑                                     树),它包含几个重要的成员变量: root, size, comparator。

root 是红黑数的根节点。它是Entry类型,Entry是红黑数的节点,它包含了红黑数的6个基本组成成分:                                        key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排                                    序,Entry节点包含的内容为value。  红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是                                    根据比较器comparator来进行判断 的。size是红黑数中节点的个数。

(3)Hashtable:基于哈希表的Map结构的实现,线程安全,内部映射无序,不允许值为null的key和value。

(4) Linkedhashmap他的hashmap的子实现类,LinkedHashMap可以认为是HashMap+LinkedList,也就                                   是说,它使用HashMap操作数据结构,也用LinkedList维护插入元素的先后顺序.LinkedHashMap的实现思想就是                                多态, 理解LinkedHashMap能帮助我们加深对多态的理解.

   4,迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序                                        列 的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

 5,Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元                                      素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也                                可以从List中插入和删除元素。

    6. Iterator 和 ListIterator 有什么区别?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索                                 引,等等。

java集合解析的更多相关文章

  1. java 集合解析

    Set集合,放的元素不能重复,请问它的判断重不重复是怎么实现的? 比如说:ArrayList 和 Vector 是用数组的方式存储的Set里的 hashSet 和TreeSet是用什么方式存储的?怎么 ...

  2. Java 集合深入理解(3):Collection

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...

  3. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  4. Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

    概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...

  5. Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

    概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...

  6. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  7. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  8. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  9. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  10. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. C# 借助NPOI 完成 xls 转换为xlsx

    背景:MinExcel开源类库,导数据的库,占用内存很低,通过io,不通过内存保存,不支持 xls格式的文件,支持csv和xlsx,所以要想使用这个库,就得把xls格式转换为xlsx.只复制了数据 合 ...

  2. win11如何调解屏幕亮度【win10刚刚升级win11】?

    打开电脑后鼠标右键,点击个性化 点击系统 点击屏幕亮度 滑动按钮,调解屏幕亮度即可

  3. 最小生成树Kruskal算法的实现原理

    到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...

  4. Django项目目录结构

  5. HTML——结构和标签格式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. mysql binlog查看指定数据库

    1.mysql binlog查看指定数据库的方法 MySQL 的 binlog(二进制日志)主要记录了数据库上执行的所有更改数据的 SQL 语句,包括数据的插入.更新和删除等操作.但直接查看 binl ...

  7. 2D 3D 景深 动画 阴影

    2D 二维的平面空间,让元素在X轴或者Y轴进行变化 2D里面的功能函数 2D-位移 2D-旋转 2D-缩放 2D-倾斜 变形属性 transform:: 位移:transform:translate( ...

  8. kettle从入门到精通 第十八课 kettle Metadata Injection

    1.Metadata Injection 类似于java里面的模版,设置通用的模版,通过输入不同的数据,得到不同的结果.本示例演示两个字段拼接成一个新字段. 2.设置模版,设置模版时,只需要根据自己的 ...

  9. 使用Logstash同步Mysql到Easysearch

    从 MySQL 同步数据到 ES 有多种方案,这次我们使用 ELK 技术栈中的 Logstash 来将数据从 MySQL 同步到 Easysearch . 方案前提 MySQL 表记录必须有主键,比如 ...

  10. Codeforces Round 923 (Div. 3) 比赛记录

    Codeforces Round 923 (Div. 3) 这是我第二次参加 cf阴间场. 10 minutes ago: 这次报名人数超过 4 万,一开始网站就崩溃了,比赛延迟了 10 分钟..开局 ...