一.Java集合框架
Java集合概述(java.util包下)
一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另 一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态地把多个对象的引用放入容器中。
Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
数组存储对象的特点:Student[] stu = new Student[20];stu[0] = new Student();弊端,一旦创建,其长度不可变。真实的数组存放的对象的个数是不可知的。
Java集合可分为Collection和Map两种体系
Collection接口:Set,元素无序、不可重复的集合,HashSet、LinkedHashSet、TreeSet。List,元素有序,可重复的集合,ArrayList、LinkedList、Vector。
Map接口:具有影射关系“key-value对”的集合。HashMap、LinkedHashMap、TreeMap、Hashtable(子类-Properties)。
二.Collection接口API
Collection接口方法
1.size():返回集合中元素的个数
2.add(Object obj):向集合中添加一个元素
3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
4.isEmpty();判断集合是否为空
5.clear():清空集合元素
6.contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,否则返回false。判断依据:根据元素所在的类的equals()方法判断。明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法。
7.containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素
8.retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合
9.remove(Object obj):删除集合中obj元素。若删除成功,返回true。否则,返回false
10.removaAll(Collection coll):从当前集合中删除包含在coll中的元素
11.equals(Obiect obj):判断集合中所有元素是否完全相同
12.hashCode():
13.toArray():将集合转化为数组
14.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历
Iterator i = list.iterator();
While(i.hasNext()){
System.out.println(i.next());
}
Collection接口
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既适用于操作Set集合,也可用于操作List和Queue集合。
JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。
在java5之前,java集合会丢失容器中所有对象的数据类型,把所有对象都当成object类型处理;从Java5增加了泛型以后,Java集合可以记住容器中所有对象的数据类型。
三.Iterator迭代器接口
Iterator迭代器接口
//正确的写法
Iterator i = new ArrayList();
While(i.hasNext()){
System.out.println(i.next());
}
//错误的写法
Iterator i = new ArrayList();
While(i.next() != null){
System.out.println(i.next());
}
//使用增强for循环实现集合的遍历
Collection coll = new ArrayList();
for(Object i : coll){
System.out.println(i);
}
//使用增强for循环实现数组的遍历
String str = new String[]{“AA”,”BB”,”CC”};
for(String s : str){
System.out.println(s);
}
四.Collection子接口之一:Set接口
存储的元素是无序的,不重复的。常用的方法都是Collection下定义的。
无序性!= 随机性真正的无序性,指的是元素在底层存储的位置是无序的。
不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
Set set = new HashSet();
Set.add(123);
Set.add(null);
Set.add(“AA”);
Set.add(“AA”);
说明:要求添加进Set中的元素所在的类,一定要重写equals()方法和hashCode()方法,进而保证Set中的元素的不可重复性。
Set中的元素如何存储呢?使用了哈希算法。
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,次哈希值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。
万一返回false呢?都存储(不建议如此)
要求:hashCode()方法要与equals()方法一致。
HashSet(主要实现类)
LinkedHashSet(是HashSet的子类)
使用链表维护了一个添加进集合中的顺序。导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的!
LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
TreeSet
向TreeSet中添加的元素必须是同一个类的。
可以按照添加进集合中的元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺序遍历。
当向TreeSet中添加Person对象时,Person类没有实现Comparable接口时,报ClassCastException。
当向TreeSet中添加自定义的对象时,有两种排序方法:①自然排序②定制排序。
自然排序:要求自定义类实现java.lang.Comparable接口并重写其CompareTo(Object obj)的抽象方法,在此方法中,指明按照自定义类的哪个属性进行排序。
向TreeSet中添加元素时,首先按照compareTo()方法进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象不能添加进来。
compareTo()与hashCode()、equals()方法保持一致。
TreeSet定制排序
五.Collection子接口之二:List接口
List集合里添加了一些根据索引来操作集合元素的方法。
1.void add(int index,Object ele):在指定索引位置index添加元素ele
2.boolean addAll(int index,Collection eles):在指定索引位置index添集合
3.Object get(int index):获取指定索引的元素
4.Object remove(int index):删除指定索引位置的元素
5.Object set(int index,Object ele):设置指定索引位置的元素ele
6.int indexOf(Object obj)返回obj在集合中首次出现的位置。没有返回-1
7.int lastIndexOf(Object obj) 返回obj在集合中最后一次出现 位置。没有返回-1
8.List subList(int fromIndex,int toIndex):从fromIndex到toIndex结束的左闭右开一个子list
注意:List常用的方法:增(add(Object obj))删(remove)改(set(int index,Object obj))查(get(int index))插add(int index,Object ele)长度(size())。
ArrayList(主要实现类),LinkedList(对频繁的插入、删除操作),Vector(古老的实现类、线程是安全的、效率低于ArrayList)。
六.Map接口
Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。
Map中的key和value都可以是任何引用类型的数据。
Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法。
常用String类作为Map的“键”。
key和value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的value。
HashMap(Map主要实现类)
1.Object put(Object key,Object value):向Map中添加一个元素
2.Object remove(Object key):按照指定的key删除此key-value
3.void putAll(Map t)
4.void clear():清空
5.Object get(Object key):获取指定key的value值,若无此key则返回null
6.boolean containsKey(Object key)
7.boolean containsValue(Object value)
8.int size():返回集合的长度
9.boolean isEmpty()
10.boolean equals(Object obj)
如何遍历Map
//1.Set keySet():遍历key集。
Set set = map.keySet();
for(Object obj : set){
System.out.println(obj);
}
//2.Collection values():遍历value集。
Collection values = map.values();
Iterator i = values.iterator();
While(i.hasNext()){
System.out.println(i.next());
}
//3.Set entrySet()如何遍历key-value对
//方式一
Set set = map.keySet();
for(Object obj : set){
System.out.println(obj + “à”+ map.get(obj));
}
//方式二
Set set = map.entrySet();
for(Object obj : set){
Map.Entry entry = (Map.Entry)obj;
System.out.println(entry.getKey() + “à” + entry.getValue());
}
Map map = new HashMap();
HashMap
key是用Set来存放的,不可重复。Value是用Collection来存放的,可重复。一个key-value对,是一个Entry。所有的Entry是用Set存放的,也是不可重复的。向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同。若相同则只能添加后添加的那个元素。
LinkedHashMap(使用链表维护添加进Map中的顺序。遍历Map时,是按添加的顺序遍历的) 。
TreeMap(按照添加进Map中的元素的key的指定属性排序。要求:key必须是同一个类的对象)。
自然排序 vs 定制排序
Hashtable(Properties)
Hashtable是一个古老的Map实现类,线程安全。不建议使用。与HashMap不同,Hashtable不允许使用null作为key和value。与HashMap一样,Hashtable也不能保证其中key-value对的顺序。Hashtable判断两个key相等、两个value相等的标准,与HashMap一致。
注意:Properties:常用来处理属性文件。键和值都为String类型的。
七.Collections工具类
操作集合的工具类Collections是一个操作Set、List和Map等集合的工具类,要与Collection区分开。Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
排序操作(均为static方法)
reverse(List):反转List中元素的顺序
shuffle(List):对List集合元素进行随机排序
sort(List):根据元素的自然顺序对指定List集合元素按升序排序
sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
查找、替换
Object max(Collection):根据元素的自然排序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中最大的元素
Object min(Collection)
Object min(Collection,Comparator)
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
void copy(List dest,List src):将src中的内容复制到dest中
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值
同步控制
Enumeration
来源:CSDN
作者:Smirk513
链接:https://blog.csdn.net/weixin_44145972/article/details/88926173