集合类
集合类概述
- java.util包中提供了一些集合类,这些集合类又被成为容器。集合类长度可变,集合用来存放兑现改的引用。
- 常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口。
Collection接口
- 构成Collection的单位成为元素
- Collection接口提供了添加元素、删除元素、管理数据的方法
- 遍历集合通常通过迭代器(Iterator)来实现
例:
package com.lzw;
import java.util.*;
public class Muster { // 创建类Muster
public static void main(String args[]) {
Collection<String> list = new ArrayList<>(); // 实例化集合类对象
list.add("a"); // 向集合添加数据
list.add("b");
list.add("c");
Iterator<String> it = list.iterator(); // 创建迭代器
while (it.hasNext()) { // 判断是否有下一个元素
String str = (String) it.next(); // 获取集合中元素
System.out.println(str);
}
}
}
注意:Iterator的next()方法返回的是Object。Iterator是一个类,iterator是Collection接口的一个方法
List集合
LIst接口
除Collection接口方法外还定义了:
- get(int index): 获得指定索引位置的元素。
- set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象
List接口的实现类
List接口的常用实现类有 ArrayList与 LinkedList。
- ArrayList类实现了可变的数组。 访问对象速度较快
- LinkedList类采用链表结构保存对象。 插入和删除对象效率集合较高
实例化List集合:
List<E> list = new ArrayList<>();
List<E> list2 = new LinkedList<>();
其中,E是合法的Java数据类型。
例:
import java.util.*;
public class Gather { // 创建类Gather
public static void main(String[] args) { // 主方法
List<String> list = new ArrayList<>(); // 创建集合对象
list.add("a"); // 向集合添加元素
list.add("b");
list.add("c");
int i = (int) (Math.random() * (list.size() - 1)); // 获得0~1之间的随机数
System.out.println("随机获取数组中的元素:" + list.get(i));
list.remove(2); // 将指定索引位置的元素从集合中移除
System.out.println("将索引是'2'的元素从数组移除后,数组中的元素是:");
for (int j = 0; j < list.size(); j++) { // 循环遍历集合
System.out.println(list.get(j));
}
}
}
Set集合
-
Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object)
Set接口常用的实现类有HashSet类与TreeSet类。
- HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例) 支持。不保证Set的迭代书序,允许使用null元素
- TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序。
(代码待补充)
Map集合
Map集合提供的是key到value的映射。Map中不能包含相同的key,每个key 只能映射一个value。
Map接口
Map接口中的常用方法
Map接口的实现类
1.Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合添加和删除映射关系效率更高。
实践与练习
- 将1~100之间的所有正整数存放在一个List集合中,并将集合中索引位置是10的对象从集合中移除。
import java.util.*;
class Main {
public static void main(String args[]) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i);
}
// System.out.println(list);
for (int i = 10; i <= list.size(); i = i + 10) {
// 注意List类的大小为size(),并非 length();
list.remove(i);
}
// System.out.print(list);
}
}
2.分别向Set集合以及List集合中添加“A”“a”“c”“C”“a”5个元素,观察重复值“a”能否重复地在List集合以及Set集合中添加。
import java.util.*;
class Main{
public static void mian(String args[]){
Set<Character> set1 = new HashSet<>();
List<Character> list1 = new ArrayList<>();//字符的包装类为 Character
set1.add('A');
set1.add('a');
set1.add('c');
set1.add('C');
set1.add('a');
list1.add('A');
list1.add('a');
list1.add('c');
list1.add('C');
list1.add('a');
//System.out.println(set1);
//System.out.println(list1);
}
}
set集合中不能包含重复的对象,但是用add添加同一个对象并不会报错,而是直接不加入集合中,无视这条语句。
3.创建Map集合,创建Emp对象,并将Emp对象添加到集合中(Emp对象的id作为Map集合的建),并将id为“015”的对象从集合中移除。
import java.util.*;
public class Text {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<>();
Emp emp = new Emp("001", "张三");
Emp emp2 = new Emp("005", "李四");
Emp emp3 = new Emp("004", "王一");
Emp emp4 = new Emp("010", "王一");
Emp emp5 = new Emp("015", "王一");
map.put(emp.getE_id(), emp.getE_name());
map.put(emp2.getE_id(), emp2.getE_name());
map.put(emp3.getE_id(), emp3.getE_name());
map.put(emp4.getE_id(), emp4.getE_name());
map.put(emp5.getE_id(), emp5.getE_name());
map.remove("015");//直接remove(key)
for (String string : map.keySet()) {
System.out.println(map.get(string));
}
}
}
Emp方法就不写了。