java基础之集合,非常重要,非常详细,collection、list、set、map。程序员成长之路。

集合:

一、集合的理解和好处:
1.数组:
(1)长度开始时必须指定,而且一旦创建,不能改变;
(2)保存的必须为同一类型的元素;
(3)使用数租进行增强/删除元素的示意代码–比较码放
//写出Person数组扩容示意代码:

Person[] pers = new Person[1];//大小是1
	per(0) = new Person();
	//增加新的Person对象;
	Person[] pers2 = new Person[pers.length+1];//新创建数组
	for()()//kaobei pers数组的元素到pers2
	pers2[pers2.length-1] = new Person();//添加新的对象
2.集合
(1)可以动态的保存任意多个对象,使用比较方便;
(2)提供了一系列方便的操作对象的方法:add、remove、set、get等;
(3)使用集合添家、删除新元素的示意代码 简洁。
3.集合框架体系:
(1)集合主要分了两组:单列集合 和 双列集合
(2)Collection 接口有两个重要的子接口 List Set,他们的实现子类是单列集合;Map接口的实现子类是双列集合,存放的K-V;
二、Collection
1.Collection接口和常用方法:
(1)collection实现子类可以存放多个元素,每个元素可以是object;
(2)有些Collection的实现类,可以存放重复的元素,有些不可以;
(3)有些Collection的实现类,有些事有序的(List),有些不是有序的(Set);
(4)Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的。
2.常用方法:
(1)add:添加单个元素;
(2)remove:删除指定元素;
(3)contains:查找元素是否存在;
(4)size:获取元素个数;
(5)isEmpty:判断是否为空;
(6)clear:清空
(7)addAll:添加多个元素;
(8)containAll:删除多个元素是否都存在;
(9)removeAll:删除多个元素;
3.迭代器遍历:
(1)Iterator对象成为迭代器,主要用于用于遍历Collection集合中的元素;
(2) 所有实现了Collection接口的集合类型都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器;
(3)Iterator的结构;
(4)Iterator仅用于遍历集合,Iterator本身并不存放对象。
4.for循环遍历:
(1)基本介绍:增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样,只能用于遍历集合或数组。
(2)基本语法:增强for也可以在数组中使用!
for(元素类型 元素名 : 集合名或数组名){
	访问元素
}
三、List
1.List接口和常用方法:list接口是Conllection接口的接口的子接口
(1)List接口类中元素有序(即添加和取出顺序一致),且可重复;
(2)List集合中的每个元素都有其对应的顺序索引,即支持索引;
(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素;
(4)LIst的实现接口常用的有:ArrayLIst、LinkedLIst、和Vector。
2.List接口的常用方法:
(1)void add(int index,Object ele): 在index位置加入ele元素;
(2)boolean addAll(int index , Collection eles)在index位置开始将eles里面的元素都加进来;
(3)Object get(int index):获取指定index位置的元素;
(4)int indexof(Obeject obj): 返回obj在当前集合中首次出现的位置;
(5)int lastIndexof(Obeject obj): 返回obj在当前集合中尾次出现的位置;
(6)Object remove(int index):移除指定index位置的元素,并返回此元素;
(7)Object set(int index,Object ele):设置指定index位置的元素为ele,相当于替换;
(8)List subList(int fromIndex,int toIndex): 返回从fromIndex到toIndex位置的子集合。
3.List的三种遍历方式:	
(1)使用iterator 
iterator iter  = col.iterator ();
while(iter.hasNext()){
	object o = iter.next();
}
(2)使用增强for
for(Object o : col){
	xxx;
}
(3)使用普通for
for(int i=0; i<list.size;i++){
	Object object = list.get(i);
	System.out.println(object);
}
4.ArrayList注意事项
(1)ArrayList可以加入null,并且多个;
(2)ArrayList是由数组来实现数据存储的;
(3)ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高);
5.ArrayList的底层操作机制源码分析
(1)ArrayList中维护了一个Object数组elementData。
(2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果再次扩容,则扩容elementData的1.5倍;
(3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
6.LinkedList的全面说明:
(1)LinkedList底层实现了双向链表和双端队列特点;
(2)可以添加任意元素,可重复,包括null;
(3)线程不安全,没有实现同步。
7.LinkedList的底层操作机制:
(1)LinkedList地城维护了一个双向链表;
(2)LinkedList中维护了两个属性first和last分别指向首节点和尾节点;
(3)每个节点(Node对象),里面又维护了prev,next,item三个属性,其中通过prev指向上一个节点,next指向下一个节点,最终实现双向链表;
(4)所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。
8.ArrayList和LinkedList比较
ArrayList  可变数组	增删效率较低,数组扩容 改查效率较高
LinkedList 双向链表  增删效率较高,通过链表追加 改查效率较低
(1)如果改查的操作多,选择ArrayList;
(2)如果我们增删多,选择LinkedList;
(3)一般来说在程序中基本都是查询,所以大部分情况下使用ArrayList;

四、Set
1.Set接口基本介绍:无序(添加和取出的书序不一致),没有索引;不允许重复元素,所以最多可以有一个null。
2.Set接口常用方法:和List接口一样,Set接口也是Collection的子接口,因此常用方法和Collection接口一样。
3.Set接口的遍历方式:同Collection,可以使用迭代器,增强for,但是不可以使用索引的方式来获取。
4.HashSet的全面说明:
(1)HashSet实现了Set接口;
(2)HashSet实际上是HashMap;
(3)可以存放空值,但是只能有一个null;
(4)HashSet不保证元素是有序的,取决于hash后,在确定索引的结果;
(5)不能有重复数据。
5.HashSet底层机制说明(HashSet底层是HashMap,HashMap的底层(数组+链表+红黑树))
(1)HashSet底层是HashMap;
(2)添加一个元素时,先得到hash值,会转成索引值;
(3)找到存储数据表table,看这个索引位置是否已经存放的有元素;
(4)如果没有直接加入;
(5)如果有,调用equals方法比较,如果相同,就放弃添加 ,如果不相同,则添加到最后;
(6)在java8中,如果有1条链表的元素个数>=TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREEIFY_THRESHOLD(默认是64),就会进行树化。
6.LinkedHashSet的全面说明:
(1)LinkedHashSet是HashSet的子类;
(2)LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表;
(3)LinkedListSet根据元素的hashCode值来决定元素的存储位置,同事使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
(4)LinkedListSet不允许添加重复元素。
7.LinkedHashSet底层机制说明:
(1)在LinkedHashSet中维护了一个hash表和双向链表(LinkedHashSet有head和tail);
(2)每一个节点有pre和next属性,这样可以形成双向链表;
(3)再添加一个元素是,先求hash值,再求索引,确定该元素在hashtable的位置,然后姜添加的元素加入到双向链表(如果已经存在,不添加);
(4)这样的话,我们遍历LinkedHashSet的时候也能确保插入顺序和遍历顺序一致。
五、Map
1.Map接口基本介绍:
(1)Map与Conllection并列存在,用于保存居右映射关系的数据:Key-Value;
(2)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中;
(3)Map中key不允许重复,原因和HashSet一样;
(4)Map中value可以重复;
(5)Map的key可以为null,value也可以为null,注意key为null,只能有一个,value为null,可以有多个;
(6)常用String类作为Map的key;
(7)key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value;
(8)Map存放数据的key-value示意图,一堆k-v就是一个Node中的,有因为Node实现了Entry接口,有些书上也说一对k-v就是一个Entry。
2.Map接口常用方法:
(1)put:添加;
(2)remove: 删除;
(3)get:根据键获取值;
(4)size:获取元素个数;
(5)isEmpty:判断个数是否为0;
(6)clear:清除;
(7)containsKey:查找键是否存在。
(8)keySet:获取多有的键;
(9)entrySet:获取多有关系;
(10)values:获取所有的值。
3.Map接口的遍历方式:
第一组:先取出所有的key,通过key取出对应的value;
Set keyset = map.keyset();
(1)增强for:
for (Object key : keyset){
sestem.out.println(key + “-” + map.get(key));
}
(2)迭代器:
Iterator iterator = keySet.iterator ();
while(iterator.hasNext()){
Object key = iterator.next();
System.out.println(key + “-” + map.get(key));
}
第二组:把所有的values取出:(同Collection)
(1)增强for;
(2)迭代器;
第三组:通过entrySet来获取k - v:
Set entrySet = map.entrySet();
(1)增强for:
for(Object entry : entrySet){
map.Entry m = (Map.entry) entry;
system.out.println(m.getKey() + “-” + m.getValue());
}
(2)迭代器:
Iterator iterator = keySet.iterator ();
while(iterator.hasNext()){
Object entry = iterator.next();
Map.Entry m = (Map.entry) entry;
System.out.println(m.getKey() + “-” + m.getValue());
}
4.Hashmap小结:
(1)Map接口的实现类:HashMap、HashTable;
(2)HashMap是Map接口使用频率最高的实现类;
(3)HashMap是以key-value键值对的方式来存储数据的;
(4)key不能重复,但是value可以;允许null值;
(5)如果添加相同的key,则会覆盖原来的key-value,等同于修改(key不会替换,value会替换)
(6)与HashMap没有实现同步,因此是线程不安全的。
5.HashMap的底层机制:
(1)(k,v)是一个Node实现了Map.Entry<k,v>,查看HashMap的源码可以看到;
(2)jdk7.0HashMap底层实现(数组+链表),jdk8.0底层是(数组+链表+红黑树);
(3)扩容机制与HashSet完全一致;
6.HashTable小结:
(1)存放的元素是键值对:即k-v;
(2)HashTable的键和值都不能为null;
(3)HashTable使用方法基本上和HashMap一样;
(4)HashTable是线程安全的,HashMap是线程不安全的;
六.总结:集合的选择
(1)先判断存储的类型(一组对象(单列)或一组键值对(双列))
(2)一组对象:Collection接口
允许重复:List
增删多:LinkedList【底层维护了一个双向链表】;
改查多:ArrayList【底层维护的是Object类型的可变数组】;
不允许重复:Set
无序:HashSet【底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)】
排序:treeSet
插入和取出顺序一致:LinkedHashSet,维护数组+双向链表;
(3)一组键值对:Map
键无序:HashMap【底层是:哈希表 jdk7:数组+链表;jdk8:数组+链表+红黑树】;
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap;
七.Collections工具类介绍:
(1)Collections是一个操作Set、List和Map等集合的工具类;
(2)Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作;
排序操作:(均为static方法)
(1)revers(List):反转List中元素的顺序;
(2)shuffle(List):对List集合元素进行随机排序;
(3)sort(List): 根据元素的自然顺序对指定List集合元素按升序排序;
(4)sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序;
(5)swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
查找、替换
(1)Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素;
(2)Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素;
(3)Object min(Conllection):根据元素的自然顺序,返回给定集合中的最小元素;
(4)Object min(Conllection , Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素;
(5)int frequency(Collection,Object):返回制定集合中指定元素的出现次数;
(6)void copy(List dest,List src):将src中的内容复制到dest中;
(7)boolean replaceAll(List list ,Object oldVal,Object newVal):使用新值替换List对象的所有旧值。

每日金句分享:人生就要活的漂亮,走的铿锵!自己不奋斗,终归是摆设!

猜你喜欢

转载自blog.csdn.net/m0_52271574/article/details/121312511