java集合理论(自己理解)

                                                                         list集合(允许重复,允许null)

        list的实现类有arrayList、linkedList、vector。

        arrayList的底层是使用一个动态的数组来存储数据的,因为使用的数组,所以在随机访问数据的性能上比较出色,只需要提供数据的索引便可以准确的找到数据值。但是若进行插入删除的操作其性能就不太好了,因为不管是插入还是删除,都需要将数组中的数据整体进行向前移动或者向后移动,从而造成时间上的损耗。

        linkedList则是使用链表来进行存储数据,使用链表在进行插入删除时只需要改变指针的位置就好了,但是若进行具体的查找则需要从链表的开头进行搜素查询,从而造成了时间上的损耗。

        一般推荐使用arrayList,但是如果需要实现频繁的增删数据则使用linkedList,api就不再介绍,具体可以查看详细的javaapi来学习。

            另外这两个都是线程不安全的(就是在多线程访问的条件下,由于数据的不可见,导致数据的脏读等情况的发生),所以如需要保证多线程的安全,可以使用Collections中的synchornizedxxx()方法来保证。

               集合中比较元素是否相等需要使用equals方法来进行比较,因此集合中的元素需要实现equals方法。

                arrayList实现原理:内部使用数组来封装数据,但是数组可以实现动态的扩容。

                                                                        set集合(不允许重复,允许为null)

                实现类有HashSet,LinkedHashSet,SortSet(接口),treeSet。(都是线程不安全的需要使用collections来保证线程的安全在多线程访问的情况下)

                HashSet,使用hashCode值来计算元素的位置。所以HashSet在查找,增加,删除上有很好的性能,直接根据对象的hashCode值便可以迅速的定位数据。

                LinkedHashSet与HashSet相同只是使用了链表来维护数据的顺序,因此性能略低于HashSet。

                treeSet实现了SortSet接口因此数据的存储上具有一定的顺序,并使用红黑树的数据结构来保存数据,性能低于hashset。

                集合中的对象需要实现equals方法和hashCode方法,一般通过equals若是true,则两者的hashCode值也需要保持相等。

                hashCode的实现方式一般使用Object的hashCode方法并且与上(^)一个随机的数,避免hashCode值重复。    

                推荐使用hashSet,其他的根据项目的情况来决定。

               hashSet实现原理:内部使用hashMap来存放数据,使用hashMap.ketSet()实际上就是获取了一个set集合

                                                    map集合(key不允许重复,允许为null,value可以重负,可以为null)

                实现类hashMap、LinkedHashMap、SortMap(接口)、treeMap、hashTable;

                map与上述的set在细想上是一样的,在这里不在赘述,另外将map中的key抽取出来就是一个set,而把value值抽取出来便是一个list,并且set是在map的基础上封装出来的。所以两者的思想是一样的。

                另外vector和hashTable已经过时,不推荐使用,性能也不太好。但是他们都是线程安全的。

                hashMap的实现原理:

                     hashMap使用了内部类node来表示hashMap中的键值对,node模型实现了Map.entry<k,v>接口,

                    模型中定义了 int hash(key的hash值) k key (键值)v value(值)node<k,v> next(hash冲突时用来解决hash冲突的指针域)。通过这些属性构成了散列表的一个节点。

                    hashMap中的散列表实际上就是 node<k,v>[],是一个node类型的数组,数组中并不是线性存储元素,而是用当前数组的长度^hash(key)

             仅在这里进行理论的叙述,以及底层的实现原理,以供日后复习使用。有不正当的地方欢迎大家指正。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值