java集合篇总结

版权声明:本文为博主原创文章,未经博主允许不得转载

一:集合接口的实现类

1.常用集合分为单列集合和双列集合,双列集合就是map映射。
2.单列的集合类的超级接口是Collection,下分为list,set两个子接口,list接口下有ArrayList,linkedList,vector等实现类,set接口下有HashSet,TreeSet等实现类。
3.map接口是所有双列集合的超级接口,下有HashMap,HashTable等实现类。
4.map接口下还有子接口ConcurrentMap,ConcurrentMap下又有实现类ConcurrentHashMap.

二:String介绍与底层

1.String字符串类型,这个类是被Final修饰的,没有任何子类,也不能被我们继承。
2.String的底层是Char类型的数组。
3.String一旦被创建就是固定不变的了,对String对象的任何操作都不会改变原对象。
4.String对象可以通过双引号包裹的常量赋值,也可以通过new实例化对象赋值。
5.常量赋值时内存指向的是常量池,new实例化对象时内存指向的是堆内存。

三:String ,StringBuffer,StringBuilder区别

1.三者字符串的类型都是被Finall修饰的,都不能被继承。
2.String类可以直接常量赋值,也可以实例化对象赋值,而StringBuffer,StringBuilder必须实例化对象。
3.字符串拼接方面,String可以用+号,concat方法进行拼接,每次拼接都会返回新的字符串,开辟新的内存,拼接效率低。
4.StringBuffer,StringBuilder使用append方法进行追加拼接,不会返回新的字符串,不会开辟新的内存。拼接效率高于String.
5.线程安全方面,StringBuffer中使用了Synchronized修饰,线程安全。

四.List介绍与底层以及扩容机制

1.list是集合类中的一个接口,继承了Collection接口。List的实现类有ArrayList,LinkedList,Vector等。
2.list集合中的元素有序可重复并且有下表。
3.ArrayList集合和Vector集合的底层使用Object类型是数组实现的。
4.数组的长度是固定的所以当集合中的元素被装满时,就需要扩容。
5.ArrayList调用无参实例化后是空数组没有长度,当调用增加方法增加元素时,会开辟10个长度,当ArrayList中的元素被装满时会以1.5倍长度扩容,LinkedList底层node节点,记载了本身的值和上一个下一个的相邻元素的位置。
6.LinkedList是一个双向列表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
7.list集合有下表,可以使用for循环,通过下标遍历,也可以使用迭代器Iterator或forEach等不通过下标的方式遍历。

五.ArrayList LinkedList Vector区别

1.ArrayList,LinkedList,Vector都实现类list接口,所以他们中的一部分操作和方法是相同。
2.不同在于底层的数据结构和操作效率上。
3.ArrayList底层使用的是数组式的顺序存储,特点是空间连续,读取操作效率高,一旦进行元素的插入或者移除操作可能会降低效率。
4.LinkedList底层使用的是链式/链表存储 ,空间不连续,通过指针指向下一个元素,读取操作效率低,进行元素的插入或者移除操作效率高。
5.当我们对集合进行较多的读取操作时,建议是ArrayList.
6.当我们对集合进行较多的插入或者移除操作时,建议是LinkedList.
7.Vector有线程锁Synchronized修饰,线程安全,在多线程环境中使用不会造成数据混乱,适合多线程环境使用。

六.set介绍与底层

1.Set是集合类中的一个接口,继承了Collection接口。Set的实现类有HashSet,TreeSet等。
2.Set集合中的元素无序,不可重复,没有下标。
3.Set集合的底层存储方式使用的是Map集合的key来存储的,为Map映射中的key不允许重复,所以Set集合中的元素不能重复。
4.Set集合无下标的特性,我们只能通过迭代器或者ForEach方式进行遍历,不能通过下标对集合进行操作。
5.根据Set元素不重复的特性,去除重复项的操作可以使用Set集合。

七.Map介绍与底层

1.Map是所有双列集合的接口,所有以键值对方式存储的类或接口都实现或继承了Map接口。
2.Map的实现类有HashMap,HashTable等,ConcurrentMap接口也继承了Map接口,Map的存储方式key ,value形式,也就是键值对。
3.Map中的Key不能重复,value可以重复。
4.Map的底层使用数组加链表的方式实现的。
5.数组中的每一项就是一个单向的链表。
6.存储键值对时通过key的hash值获得在数组中的位置,在通过key的eques获得在该数组位置上的链表的位置。通过key定位value。
7.Map在每一次增加一个键值对时都会遍历整个集合,找出是否有和新增的键值对相同的key,如果有就修改这个key上的value,如果没有就将新的键值对加入到集合中。通过这种方式保证key的唯一性。

八HashMap与HashTable的区别

1.HashMap和HashTable都是Map的实现类。方法的使用和底层结构基本相同都是数组加链表。
2.不同的是HashMap是Map的非同步实现,允许Map中出现null的键值。HashMap中的方法是没有同步锁的,如果在多线程的环境下使用需要提供外部同步才能保证数据不混乱。
3.HashTable是Map的同步实现不允许键值为null。HashTable的key或者value一旦为空会出现空指针异常。
4.Hashtable的方法中都拥有Synchronized修饰,当一个线程对Map进行操作时会锁住整个哈希表。保证了HashTable在多线程的环境下使用不会造成数据混乱。
5.HashMap操作效率高于HashTable(例如向HashMap中添加10000个元素需要15ms,HashTable需32ms)

九.怎么使hashMap变的线程安全

1.HashMap没有同步锁,在多线程环境下使用不安全。
2.可以在使用HashMap操作数据的方法或代码块上添加同步锁synchronized,使其在多线程环境下线程排队操作。
3.但是这样会造成效率的下降,因为每次操作数据整个集合都会被锁定。
4.HashTable类的方法中本身就有线程锁。同样HashTable的效率也比较低。
5.ConcurrentMap中使用了分段锁的方式给集合中的部分数据锁定。他将集合中的数据分成多段,每段分别上锁。也就是说当不同的线程操作不同的数据段时不受锁的操作影响,效率上高出HashTable很多

十.Map如何遍历

1.Map是key,value进行存储的。遍历Map大体可分为两个方向。
2.一是先获得keySet,也就是所有的key的值的set集合,在通过遍历key的过程中get出每一个key对应的value,需要使用到Map类中的keySet()方法获得所有的key的Set集合,之后通过Iterator迭代器或者forEach遍历set集合,在过程中使用Map的get(key)方法通过key获得value.
3.第二种方法是借用Map的内部类Entry对象。Entry对象中封装了key和value属性专门对应Map中的key和value.需要使用到Map中的entrySet()方法获得一个包含Map.Entry对象的Set集合。之后通过迭代器或者forEach遍历set集合,在遍历的过程中通过entry对象的getKey()方法获得map中的key,通过getValue()方法获得map中的value.

猜你喜欢

转载自blog.csdn.net/weixin_44914784/article/details/89438873
今日推荐