Java Collections框架

该框架包含了集合接口以及这些接口的实现类,还有操作这些接口的算法或者工具类。其中List Set Queue Stack和Map都继承自Collection接口,Collection是整个集合框架的基础。
1. Set:表示数学意义上的集合,不允许元素是重复的,因此在存入Set中的对象必须实现equals保证对象的唯一性。其实现类有HashSet和TreeSet,其中TreeSet实现了SortedSet接口,因此是有序的。
2. List:被看做是有序的Collection。按对象进入顺序保存,所以可以对元素的插入和删除位置进行精确的控制。实现类是LinkedList ArrayList 和Vector
3. Map:提供了一个从键到值得映射的数据结构,用于保存键值对。其中的值是可以重复的,但是键是唯一的,不可重复。实现类: HashMap TreeMap LinkedHashMap WeakHashMap等。其中HashMap是基于散列表实现的,因此可以通过对象的hashCode进行快速查询,LinkedHashMap是通过列表维护的,TreeMap是基于红黑树实现的。

迭代器与ConcurrentModificationException

迭代器也是一个对象,其功能是遍历并选择序列中的对象,提供了一种访问容器中的数据但是又不需要暴露容器内部实现的方式。使用容器的iterator()方法就可以返回一个迭代器对象,然后通过其next()就可以遍历,remove()删除,hasNext()判断是否还有元素。

ConcurrentModificationException是在使用迭代器进行遍历容器的时候继续修改容器内容,大多数会出现在多线程的场景中。在调用iterator()获取迭代器的时候,同时会获取该迭代器所遍历集合中对象的个数,每次调用next()的时候需判断当前个数和获取迭代器时得到的个数是否相等,如果不相等,就会抛出这个异常。所以在对容器进行遍历的时候,无论是单线程还是多线程,如果存在对容器的修改,那么可以采用的方法是将需要增删的对象存入其他集合中,待遍历完成之后进行批量操作。

多线程情况下避免ConcurrentModificationException:
1. 使用线程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList等
2. 使用同步代码块,保证并发安全性,但是仅仅对于并发度比较小的情形下有效,并发度高的时候效率低

ArrayList Vector LinkedList

三者都是长度可变数组,其中ArrayList Vector都是基于存储元素的Object[] array来实现的,在内存中存放是连续的,因此支持随机访问。其中扩容的时候ArrayList扩大为原来的1.5倍,而Vector扩大为原来的2倍。两者的区别是线程安全性,ArrayList不是线程安全的,Vector由于增删操作都是直接或者间接同步的,所以是线程安全的

LinkedList是采用双向链表实现,所以不支持随机访问,但是插入效率比较高。同时,该容器不是线程安全的。

HashMap HashTable TreeMap WeakHashMap

HashMap和HashTable的区别:
1. HashMap是HashTable的轻量级实现(非线程安全的实现),都实现了Map接口,但是HashMap允许空的键和空的值
2. HashMap由于含有空的键,因此把HashTable的contains()方法去掉了,而增加了containsKey containsValue
3. HashTable是线程安全的,而HashMap不是,因此HashMap的效率高一点
4. HashTable默认大小是11,增加方式是2*old + 1而HashMap中默认大小是16,扩容时保证是2的指数

TreeMap由于实现了SortMap接口,所以对于保存的记录是按键值有序的。LinkedHashMap是HashMap的实现子类,可以实现输出顺序和输入顺序相同。

WeakHashMap和HashMap类似,只是WeakHashMap中的key采用的是弱引用,也就是说如果WeakHashMap中的键不被外界引用,那么就可以被垃圾搜集器搜集掉。

自定义类型作为HashMap或者HashTable的key需要注意的问题

两个容器对于存放其中的对象都有一个最基本的要求就是不能存放重复的key。也就是每一个key只能唯一的映射一个value,当出现重复的key的时候不会新建一对映射。

因此在使用自定义类型作为key的时候需要注意:
1. 如果需要根据对象的某些属性定义对象的相等关系,那么就需要重写equals方法,而重写了equals方法就必须重写hashCode方法
2. 自定义类作为HashMap或者HashTable的key的时候,最好把类设计为不可变类
3. 如果两个对象相等,那么这两个对象的hashCode是一样的,反之未必。从HashMap或者HashTable的查询和插入过程可以清晰的看出

HashMap插入键值对:
1. 调用key的hashCode方法获取hash值h1,如果h1在HashMap中不存在,那么直接创建键值对
2. 如果h1在HashMap中已经存在,那么通过equals方法,判断所有h1对应的对象是否返回true,如果返回false,那么说明新的key是不存在的,建立键值对,加入
3. 如果equals返回的是true,那么key是已经存在的,将新的value值覆盖旧值

出现2中的情况(hash相同,但是对象不等),说明出现了冲突,冲突处理方式有多种,数据结构中将hash的时候提到过,比如:开放地址法,链地址法,再hash法

HashMap中查找一个value:
通过key的hashCode方法获取key的hash值h1,如果h1对一个的key值有多个,那么就遍历这些hash为h1的key,通过equals方法进行对比,只有equals方法返回为true的时候就找到了。

【Java基础】容器相关推荐

  1. java基础-容器-Set

    Set:set不存重复元素,如果是使用set存储java预定义的Integer,String等类型会很简单,如果是存储自定义类型的数据类型,就必须要重新定义equals()方法以确保set中保存的对象 ...

  2. 太牛了!万文长字:Java基础+网络知识+Linux+数据结构与算法+数据库+系统设计+必会工具+面试指南,一文将Java面试讲解的清清楚楚!

    前言 今天给大家推荐一本PDF文档<Java中高级核心知识全面解析>这份文档总页数:524页.分为八个部分每个部分详细地讲解了核心知识点. 第一部分 扎实的Java基础 (Java基础+容 ...

  3. Java基础知识(九) 容器

    Java基础知识 1. Java Collections 框架是什么 2. 什么是迭代器 3. ArrayList.Vector 和 LinkedList 有什么区别 4. HashMap.Hasht ...

  4. JAVA基础(3)——容器(1)——常用容器分类

    JAVA基础系列规划: JAVA基础(1)--基本概念 JAVA基础(2)--数据类型 JAVA基础(3)--容器(1)--常用容器分类 JAVA基础(4)--容器(2)--普通容器 JAVA基础(5 ...

  5. [Spring 深度解析]第1章 Java基础

    第1章 ◄Java基础► 在学习Spring之前我们需要对Java基础语法有一定的了解,Java中最重要的两个知识点是注解和反射.注解和反射在Spring框架中应用的最广泛.掌握注解和反射,有助于后面 ...

  6. java基础-迭代器(Iterator)与增强for循环

    java基础-迭代器(Iterator)与增强for循环 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Iterator迭代器概述 Java中提供了很多个集合,它们在存储元素时 ...

  7. Java基础语法(数组)

    第4天 Java基础语法 今日内容介绍 u 流程控制语句(switch) u 数组 第1章 流程控制语句 1.1 选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句 ...

  8. 【转】Java基础知识整理

    本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...

  9. Thinking in java基础之集合框架

    Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...

  10. java基础 -- 数据类型,基本程序结构

    JAVA基础概念 程序示例 //public 访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的访问级别 // 关键字 class 表明Java程序中全部的内容都包含在类中,这里只需要将类作为加 ...

最新文章

  1. Jmeter性能测试之if控制器的使用
  2. 数据中心供配电系统负荷计算实例分析
  3. unity2018关联不到vs_原尚股份VS.长久物流,整车物流和零部件物流,谁才是好生意?...
  4. 前端学习(3036):vue+element今日头条管理-复习
  5. 新功能:在负载均衡SLB控制台上查看DDoS安全防护阈值
  6. codeforces Gargari and Permutations(DAG+BFS)
  7. 实时备份工具之inotify+rsync
  8. Outlook Express 自動回信設定
  9. 还在4S店买车?《Boss1+1》张朝阳对话贾鸣镝“种草”购车新方式
  10. 当鼠标移入时切换背景图时闪烁的问题
  11. 我也有了博客了,呵呵~~
  12. easyui自学模板代码
  13. Matlab GUI的文件打开和保存uigetfile uigetdir
  14. 第二章 大数据技术概述
  15. 360路由器远程连接服务器,360路由器设置好了不能上网的解决办法
  16. contiki仿真模拟器cooja的使用
  17. Auto.js Pro安卓免ROOT引流脚本开发系列教程26网易公开课(4)-关注用户
  18. java foreach循环语句_Javaforeach语句
  19. OutLook的临时文件存放位置/打开邮件附件修改并保存附件没有更改
  20. android 仿微信朋友圈发布动态功能

热门文章

  1. python diango 并发_利用gunicorn提高django的并发能力
  2. 无法接收 agent 发出的检测信号_BR-PST系列基桩非金属超声波检测仪的系统延时来源及测试校正方法...
  3. java 不可修改的集合对象_java集合:关于hashmap存储一个对象,中间改变对象的值,为什么再remove不能用新名字来删除...
  4. qstringlist格式怎么写到txt_进阶能力 | 一招解决TXT电子书乱码问题
  5. 怎样做到真实再现传统文化艺术?
  6. 利用AOP实现对方法执行时间的统计
  7. android view控件的显示和隐藏动画效果
  8. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
  9. 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty
  10. Cisco Easy ***综合配置示例