目录
十、List/列表
十一、 Map
一、概述
所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
二、集合是什么?
Java集合类存放于 java.util 包中,是一个用来存放对象的容器。
注意:
- 集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
- 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
- 集合可以存放不同类型,不限数量的数据类型。
三、Collection<E>/集合
Collection与Collections
- Collection是所有集合类的根接口;
- Collections是提供集合操作的工具类;
集合类和数组不同,
- 数组元素可以为基本数据类型值/对象引用;
- 集合元素只能为对象引用;
Java的集合类由Collection接口和Map接口派生,
- Set代表无序集合,无序不可重复;
- List代表有序集合,有序可重复;
- Map集合存储键值对
ArrayList<E>/数组列表
ArrayList底层有数组支持,通常作为默认首选;当程序频繁进行插入/删除操作时,选用LinkedLIst;如果元素数量固定,可选择真正数组/List/备选;
//我们这里将 ArrayList集合作为 Collection 的实现类
2 Collection collection = new ArrayList();
3
4 //添加元素
5 collection.add("Tom");
6 collection.add("Bob");
7
8 //删除指定元素
9 collection.remove("Tom");
10
11 //删除所有元素
12 Collection c = new ArrayList();
13 c.add("Bob");
14 collection.removeAll(c);
15
16 //检测是否存在某个元素
17 collection.contains("Tom");
18
19 //判断是否为空
20 collection.isEmpty();
21
22 //利用增强for循环遍历集合
23 for(Object obj : collection){
24 System.out.println(obj);
25 }
26 //利用迭代器 Iterator
27 Iterator iterator = collection.iterator();
28 while(iterator.hasNext()){
29 Object obj = iterator.next();
30 System.out.println(obj);
31 }
Iterator<E>/迭代器
Collection 接口的 iterator() 方法返回一个 Iterator。
public interface Iterable<E> { // Iterable泛型接口
Iterator<E> iterator(); // 由继承接口的集合类负责实现,返回一个迭代器
}
- 使用方法 iterator() 要求容器返回一个Iterator .第一次调用Iterator 的next() 方法时,它返回集合序列的第一个元素。
- 使用next() 获得集合序列的中的下一个元素。
- 使用hasNext()检查序列中是否元素。
- 使用remove()将迭代器新返回的元素删除
Set<E>/无序集合/集
Set集合中对象不可重复,因此当试图添加两个相同元素时,add()方法返回false/元素不可加入;
Set集合中对象必须重写hashCode()方法和equals()方法;
Set最大的特性就是不允许在其中存放的元素是重复的
Set set1 = new HashSet();
if(set1.add("a"))
{
System.out.println("OK");
}
if (set1.add("a")) {
System.out.println("OK2");
}
else
{
System.out.println("BAD2");
}
set1.add("000");
set1.add("111");
set1.add("222");
System.out.println("集合set1的内容:"+set1);
System.out.println("集合set1的大小:"+set1.size());
set1.remove("000");
System.out.println("集合set1的内容:"+set1);
System.out.println("集合set1中是否包含000 :"+set1.contains("000"));
System.out.println("集合set1中是否包含111 :"+set1.contains("111"));
Set set2=new HashSet();
set2.add("111");
set2.addAll(set1);//将set1 集合中的元素全部都加到set2中
System.out.println("集合set2的内容:"+set2);
Iterator iterator = set1.iterator();//得到一个迭代器
while (iterator.hasNext()) {//遍历
String element =(String) iterator.next();
System.out.println("iterator = " + element);
}
//将集合set1转化为数组
Object s[]= set1.toArray();
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
HashSet<E>/散列集
- 添加元素时,调用hashCode()方法计算对象的hashCode值;
- 根据hashCode值决定对象的存储位置—>元素存储顺序和添加顺序可能不一致(LinkedHashSet可保证);
- HashSet判断元素相等的标准:equal()方法相等/hashCode()方法返回值相同;
- Hash算法/哈希/散列:通过计算元素的hashCode值获取元素的存储位置—>价值在于存取/查找速度快
- 与数组相比,HashSet索引不需要连续,可自由增加HashSet长度;
Set set1 = new HashSet();
Set set2 = new LinkedHashSet();
for(int i =0 ; i<5 ;i++)
{
int s = (int)(Math.random()*100);
set1.add(new Integer(s));
set2.add(new Integer(s));
System.out.println("第 "+i+" 次随机数产生为:"+s);
}
System.out.println("未排序前HashSet:"+set1);
System.out.println("未排序前LinkedHashSet:"+set2);
//使用TreeSet来对另外的Set进行重构和排序
Set sortedSet = new TreeSet(set1);
System.out.println("排序后 TreeSet :"+sortedSet);
LinkedHashSet<E>
HashSet的子类,LinkedHashSet也是根据元素的hashCode值决定其存储位置;
同时使用链表维护元素的添加次序—>性能略低于HashSet的性能;
TreeSet<E>/树集
TreeSet实现SortSet接口,
TreeSet采用红黑树(red-black tree)存储集合元素,排序规则支持自然排序/定制排序;
TreeSet存储对象必须实现Comparable接口
List<E>/列表
Java中所有链表底层都是双向链接(doubly linked);
List额外提供listIterator()方法,该方法返回一个ListIterator对象,用于遍历List;
ListIterator的set(obj)方法用新元素obj覆盖next()/previous()返回的上一个元素,可以双向移动;
方法:
- void add(int index, Object element) :添加对象element到位置index上
- boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
- Object get(int index) :取出下标为index的位置的元素
- int indexOf(Object element) :查找对象element 在List中第一次出现的位置
- int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
- Object remove(int index) :删除index位置上的元素
- Object set(int index, Object element) :将index位置上的对象替换为element 并返回老的元素。
Map
数学中的映射关系在Java中就是通过Map来实现的。它表示,里面存储的元素是一个对(pair),我们通过一个对象,可以在这个映射关系中找到另外一个和这个对象相关的东西。
- KeySet()遍历实质:遍历两次,第一次转为Iterator对象,第二次从Map中去除key对应的value;
- entrySet()遍历实质:只遍历一次就把K,V放入entry中,效率较KeySet()更高;
HashMap<String, String> hm = new HashMap<String, String>();
//试图将2个key为null的key-value对放入HashMap中
hm.put(null , null);
hm.put(null , null);
//将一个value为null的key-value对放入HashMap中
hm.put("a" , null);
hm.put("a" , "b");
//输出Map对象
System.out.println(hm);