Java集合类--温习笔记
最近面试发现自己的知识框架有好多问题。明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题。不管了,再巩固下基础知识总是没错的,反正最近空闲时间挺多的,也不打算找工作了。(都是看的网上资料,乱,仅个人笔记)
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集合类--温习笔记的更多相关文章
- java集合类学习笔记之HashMap
1.简述 HashMap是java语言中非常典型的数据结构,也是我们平常用的最多的的集合类之一.它的底层是通过一个单向链表(Node<k,v>)数组(也称之为桶bucket,数组的长度也叫 ...
- java集合类学习笔记1
一.集合的接口 java集合类库也将接口与实现相分离.首先看一下大家都熟悉的数据结构-队列是如何分离的.队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数.当需要 ...
- java集合类学习笔记之LinkedHashMap
1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...
- java集合类学习笔记之ArrayList
1.简述 ArrayList底层的实现是使用了数组保存所有的数据,所有的操作本质上是对数组的操作,每一个ArrayList实例都有一个默认的容量(数组的大小,默认是10),随着 对ArrayList不 ...
- Java集合类学习笔记(Set集合)
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...
- Java集合类学习笔记2
二,具体的集合 集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列 ArrayDeque 一种用循环数组实 ...
- JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类
常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...
- Java集合类学习笔记(各种Map实现类的性能分析)
HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的.线程安全的集合,因此HashMap通常比Hashtable要快. TreeMap比HashMap和Hasht ...
- Java集合类学习笔记(Map集合)
Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...
随机推荐
- 在 ML2 中配置 OVS flat network - 每天5分钟玩转 OpenStack(133)
前面讨论了 OVS local network,今天开始学习 flat network. flat network 是不带 tag 的网络,宿主机的物理网卡通过网桥与 flat network 连接, ...
- 基于OpenCV的车辆检测与追踪的实现
最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...
- x:bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用{x:Bind} 解决办法
这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...
- Vue.js 2.0 和 React、Augular等其他框架的全方位对比
引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...
- app引导页(背景图片切换加各个页面动画效果)
前言:不知不觉中又加班到了10点半,整个启动页面做了一天多的时间,一共有三个页面,每个页面都有动画效果,动画效果调试起来麻烦,既要跟ios统一,又要匹配各种不同的手机,然后产品经理还有可能在中途改需求 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
- JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题
1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- ORA-00821: Specified value of sga_target 3072M is too small, needs to be at least 12896M
在测试PlateSpine克隆的数据库服务器时,由于资源有限,克隆过来的数据库服务器只给了9G的内存,结果在测试时,老是会出现OOMkiller导致宕机,即out of memory killer,是 ...
- 如何安装并简单的使用OwinHost——Katana
微软OWIN的提出必然会引起一场风暴,而我们作为C#阵营中一份子,自然免不了会卷入其中.OWIN是什么东西,我在这里就不解析了,还不知道是OWIN是什么的读者请打开浏览器,然后搜索即可,中文的英文的应 ...