最近面试发现自己的知识框架有好多问题。明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题。不管了,再巩固下基础知识总是没错的,反正最近空闲时间挺多的,也不打算找工作了。(都是看的网上资料,乱,仅个人笔记)

Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
1、Collection:代表一组对象,每一个对象都是它的子元素。
2、Set(集):无顺序,不包含重复元素的Collection。
3、List(队列):有顺序的collection,并且可以包含重复元素。
4、Map(映射):可以把键(key)映射到值(value)的对象,键不能重复。

java集合:数据结构,在C语言的中庸struct描述,而在面向对象的编程中,数据结构用类来描述并且包含了有对该数据结构操作的方法。
再java中,设计者对常用的数据结构和算法做了一些规范和实现,这些统称为 java集合框架。
Collection:最基本的集合接口,一个Collection代表一组Object(对象),一些Collection 允许相同的元素在一起,而又的不行,一些能排序而一些不能排序;
javaSDK不提供直接继承自Collection的类,提供的类都是继承自Collection的“子接口”如List和Set;

List接口:list是有顺序的Collection,使用此接口能够精确的控制每个元素插入的位置,用户能够使用索引(元素在List中的位置,类似于数组的下标)来访问List中的元素;List允许有相同的元素存在;
List的实现类:LinkedList.ArrayList,Vector,Stack;

1、LinkList:数据结构是链式的线性表(在数据结构笔记中),他实现了List接口,允许NULL存在,此外其提供的get,remove,insert,方法能使LinkedList可被用作栈(stack),队列(queue),或者双向队列(deque);
注意:LinkList没有同步方法,如果多个线程同时访问一个List则需要自己实现同步访问,用同步代码块;

2、ArrayList:数据结构是顺序的线性表,他实现了可变大小的数组,他允许所有元素,包括NULL,每个ArrayList实例都与一个容量,即存储元素的数组的大小这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率(自动增判断长度后增长也会浪费时间的呀!)。
同样:ArrayList没用同步;

3、Vector::实现了一个大小可变的数组和ArrayList相似,但不同的是,Vector是同步访问的,其包含的许多传统方法,这些方法不属于集合框架,由Vector创建的迭代器正在使用,此时被另一个线程改变了Vector的状态,会抛异常,必须捕获;
老的动态数组,效率低,一般不用;由于同步问题,ArrayList 效率 高于Vector;

4、Stack:继承自Vector,实现了一个先进后出的栈结构,刚创建时是空栈;

Set接口:实际上Set就是Collection,只是行为不同,Set不保存重复的元素(用equals());存入Set的每个元素都是唯一的,不保证元素的顺序;

1、TreeSet:实现Set接口,基与TreeMap实现的,数据结构是红黑书(自平衡的排序二叉树,还没接触过),是一种Set的变体,可以实现排序等功能的集合,他在添加元素到集合中时,会自动按照某种比较规则将其插入到有序的对象序列中,并保证“升序”排列;

2、HashSet:实现Set接口,其底层是基于HashMap实现的。HashSet底层采用HashMap来保存所有元素,所有放入HashSet中的元素实际上由HashMap的key来保存,而value则存储了一个静态的Object的类;

Map接口:与List、Set接口不同,他是由一系列键值对组成的集合,提供了key到value的映射,他没继承Collection;
Map接口的实现:HashMap、TreeMap、HashTable、Properties、EnumMap;

1、HashMap:以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,他是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将
所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry()的源码他是一个单链表结构;一般用于单线程程序中(单线程安全);Key和Value都可为空;

2、TreeMap:键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口;(待学红黑树)

3、HashTabl:以哈希表数据结构实现的,解决冲突时与HashMap一样用了散列链表的形式。性能比HashMap低,一般用于多线程中(多线程安全);Key和value都不可为空;

Queue:队列,主要分为两大类,一类是阻塞式队列主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue;一类是双端式队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。

**对集合类的一些比较:
1、Vector与ArrayList比是线程安全的,考虑到这个原因,一般ArrayList效率比较高;如果集合中的元素数目大于目前集合数组的长度,Vector增长率为目前数组的100%,而ArrayList增长率为50%,如果在集合中使用数据量比较大的数据,用Vector有一定的优势;
如果查找一个数据,Vector和ArrayList是相同的;都是采用数组方式存储;
2、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构;对于随机访问get和set,ArrayList优于LinkedList。因为后者需要移动 指针;对于新增和删除数据,LinkList比较占优势,因为ArrayList要移动数据;分数据量;
3、关于HashMap先不写,先看下哈希表;

4、TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的;TreeMap和TreeSet都是非同步集合,可以使用方法Collections.synchroinzedMap()来实现同步;TreeSet中不能有重复对象,而TreeMap中可以存在;TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序);

java中数据存储方式最底层的两种结构,一是数组,另一种是链表,数组的特点:连续空间,寻址迅速,增删慢;链表则正好相反;有没有一种数据结构来综合一下数组和链表,以便 发挥他们各自的优势呢?哈希表;

哈希表(也叫散列表):具有较快(常量级)的查询速度,以及相对较快速的增删速度,所以很适合在海量数据的环境中使用。一般实现哈希表的方法采用“拉链法”,我们可以理解为“链表的数组”;

Java集合类--温习笔记的更多相关文章

  1. java集合类学习笔记之HashMap

    1.简述 HashMap是java语言中非常典型的数据结构,也是我们平常用的最多的的集合类之一.它的底层是通过一个单向链表(Node<k,v>)数组(也称之为桶bucket,数组的长度也叫 ...

  2. java集合类学习笔记1

    一.集合的接口 java集合类库也将接口与实现相分离.首先看一下大家都熟悉的数据结构-队列是如何分离的.队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数.当需要 ...

  3. java集合类学习笔记之LinkedHashMap

    1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...

  4. java集合类学习笔记之ArrayList

    1.简述 ArrayList底层的实现是使用了数组保存所有的数据,所有的操作本质上是对数组的操作,每一个ArrayList实例都有一个默认的容量(数组的大小,默认是10),随着 对ArrayList不 ...

  5. Java集合类学习笔记(Set集合)

    Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...

  6. Java集合类学习笔记2

    二,具体的集合 集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列 ArrayDeque 一种用循环数组实 ...

  7. JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类

    常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...

  8. Java集合类学习笔记(各种Map实现类的性能分析)

    HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的.线程安全的集合,因此HashMap通常比Hashtable要快. TreeMap比HashMap和Hasht ...

  9. Java集合类学习笔记(Map集合)

    Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...

随机推荐

  1. RecyclerView使用大全

    RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...

  2. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. ASP.NET Aries 入门开发教程9:业务表单的开发

    前言: 经过前面那么多篇的列表的介绍,终于到了大伙期待的表单开发了. 也是本系列的最后一篇文章了! 1:表单页面的权限设置与继承 对于表单页面,权限的设置有两种: 1:你可以选择添加菜单(设置为不显示 ...

  4. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  5. video.js

    1.github地址 2.常用API: class : video-js: video-js应用视频所需的风格.js功能,比如全屏和字幕. vjs-default-skin: vjs-default- ...

  6. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  7. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  8. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  9. Web安全相关(四):过多发布(Over Posting)

    简介 过多发布的内容相对比较简单,因此,我只打算把原文中的一些关键信息翻译一下.原文链接如下: http://www.asp.net/mvc/overview/getting-started/gett ...

  10. RIFF和WAVE音频文件格式

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...