java中的常⽤集合类整理⽬录
Collection接⼝
集合的遍历:iterator 接⼝
集合的遍历:增强for循环
List接⼝
ArrayList
Set接⼝
Map接⼝
HashMap
LinkedHashMap
TreeMap
Properties
Collections⼯具类
总结
集合、数组都是对多个数据进⾏存储操作(主要是内存层⾯存储)的结构,简称Java容器。
数组的特点
1.数组初始化以后,长度确定不可变
2.数组定义好,其元素的类型确定不可变(可能有多态性)
3.数组中提供的⽅法有限,对于添加、删除、插⼊数据等操作不⽅便。
4.获取数组中实际元素的个数是没有办法的。
5.数组存储数据的特点是有序、可重复的。
Java集合可分为Collection和Map两种体系,集合存储的优点是解决数组存储数据⽅⾯的弊端。
Collection接⼝:单列数据,⽤来存储⼀个⼀个的对象
List接⼝:元素有序,可重复的集合 --> '动态'数组
Set接⼝ :元素⽆序、不可重复的集合
Map接⼝:双列数据,保存有映射关系(键值对)的集合
Collection接⼝
向collection接⼝的实现类的对象中添加数据obj时,要求obj所在类要重写equals⽅法。Abstract Methods
add(Object e):将元素e添加到集合中
size():获取添加的元素个数
addAll(Collection coll):将形参coll集合的元素添加到当前集合中
clear():清空集合元素,集合仍然存在,只是集合⾥没有元素
isEmpty():判断当前集合是否为空
contains(Object obj):判断当前集合中是否包含obj,是否包含是通过调⽤obj的equals判断containsAll(Collection coll):判断形参coll中的所有元素是否都存在当前集合中。
remove(Object obj):移除某个元素,同样通过equals寻移除的元素
removeAll(Collection coll):从当前集合中移除coll集合中所有的元素,需要调⽤equals函数retainAll(Collection coll):求两个集合的交集,结果为修改当前集合后的集合。
equals(Collection coll):⽐较两个集合是否⼀样。
hashCode():返回当前对象的哈希值
集合的遍历:iterator 接⼝
集合元素的遍历操作:Iterator迭代器接⼝。只能遍历集合Collection,map不⾏
Iterator <E> iterator = coll.iterator();
//⽅式⼀:通过()获得集合元素
<();
//⽅式⼆:循环,不推荐
for(int i =0;i<coll.size;i++){
<();
}
//⽅式三:推荐!
//hasNext():判断是否还有下⼀个元素
while(iterator.hasNext()){
//next():①指针下移②将下移以后集合位置上的元素返回
Object obj = ();
if("Tom".equals(obj)){
//iterator中的remove(),删除集合中的元素
}
}
//⽅法引⽤,Java8新特性
coll.forEach(System.out::println)
集合的遍历:增强for循环
增强for循环⽤于遍历数组和集合(colleciton)
格式:集合元素的类型局部变量:集合
//第⼀个位置,是当前的元素
//第⼆个位置,是遍历的对象
//集合元素的类型局部变量:集合
for(Object obj : coll){}
⾯试题
知识点:增强for只能遍历不能赋值
集合元素的类型局部变量:集合
相当于从集合中取出赋值给局部变量,集合本⾝是没有修改的。
String [] arr = new String[]{"ranan","ranan"}
//普通for循环
for(int i=0;i<arr.length;i++){
arr[i] = "xx"
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]); //输出"xx"
}
//增强for循环
for(String s:arr){
//这⾥的s是局部变量,相当与取出arr[i]的值赋值给了变量s,改变的是s的值
s = "xx";
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]); //输出"ranan"
}
List接⼝
⽐较ArrayList、LinkedList、Vector的异同
java单例模式懒汉和饿汉同:三各类都实现了List接⼝,存储数据的特点相同:存储有序的、可重复异:
ArrayList:List接⼝的主要实现类,线程不安全、效率⾼,底层使⽤Object[]存储,默认扩容为原数组的1.5倍
LinkedList:底层使⽤双向链表存储,对于频繁的插⼊、删除操作效率更⾼
Vector:List接⼝的古⽼实现类,线程安全、效率低,底层使⽤Object[]存储,默认长度为10。默认扩容为原数组的2倍
ArrayList
JDK7
//底层创建了长度是10的object[]数组
ArrayList <Integer> list = new ArrayList<Integer>();//⼀般扩容原来的⼀半,将原数组元素复制到新数组
List add(123) //底层使⽤Object[]数组存储,elementData[0]= new Integer(123)
ArrayList list = new ArrayList(数字)
结论:建议开发中使⽤带参的构造器
JDK8
ArrayList list = new ArrayList() //底层的object[] elementData初始化为{},并没有创建长度为10的数组
懒汉式,底层的object[] elementData初始化为{},并没有创建长度为10的数组,第⼀次调⽤add⽅法时才new创建好数组。后续的添加和扩容操作与jdk7中⼀样。
区别:JDK7中的ArrayList对象的创建类似于单例的饿汉式,⽽JDK8中的类似于单例的懒汉式,延迟了数组的创建,节省内存
LinkedList
LinkedList = new LinkedList()//内部声明了Node类型的first与last,值为null
removeLast():移除最后⼀个元素
List的常⽤⽅法
List集合添加了⼀些根据索引来操作集合元素的⽅法,因为List是有序的
void add(int index,Object ele):在index位置插⼊ele元素
boolean addAll(int index,Collection eles):从index位置开始依次插⼊eles中的所有元素
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中⾸次出现的位置
int LastIndexOf(Object obj):返回obj在集合中最后⼀次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index,Object ele):设置指定index位置的元素为ele
List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的⼦集合
常⽤⽅法
增:add(Object obj)
删:remove(int index)/remove(Obejct obj)
改:set(int index,Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size()
遍历:Iterator迭代器⽅法/增强for循环/普通的循环
集合与数组的转换
集合转换成数组 --> Array()
数组转换成List --> Arrays.asList(new String[]{'AA','BB','CC'})
使⽤场景:⽣成⼀个不可更改的list
Arrays.asList
1.该⽅法适⽤于对象型数据的数组(String、)
2.该⽅法不建议使⽤于基本数据类型的数组(byte,short,int,long,float,double,boolean)
3.该⽅法将数组与List列表链接起来:当更新其⼀个时,另⼀个⾃动更新
4.不⽀持add()、remove()、clear()等⽅法。⽤此⽅法得到的List的长度是不可改变的
List arr = Arrays.asList(new int[]{123,456})会把new int[]{123,456}整体看成⼀个元素,基本数据类型数组会被看成⼀个整体。可以写成 List arr = Arrays.asList(123,456)
Set接⼝
Set接⼝中没有额外定义新的⽅法。
⽐较HashSet、LinkedHashSet、TreeSet
同:都是Set接⼝的实现类,存放数据⽆序、不可重复
HashSet:Set接⼝的主要实现类,线程不安全,可以存放null值,数组+链表存储数据
LinkedHashSet:HashSet的⼦类,遍历其内部数据时可以按照添加的顺序遍历,对于频繁的遍历操作,LinkedHashSet效率⾼于HashSet
TreeSet:数据是同⼀类的,可以按照添加对象的指定属性,进⾏排序。
⽆序性与不可重复性
⽆序性:不等于随机性,存储的数据在底层数组中并⾮按照数组索引的顺序添加,⽽是根据数据的hash值决定。(数组中的存储不是按照添加顺序添加的)
不可重复性:先⽐较添加元素的hash值是否相同,相同按照equals()判断是否重复
HashSet中元素的添加过程
向HashSet中添加元素a
1.先调⽤元素a所在类的hashCode()⽅法,计算a的哈希值。
2.此hash值通过散列函数计算出在HashSet底层数组中的存放位置 + 拉链法解决冲突
散列函数 + 拉链法解决冲突拉链法时要先⽐较hash值再按照equals()判断是否重复,不重复时再链上
要求:向Set中添加的数据,其所在类的⼀定要重写HashCode⽅法和equals⽅法,此两个⽅法尽可能保持⼀致性。(相等的对象必须具有相同的hash值)
注意:
new HashSet()实际上是new了⼀个HashMap,向HashSet添加元素实际上是向HashMap添加元素,在HashSet中添加的元素相当于是HashMap的key,value都指向⼀个对象(这个对象没什么意义)
LinkedHashSet
LinkedHashSet作为HashSet的⼦类,在添加数据的同时,每个数据还维护了两个引⽤指针,遍历其内部数据时可以按照添加的顺序遍历
TreeSet
要求:向TreeSet中添加的数据,要求是相同类的对象作⽤:进⾏排序
遍历的时候会调⽤排序⽅法进⾏⾃动排序。
⾃然排序(Comparable接⼝):⽐较两个对象是否相同的标准为:compareTo()返回0,不再是equals()
定制排序(Comparator接⼝):⽐较两个对象是否相同的标准为:compare()返回0,不再是equals()
Comparator com = new Comparator(){
//定制排序内容
@override
public int compare(Object o1,Object o2){}
}
TreeSet set = new TreeSet(com)
练习题
1.在List内去除重复数字值,要求尽量简单
HashSet常常⽤于过滤重复元素 --> set.addAll(list) --> return new ArrayList(set)
//Person类中重写了hashCode()和equals()⽅法
HashSet set = new HashSet();
Person p1 = new Person(1001,"AA");
Person p2 = new Person(1002,"BB");
set.add(p1);
set.add(p2);
p1.name = "CC";
System.out.println(set);//1001,"CC"  1002,"BB"
set.add(new Person(1001,"CC"));//原来的p1的hash值是按照1001,"AA"计算所得,此时算出来的应该是新的hash值
System.out.println(set);//1001,"CC"  1002,"BB"  1001,"CC"
set.add(new Person(1001,"AA")); //这⾥算出来是p1的hash值,hash值相同调⽤equals⽅法发现不同
System.out.println(set);//1001,"CC"  1002,"BB"  1001,"CC" 1001,"AA"
Map接⼝
Map实现类的结构
HashMap:作为Map的主要实现类,线程不安全,效率⾼。可以存储key/value = null
LinkedHashMap:在遍历map元素时,可以按照添加的顺序实现遍历。原因:在原有的HashMap底层结构基础上添加了⼀对指针,指向前⼀个和后⼀个元素。对于频繁的遍历操作,LinkedHashMap效率⾼于HashMap
TreeMap:保证按照添加的key-value对进⾏排序(key),实现排序遍历,底层使⽤红⿊树
Hashtable:作为古⽼实现类,线程安全,效率低,不可以存储key/value = null
Properties:常⽤来处理配置⽂件,key-value都是String类型
Entry(key,value)⽆序,不可重复(Set)
key⽆序,不可重复,⽤set存储。 --> 不可重复,key所在的类要重写quals()和hashCode() (HashMap为
例)
value⽆序,可重复 --> value所在的类要重写equals,重写是为了实现通过value到key的⽅法
Map中的常⽤⽅法
增删改
Object put(Object ket,Object value):将指定key-value添加到(或修改key的值)当前map对象
void putAll(Map m):将m中的所有key-value对存放在当前map中
Object remove(Object key):移除指定key的key-value对,并返回value
void clear():清空当前的map中的数据,map还在,只是⾥⾯没数据了。map.size()不会报错
Object get(Object key):获取指定key对⽤的value
boolean containsKey(Object key):是否包含指定的key
boolean containsValue(Object key):是否包含指定的key
int size():返回map中键值对的个数
boolean isEmpty():判断当前map是否为空

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。