java--集合框架

摘要:
也可以获得所有的key的集合,还可以获得所有的value的集合,还可以获得key和value组合成的Map.Entry对象的集合。栈主要存储基本类型和对象的引用11.java集合类框架的基本接口有什么区别?

1.ArrayList和Vector的区别?

1.vector 的所有方法都是同步(Synchronized)的,是线程安全的(thread-safe)的,而ArrayList是线程不安全的,线程安全是会影响性能,ArrayList 比vector的性能好

2.当Vector或ArrayList元素超过初始大小时,vector会将容量翻倍,而arrayList会扩容50%,因此arrayList或节省空间。

2.ArrayList,vector,LinkedList的存储性能和特征?

1.ArrayListhe 和 Vector的底层数据结构都是数组实现,此元素数大约实际存储的数据以便增加和插入元素,他们都是按照索引下标来保存,每当要插入元素时涉及元素移动内存等操作,所以索引数据看而插入数据慢。

2.Vector的所有方法都是同步的(Synchronized),是最安全的容器,但是性能比ArrayList慢。

3.LinkedList是双向链表实现数据存储(将内存中的零散的空间通过前后引用关联起来,链式存储与数组连续存储相比,内存使用率更高),再插入数据的使用只需要关联数据的前后节点,所以插入数据比较快。

4.Vector属于遗留容器(hashtable,Dictionary,BitSet、Stack,Properties)都不推荐使用,有雨arrayList和LinkedList都是线程不安全的,如果遇到多线程操作容器的时候,可以使用工具类collections.synchronizedList方法 转为线程安全的容器在使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

3.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

1.快速失败(fail-fast)

再用迭代器遍历集合时,如果对集合中的数据进行修改(增加、删除、修改)则会报出Concurrent Modification Exception

原理:迭代器在遍历时直接访问集合中的内容,并且在遍历的过程中使用一个modCount变量。集合再被遍历期间如果内容发生变化,就会改变modCount的值,每当迭代器使用hashNext()/next()遍历下一个元素之前,都会监测monCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。

场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

2.安全失败(fail-safe)

采用安全失败机制的集合容器,在遍历的时候不能直接访问集合上的内容,而是先复制原有的集合,在拷贝的集合进行操作。

原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。

缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

4.HashMap的数据结构?

数组+链表 在链表长度为8时自动转为红黑树

5.HashMap的工作原理是什么?

hashMap是基于hashing原理,我们使用put(key,value)存储到hashMap对象中,使用get(key)从hashmap中获取对象,我们调用put()方法时,先调用hashCode方法,返回的hashCode用于bucket位置来存储entry对象,当hashCode相同时,在调用equals()对比存入链表中。

6.HashMap什么时候进行扩容?

当HashMap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过160.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能

7.List、Map、Set三个接口,存取元素时,各有什么特点?

list和set都是单列集合,共同父类接口collection。

set集合里面 不允许有重复元素

存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。

取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

List表示有先后顺序的集合,

存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(intindex,Object)方法,就可以指定当前对象在集合中的存放位置。

取元素:方法1:Iterator接口取得所有,逐一遍历各个元素

方法2:调用get(indexi)来明确说明取第几个。

Map是双列的集合,存放用put方法:put(objkey,objvalue),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。

取元素:用get(Objectkey)方法根据key获得相应的value。

也可以获得所有的key的集合,还可以获得所有的value的集合,

还可以获得key和value组合成的Map.Entry对象的集合。

8.Set里的元素是不能重复的,name用什么方法区分重复与否?是用==好事equals()?有何区别?

==是比较的对象的地址 equals比较的内容

9.两个对象值相同(x.equals(y)== true)但却有着不同的hashCode?

如果equals相等,那么hashCode一定相等,hashCode相等有可能equlas不相等。

10.heap和stack有什么区别?

heap 堆 先进先出(fifo first-in-first-out)stack栈先进后出(filo first-in-last-out)

java中的堆是一个运行时数据区,用来存放对象实例。栈 主要存储基本类型(bit、short、int、long、double、folat、char、boolean )和对象的引用

11.java集合类框架的基本接口有什么区别?

java--集合框架第1张

12.hashSet和treeSet有什么区别

hashset的数据结构是hash表通过对比对象的hashCode和equlas来判断对象的唯一性

treeset的是一个有序的set结合,是线程不安全的

treeset判断元素的唯一性:根据比较方法的返回结果是否为0,如果为0则表示元素相同,不存;不是0则表示元素不相同,存储;

treeSet对元素的排序:

元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo方法。

元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。

13.HashSet的底层实现原理

HashMap

14.linkedHashMap的实现原理

linkedHashMap 也是基于hashMap实现的,不同的是他定义了一个entry header,这个header 不是放在table里,他是额外独立出来的。linkedHashMap 是继承了hashMap的entry before,after和header结合起来组成一个双向链表,来实现插入顺序和访问顺序。linkedHashMap定义了排序模式accessOrder,该属性为Boolean变量,对于访问顺序为true,对于插入顺序为false,一般不置顶排序的情况下,迭代器遍历默认是插入顺序。

15.为什么集合类没有实现cloneable和Serializable接口

克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化

16.什么是迭代器(iterator)

迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。

17.iterator 和 listIterator有什么区别?

1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

  3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改

18.数组(Array)和列表(arrayList)有什么区别,什么时候应该使用array而不是arrayList?

存储内容比较:

  • Array数组可以包含基本类型和对象类型,
  • ArrayList却只能包含对象类型。

但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。

空间大小比较:

  • 它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
  • ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大约0.5倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。(比较麻烦的地方)。

19.Java集合类框架的最佳实践有哪些?

1.根据应用需要正确选择要使用的集合类型对性能非常重要,比如:假如知道元素的大小是固定的,那么选用Array类型而不是ArrayList类型更为合适。

2.有些集合类型允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以指定初始容量来避免重新计算hash值或者扩容等。

3.为了类型安全、可读性和健壮性等原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。

4.使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。

5.编程的时候接口优于实现

6.底层的集合实际上是空的情况下,返回为长度是0的集合或数组而不是null。

20.comparable和comparator接口是干什么的,他们的区别?

Comparable: 内部比较器,一个类如果想要使用 Collections.sort(list) 方法进行排序,则需要实现该接口

Comparator: 外部比较器用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。(策略模式)

21.collection 和collections的区别?

1.collection是java集合的接口

2.collections是对集合操作的工具类

1) 排序(Sort)

2) 混排(Shuffling)
混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。  

免责声明:文章转载自《java--集合框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Docker Swarm volume 数据持久化cloudera目录位置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP学习(字符串操作)

   在PHP中,字符串的定义可以使用英文单引号' ',也可以使用英文双引号" "。单引号和双引号到底有啥区别呢?  PHP允许我们在双引号串中直接包含字串变量。而单引号串中的内容总被认为是普通字符。PHP中用英文的点号.来连接两个字符串。(注意输出的区别) 1 <?php 2 $i='I'; 3 $love=' Love'; 4 $you=...

cell函数总结

元胞数组:     元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。 关...

ASP数组全集,多维数组和一维数组

ASP数组是比较好用的装载大量数据的容器。1 定义数组 有两种方式:DIM和REDIM。 DIM定义的是固定个数、数据类型的数组;而REDIM则不同,它可以定义不同类型的数据,也可以定义个数并非固定的数据。比较下面几个例子。 都合法的例子: Dim myarray(5,2) Redim myarray(5,2) 前者错误而后者合法的例子: n=10 n=1...

移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传。 这个功能模块主要有这5点比较难:   1手机获取相册的图片文件,拍照的图片文件,通过js 的自带的img对象,获取图片对象。     2.图片的压缩,采用canvas 画布进行压缩图片,...

线上redis慢查询排查

一、背景 最近线上redis集群偶尔会有节点内存瞬间暴增,导致节点down掉情况,调整内存由32G扩增到64G,问题还是会出现,观察监控图发现服务器流量、IO都无明显波动 观察redis日志: 然后在查询慢日志的时候发现了猫腻:   我们先来分析下慢日志的结果: 1) 1) (integer) 10214...

泛型的优点

针对早期版本的通用语言运行时和C#语言的局限,泛型提供了一个解决方案。以前类型的泛化(generalization)是靠类型与全局基类System.Object的相互转换来实现。.NET框架基础类库的ArrayList容器类,就是这种局限的一个例子。ArrayList是一个很方便的容器类,使用中无需更改就可以存储任何引用类型或值类型。 //The .NET...