007Java集合框架+Collection接口API+Iterator迭代器接口+Set接口+List接口+Map接口+Collections工具类

允我心安 提交于 2020-01-25 08:04:47

一.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常用的方法:增(addObject obj))删(remove)改(setint index,Object obj))查(getint 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!