JAVA集合主要分为三种类型:
Set(集)
List(列表)
Map(映射)
Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set,List)的通用方法。 Set 和List 都继承了Conllection,Map
Collecttion中申明了很多方法,其中包括删除,添加元素,返回一个可以遍历的iterator等等,所以set ,list中可以利用这些方法进行数据的操作,
Set(集合):
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:
HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
set特点:存放的是引用类型,并且是没有重复对象的!
List(列表):
List的特征是其元素以线性方式存储,集合中可以存放重复对象。
List接口主要实现类包括:
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。 访问速度快
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。
Map(映射):
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
结构特点:
ArrayList内部实现是个数组、有序存储。大家知道数组长度不可变,那么append数据消耗可能会比较大,因为可能会需要resize,如果是insert或者remove数据消耗就会比较大,因为需要数组拷贝。但是get速度非常快,因为可以直接找到对应位置,取数据的时候不需要遍历数组!但是线程不安全。
补充:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)
LinkedList 是一个链表实现的List,内部不再有数组。那么对于链表来说添加数据就是打开链条,接上链条,再锁上链条的过程。如果是频发插入数据,比如数据从1条连续插入到10万条,效率可以认为是一样。但是要get数据就比较坑了,通过index并不能直接定位到数据,所以就需要遍历数据了。remove数据也一样,只要任何是设计到index的操作效率都会比较低,除了头和尾,因为LinkedList针对头尾做了缓存。但是插入数据快
例如:RecyclerView的Adapter应该用什么数据结构?我们思考下Adapter的应用场景。通常Adapter不会非常频繁的添加数据,每次滑过RecyclerView都会触发onBindViewHolder,要bind就一定需要从数据源通过index取数据出来,取操作会比较频繁,那我们肯定不能用LinkedList了(但其实考虑到RecyclerView显示数据都是连续的,所以如果用链表来访问临近数据效率反而会更高),又因为Adapter基本上不会出现要去子线程操作数据源的情况。所以也不需要线程安全。剩下的就当然是ArrayList了,而且ArrayList取效率本来就非常高,完全符合需求。
Map是一个键值对数据结构。主要有:HashMap、LinkedHashMap,TreeMap,HashTable,Android里又加了ArrayMap和SparseArray。Map跟List不一样的是不光能存数据了,还能额外多保存一个key,一般的操作方式跟手写的保存差别不大 ,但是效率却没有官方的高。
HashMap:底层是通过数组加链表来实现。为了提高效率。用链条的方式插入数据,提高存的效率。HashMap就可以通过key的hashcode像数组一样的取数据,提高效率!但是数据是无序的。
LinkedHashMap:排序。LinkedHashMap本身就是继承自HashMap,所以增删改查方面和HashMap基本是一致的。区别主要就是通过entrySet遍历了。LinkedHashMap会保存元素的添加顺序然后按顺序遍历,但HashMap就是无序的。
TreeMap:与LinkedHashMap主要区别就LinkedHashMap保存的是元素的插入顺序,而TreeMap则是对key排序。遍历可以得到一个按key排序的结果。
HashTable:内部是个链表,另外就是线程同步。
SparseArray:SparseArray内部依然是使用数组来实现。但是限制了key只能int,而且没有装箱,HashMap的key只能是Integer。所以Sparse性能会更好,它内部做了数据压缩,来稀疏数组的数据,节省内存。取消了装箱拆箱的过程。效率更高。
ArrayMap:ArrayMap内部也是使用数组。查找数据会通过二分法来提高效率,Google推荐用ArrayMap来代替HashMap。
网友评论