ArrayList 和LinkedList的区别

 
ArrayList
ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象是, 数组的大小也相应的改变。这样就带来以下有缺点:
快速随即访问 你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。
向其中添加对象速度慢 当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
操作其中对象的速度慢 当你要想数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。

LinkedList
LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。 当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点:
操作其中对象的速度快 只需要改变连接,新的节点可以在内存中的任何地方
不能随即访问 虽然存在get()方法,但是这个方法是通过遍历接点来定位的所以速度慢。
https://blog.csdn.net/bestxiaok/article/details/77371780
https://www.cnblogs.com/leeplogs/p/5891861.html
https://blog.csdn.net/HHcoco/article/details/53117525
https://blog.csdn.net/u014136713/article/details/52089156
说白了,就是数据结构中的顺序存储和链式存储 数组和链表的区别 二者都属于一种数据结构 从逻辑结构来看 1. 数组申请的是一块连续的内存空间,编译阶段就确定了空间大小,运行阶段是不允许改变的,
不能适应数据动态地增减的情况。
当数据增加时,可能超出原先定义的元素个数,造成数据越界;当数据减少时,造成内存浪费;
2. 链表动态地进行存储分配,现用现申请,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。
(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素。
从内存存储来看
1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小,数组可以根据下标直接存出数据。
如果要在数组中增加一个
元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。
同样的道理,如果想删除一个元素,
同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦 ,链表是物理上非连续的内存空间,对于访问数据,
需要从头便利整个链表直到找到要访问的数据,没有数组有效,但是在添加和删除数据方面,只需要知道操作位置的指针,
很方便可以实现增删,较数组比较灵活有效率。

从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除
元素就需要用链表数据结构了。


hashmap 是有数组和单向链表组成,当需要扩容的时候,多线程并发现容易导致链形成了闭环,在get的时候就出现死循环,
导致cpu100%,当然没有并发的写的时候,这个问题是不存在的
ConcurrentHashMap是线程安全,HashTable在Java 4中被ConcurrentHashMap取代
https://blog.csdn.net/c929833623lvcha/article/details/8924414?utm_source=jiancool
https://www.cnblogs.com/yelongsan/p/8340047.html
hashcode如何生存的

简单的翻译一下:就是hashcode是通过将内部存储地址映射成一个整型值,这个整型值就是hashcode。

java语言规范对hashcode的实现不做要求,这是JVM的实现。需要注意的是:

对于有些架构(例如64位),内存地址空间超过int的表示范围,所以不同对象地址的映射值必然会有相同的,

所以hashcode不能确定两个是否相等

对于C#,Object.GetHashCode方法的实现同样是基于对象引用(其实就是对象的内部存储地址)来计算。

而且MSDN文档同样明确表明:

.NET Framework 不充当防护措施 GetHashCode 方案的默认值实现,因此,此方法返回的值可能不同于

 .NET Framework 版本和平台之间,如 32 位和 64 位平台。

具体可参考 MSDN-Object.GetHashCode

不管是Java还是C#,hashcode都是应用于hash数据结构。基本上很少使用默认实现,都是用来重载的,

而且二者对hashcode重载的规范也是一致:

1. 如果两个对象equal,则hashcode必须一致
2. 如果两个对象的hashcode一致,但两个对象不一定equal


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值