本文主要是介绍JAVA集合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 集合
- 1.集合、数组都是对多个数据进行存储操作的结构,简称JAVA容器
- 2.数组在存储多个数据方面的特点:
- 2)数组一旦定义好,其元素的类型也就确定了。只能操作指定类型的数据
- 3)数组中提供的方法有线,对于添加、删除、插入数据非常不方便,并且效率不高
- 3.JAVA集合分为Collection和Map两种体系
- 图示:
- 1.Collection接口:单列数据,定义了存取一对对象的方法的集合
- 1)List接口:元素有序,可重复的集合。(动态数组,与数组的区别是长度可以修改)
- ArraryList 作为list接口的主要实现类,线程不安全,效率高,底层使用Object【】elementDate存储
- jdk7
- ArraryList底层,若容量不够,容量扩容为原来的1.5倍
- 为了避免Arrary的自动扩容, 所以建议开发时使用带参的构造器ArraryList list=new ArraryList(int capacity) 提供初始化容量
- jdk8
- ArraryList list=new ArraryList() 底层object【】elementDate=初始化为{},并没有创建长度为10的数组,第一次创建add方法操作,底层才创建了长度为10的数组,并将元素添加到elementDate数组中,后续的扩容和添加操作和jdk7一样
- LinkedList 对于频繁的插入、删除操作,效率比较高,底层使用双向链表存储
- Vector 作为list接口的古老实现类,线程安全,效率低,底层使用,扩容时默认扩容为原来的二倍,Object【】elementDate存储
- 方法:自定义类需要重写toString和equals方法
- contaions 判断是否包含某个值,若直接new对象,则调用的equals方法
- contaionsAll(Collection coll)
- remove() 移除某个元素 ,判断是否移除,判断的也是equals方法
- removeAll(Collection coll) 从当前集合移除某个集合的共同值(差集)
- retainAll(Collection coll) 交集
- equals(object obj) 比较两个集合是否相等
- 2)Set:元素无序、不可重复的集合。
- HashSet:作为set接口的主要实现类,线程不安全,可以存储null值
- 1.无序性:不是随机性,存储的数据在底层数组中并非按照数组的索引数据进行添加,而是根据数据的哈希值决定的。
- 2.不可重复性:保证添加的元素按照equals()判断,不能返回true相同的元素只有一个、
- 3.添加元素的过程
- 哈希值通过某种算法计算出在HashSet底层数组中的位置()索引位置
- 判断此位置上是否已经有元素
- 如果此位置上有其他元素,比较两个元素的哈希值,2.如果哈希值不相同则添加成功,如果哈希值相同,进而需要比较equals方法,3.若不同,则添加成功,否则添加失败。
- 对于2和3,待添加数据与数组中存在的数据以链表的形式存储(jdk7 jdk8的不同,七上八下)
- LinkedHashset:作为HashSet子类,遍历其内部的数据,可以按照添加的顺序遍历
- 作为HashSet的子类,在原有的基础上,添加了引用,用来对下一个添加的数据进行双向指引(双向链表),对于比较频繁的遍历操作,效率高于HashSet
- TreeSet:可以按照添加对象的指定属性进行排序
- 1.向TreeSet中添加的数据,必须是相同类的对象
- 2.自然排序中(实现comparable接口),比较两个对象是否相同的方法是compareTo返回0,并不是equals方法
- 3.在定制排序中comparator,比较两个对象是否相同的方法是compare方法返回0,不再是eauals方法
- 若想去除list的重复数据,可以将list利用addAll方法添加到set中,从而达到去重的目的,对于自定义类,需要重写equals和hashcode方法
- 当hashset中自定义类对象的属性改变时,其所对应的哈希值也会改变,但是已经创建的位置不会改变
- 2.Map接口:双列数组,保存具有映射关系的”key--value“键值对集合
- 图示:
- Map结构的理解:
- Map中的key:无序的、不可重复。使用set存储所有的key
- Map中的value:无序的、可重复的,使用Collection存储所有的value,
- 一个键值对key:value构成了一个Entry对象
- Map中的entry:无序的、不可重复的,使用set存储所有的entry
- HashMap的底层实现原理
- HashMap map =new HashMap();在实例化以后,底层创建了一个长度为16的一维数组Entry【】table
- 首先,计算key所在类的hashcode值,若经过计算得到的位置上数据为空,则添加成功
- 若此位置上的数据不为空。比较待添加数据和原本数据的哈希值,若哈希值不相同,则添加成功
- 若哈希值不相同,调用equals方法,若不太相同,则添加成功。若相同,则与原来的数据以链表的形式储存
- 当超出临界值时,并且要存放的位置非空时,进行扩容,扩容为原来的二倍,需要重新计算位置(容量不一样可能会导致哈希值不同,导致数据的位置需要重新计算)
- 添加时,若key值位置存在原有的key值,讲原来的vlaue替换为新添加的value值
- jdk8
- LinkedHashMap 能够记录数据添加的先后顺序
- Map常用方法:
- Map的遍历:(不能使用迭代器)
- 1.遍历所有的key集:
- 按照set的方式遍历(迭代器,foreach,for)
- 2.遍历所有的value集
- Collection values=map.values();
- 按照Collection遍历的方式遍历(迭代器,foreach,for)
- 3.遍历Entry数组集:
- 按照set的方式遍历(迭代器,foreach,for),也可以对其进行Entry强转,然后电泳Entry的getKey和getValue方法
- TreeMap:可以对key进行排序(不能对value进行排序)
- 1.自然排序(在自定义类中实现Compareable接口,重写compareTo方法)
- 2.定制排序(创建TreeMap时直接实现Comparator,重写compare方法)
- Hashtable
- Properties用于处理属性文件,它的key和value都是String类型
- getProperty("key") key作为参数会得到一个String类型的value
- 4.Collections工具类
- 1)reverse(list):反转list中元素的顺序,返回void
- 2)shuffle(list):随机排列liest中元素的顺序
- 3)swap(list,Comparator) 默认为其自然排序
- 4)swap(list,int ,int )将list集合中i处元素和j处元素进行交换
- 5)max(collection,Comparator)根据自然排序或指定排序寻找最大值
- 7)int frequency(lsit,Object) 某个元素在list中出现的次数
- 8)void copy(list dest,list src)将src中的内容复制到dest中,首先要将待接受的list进行填充,List dest=Arrays.asList(new object[src.size()])
- 9)synchronizedXxx()即可将线程不安全的Collection或map,转换成线程安全的、
- 总结:
- Map:
- value:无序的、可重复的->Collection存储
- Map中常用的实现类:
- HashMap:作为Map的主要实现类,线程不安全,效率高
- LinkedHashMap:保证遍历map元素时,可以按照添加的顺序实现遍历,原因:在原有的HashMap的底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于频繁的遍历操作,此类效率高于HashMap
- TreeMap:保证按照添加的key-value对进行排序,实现排序遍历使用自然排序或定制排序
- Hashtable:古老的实现类,线程安全,效率低,不能存储nll的key和value,不常用
- Properties:用来处理配置文件。key和value都是String类型
这篇关于JAVA集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!