摘要:是哈希表实现的,中的数据是无序的,可以放入,但只能放入一个,两者中的值都不能重复,就如数据库中唯一约束。四和的相同点和区别相同两者都是基于哈希表实现的内部也都是通过单链表解决冲突问题同样实现了序列化和克隆接口区别继承的父类不同。
一.Arraylist与LinkedList有什么区别?
1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高,但是插入和删除操作效率比较低。
2、LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,所以增删的时候其它元素的位置不用移动,增删效率高,但查询时通过指针移动查找,所以查询效率低
1.线程安全问题,vector是java早期就有的,是线程安全的;arraylist是java2才出现,是线程不安全的。因为vector支持多线程操作,所以性能上比不上arraylist
2.集合扩充问题,vector扩容默认增加原来的一倍,Arraylist默认增加原来的0.5倍
(vector可以由我们自己设置增长的大小,arraylist没有提供相关方法
1.TreeSet 是二叉树实现的,Treeset中的数据是自动排好序的,不允许放入null值 。
2.HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 。
相同:
(1)两者都是基于哈希表实现的
(2)内部也都是通过单链表解决冲突问题
(3)同样实现了序列化和克隆接口
区别:
(1)继承的父类不同。AbstractMap和dictionary
(2) 线程安全不同,hashmap不同步,hashtable同步
(3)是否提供contains方法,hashmap不提供contains方法而改成了containsValue和containskey避免误解
(4)key和value是否允许null,前者允许(key为null时放在table[0]),后者不允许。
(5)hash值不同,hashtable直接使用对象的hashcode(),而hashmap重新计算hash,
(6)初始化容量不同,hashtable默认容量11.hashmap16
hashmap内部维护一个存储数据的Entry数组,hashmap采用链表解决冲突,每一个Entry本质上是一个单向链表,当准备添加一个键值对时,首先通过hash(key)方法计算哈希值,然后通过indexFor(hash,length)求出对应的存储位置,然后插入该位置对应的链表头中
六.谈谈fail-fast机制?fial-fast机制是集合中的一种错误机制,当多个线程对同一个集合的内容进行操作时,就可能发生fail-fast事件。例如一个线程对某个集合进行访问的过程,该集合的内容被其它线程修改了,就会抛出currentModificationException异常,产生fail-fast事件。
原理:每次调用next方法,在实际访问前,都会调用checkformodification方法,该方法会检查当前的Modcount值和预期的Modcount值是否相等,如果不等就会抛currentModificationException异常
(1)在单线程遍历过程中,如果要进行remove操作,可以调用迭代器的remove方法而不是集合的remove方法,(因为迭代器的remove方法不能指定元素,只能remove当前遍历过的那个元素,所以调用该方法不会发生fail-fast现象)
(2)使用java并发包(java.util.concurrent)中的类来代替Arraylist和hashmap,比如CopyOnWriteArrayList(COW)写时复制容器,在读写时是线程安全的,该容器在add,remove等操作时,并不是在原数组上修改,而是在原数组上拷贝一份,在新数组上修改,待完成后才将旧数组的引用指向新数组。所以CopyOnWrite容器只能保证数据的最终一致性,并不能保证数据的实时一致性
(1)从速度上看:System.arraycopy > clone > Arrays.copyOf > for
(2)for速度慢是因为每次都要从起点开始寻找指定下标,并且每次循环都要判断是否达到数组最大长度
(3)system.arrayCopy()是一个native方法,(本地方法,即c/c++已经编译成机器码的方法)
事实上,java中只有一维数组,二维数组其实就是一个存放了数组的数组,创建一个二维数组时,一个数组对象所占的空间在堆上被分配,然后这个数组中的每一个元素空间又有一个引用指向另一个数组,这样就构成了一个二维数组
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69160.html
摘要:本文是作者自己对中线程的状态线程间协作相关使用的理解与总结,不对之处,望指出,共勉。当中的的数目而不是已占用的位置数大于集合番一文通版集合番一文通版垃圾回收机制讲得很透彻,深入浅出。 一小时搞明白自定义注解 Annotation(注解)就是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解) 是一个接口,程序可以通过...
摘要:强大的表单验证前端掘金支持非常强大的内置表单验证,以及。面向对象和面向过程的区别的种设计模式全解析后端掘金一设计模式的分类总体来说设计模式分为三大类创建型模式,共五种工厂方法模式抽象工厂模式单例模式建造者模式原型模式。 强大的 Angular 表单验证 - 前端 - 掘金Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 patt...
摘要:接口在类库中有很多具体的实现。接口的意义是为各种具体的集合提供了最大化的统一操作方式。集合类框架的基本接口代表一组对象,每一个对象都是他的子元素不包含重复元素的有序的,可以包含重复元素将映射到的对象,不能重复。 写在之前: 这篇文章是自己面试过程中,总结出来的关于Java集合类的总结。每次面试之前来出来看看,速度快,也能很迅速的回忆一些细节问题。发布这篇文章,不仅仅是希望大家临阵磨枪,...
摘要:写这篇总结,主要是记录下自己的学习经历,算是自己对知识的一个回顾。这个阶段学习的时候,要学会使用开发工具,比如或者来学习。这个阶段需要自己对自己有很强的自律去学习,不要看了一半就放弃了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 写这篇总结,主要是记录下自己的学习经历,算是自己对知识的一个回顾。也给想要学习 ...
阅读 3467·2021-11-12 10:36
阅读 2834·2021-09-22 15:35
阅读 2781·2021-09-04 16:41
阅读 1143·2019-08-30 15:55
阅读 3558·2019-08-29 18:43
阅读 2052·2019-08-23 18:24
阅读 1351·2019-08-23 18:10
阅读 1902·2019-08-23 11:31