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. RocketMQ事务消息源码解析

    RocketMQ提供了事务消息的功能,采用2PC(两阶段协议)+补偿机制(事务回查)的分布式事务功能,通过这种方式能达到分布式事务的最终一致. 一. 概述 半事务消息:指的是发送至broker但是还没 ...

  2. CSS——2D转换

  3. Linux下docker安装部署

    Linux下docker安装部署 环境说明 该文档安装环境为CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64 安装说明 安装 ...

  4. uniapp 富文本图片100%显示

    下面的这个方法是在百度上找的,但是老是报错,一直没找到原因,索性自己就挨个检查了下,发现在过滤之前需要对传过来的值进行检测,是字符串才能让这个方法执行 filters: { formatRichTex ...

  5. vue带有参数的路由跳转 动态路由

    先定义好路由在router文件下面创建一个新的文件夹里面写上自己定义的路由 export default {   path: '/detail/:id',   component: () =>  ...

  6. ETL工具-nifi干货系列 第九讲 处理器EvaluateJsonPath,根据JsonPath提取字段

    1.其实这一节课本来按照计划一起学习RouteOnAttribute处理器(相当于java中的ifelse,switch case 控制语句),但是在学习的过程中遇到了一些问题.RouteOnAttr ...

  7. kvm链接克隆虚拟机迁移到openstack机器的实验

    总结 如果是完整克隆的那种虚拟机,是可以直接在openstack使用的,如果镜像格式没问题的话. 因为kvm虚拟机大部分都是链接克隆出来的镜像,不可用直接复制使用,所以需要创建新的镜像文件 创建空盘: ...

  8. EF MYSQL DB FIRST 出现2次数据库名

    环境:使用ADO设计器添加的数据库实体,运行时出现 :Table 'world.world.city' doesn't exist . world 是mysql的演示数据库. MySql.Data.E ...

  9. 订单推送设计思路-基于支付ID而不是订单号来推送

    订单推送设计思路-基于支付ID而不是订单号来推送 方案:不是基于订单号来核销和分账的,抖音是基于每一笔抖音支付来做订单推送,核销和分账现象:这样会在抖音的订单中心中会出现很多条订单推送的记录. 抖音A ...

  10. unity持久化数据之XML和Excel

    unity持久化数据之XML public class XMLDataMananger: Singleton<XMLDataMananger> { protected XMLDataMan ...