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

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. 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态

    最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...

  2. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  3. C语言 · 查找整数 · 基础练习

    问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...

  4. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  5. 【.net 深呼吸】程序集的热更新

    当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...

  6. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  7. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  8. 【从零开始学BPM,Day2】默认表单开发

    [课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...

  9. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...

  10. 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动 ...