集合
出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
集合与数组辨析
容器长度
集合长度可变
数组长度固定
存储内容类型
集合存储引用数据类型
数组存储任意类型
是否可存储不同类型数据
集合可以存储不同类型数据
数组只能存储相同数据类型
Java中的集合: JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,我们把这些类统称为集合类,它们都位于java.util包中。
分类:
单列集合Collection
List:元素有序、包含重复元素
主要子类:
ArrayList:底层数据结构是数组结构。线程不安全的。所以ArrayList的出现替代了Vector。增删慢,改查快。
LinkedList:底层是链表数据结构。线程不安全的,同时对元素的增删操作效率很高。
Vector:底层数据结构是数组结构。jdk1.0版本。线程安全的。无论增删还是查询都非常慢.已被ArrayList替代
Set:单列结合,无序,元素不得重复。与Collection方法一致。
Set方法取出元素只能使用迭代器。
Set主要子类
HashSet:线程不安全,存取速度快
底层结构为哈希表结构,即区分元素时使用hash值。可以通过hashCode与equals方法的重写,保证元素唯一性。
具体代码体现为:先判断哈希值是否相等,再判断equals方法是否返回true。true则为相同元素,存储元素失败,false则为不同元素,存储元素成功。
TreeSet: 线程不安全,可以对集合中的元素进行排序。
通过Comparable让集合内元素具备比较性
通过Comparator让集合具备比较某种类型元素的能力。
当Comparator与Comparable冲突时,以Comparator作为标准。
LinkedHashSet
在HashSet集合的基础上,使迭代顺序可预测
双列集合Map:键值映射关系
Map集合概念:对应于Collection的单列集合,Map为双列集合,存储的每个元素均为键值对。可以通过键找到该建对应的值。
Map集合无法返回对应的迭代器。其内容需要调用方法进行访问。
主要格式:
Map<k,v>
key - 此映射所维护的键的类型
value - 映射值的类型
主要子类:
HashMap:底层为哈希表结构的Map集合。
Hashtable:底层为哈希表结构的Map集合。
TreeMap:对键进行排序,排序原理与TreeSet相同的Map集合。
LinkedHashMap:可预知顺序的HashMap集合
其他功能接口
迭代器Iterator
Iterator接口:单列集合的迭代器。迭代器会像地震搜救队的方式一样去遍历集合中的每一个元素。
主要方法
boolean hasNext()
E next()
使用固定格式:
格式一:
Collection c = new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
格式二:
for(Interator it = c.iterator();it.hasNext();){
System.out.println(it.next());
}
泛型
泛型:用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递。
泛型的优点:
提高程序的安全性
将运行期问题转移到了编译期
省去了类型强转的麻烦
优化了程序设计
泛型的使用
直接在指定泛型的地方给出明确的数据类型即可
在使用泛型后的集合中,迭代器返回时,可以直接返回该种数据类型对象。
替代了Object类的“任意化”性,避免了程序员必须预知使用时数据类型的情况。
<>里边什么都不写,叫菱形泛型,即前边是什么类型,后边也是什么类型。
泛型的定义
泛型类:在类上定义泛型,类中使用该类型
格式:class 类名<T>{使用T}
泛型方法:在方法上定义泛型,方法内使用泛型,与类无关。
格式:public <T> void method(){使用T}
泛型接口:在接口上使用泛型。
格式:interface 接口名<T>{}
在类实现接口时明确泛型类型
在类实现接口时仍不明确泛型类型,在创建对象时明确泛型类型
泛型通配符:<?>可匹配任意一种数据类型
<?>与<T>的差别
通配符修饰的泛型不能直接使用而<T>可以使用
通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递,如collection的containsAll方法
使用<?>可以完成类型限定,可参见TreeSet
? extends E 限定类型上限
? super E 限定类型下限
Comparable与Comparator用于比较元素
例子:
用迭代器迭代map集合
package cn.itcast;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Test {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("abc", "abc");
hashMap.put("bbc", "abc");
hashMap.put("cbc", "abc");
Set<String> keySet = hashMap.keySet();
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){
String key =(String) iterator.next();
String value = hashMap.get(key);
System.out.println(key + ":u"+value);
}
}
}