外观
集合类
集合类包含Set集合、List列表、Map字典三个接口。
Collection接口
上述三个接口都实现了Collection接口,该接口使用实现类实例化,如ArrayList。该接口的对象有以下几个常用成员方法:
isEmpty():判断收集器是否为空,若为空则返回true,否则返回false。add(E e):将元素e添加到收集器中。该方法有一个返回值,若成功添加则返回true,否则返回false。size(): 返回收集器的元素个数。
package CollectionClasses;
import java.util.ArrayList;
import java.util.Collection;
// Iterator的方法如下:
// boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回 true。
// Object next():返回集合里的下一个元素。
// void remove():删除集合里上一次 next 方法返回的元素。
public class InterfaceCollection {
public static void main(String[] args) {
//本文件演示Collection接口的使用
//因为List Map Set类都是Collection的实现类 因此没有必要使用Collection做实例化对象的类型 使用前三个类即可
//典型的创建接口用实现类实例化
Collection<Object> list = new ArrayList<>();
System.out.println("添加元素之前list集合现在是空的吗? " + list.isEmpty());
list.add(new Object()); //添加一个Object对象
list.add("String"); //添加一个字面值为"String"的字符串
list.add(Math.PI); //添加一个双精度浮点值
System.out.println("list集合现在有几个元素:" + list.size());
System.out.println("添加元素之后list集合现在是空的吗? " + list.isEmpty());
//遍历list
for (Object o : list) {
System.out.println(o);
}
// 本文件仅展示怎么遍历Collection中的元素
}
}运行结果:
添加元素之前list集合现在是空的吗? true
list集合现在有几个元素:3
添加元素之后list集合现在是空的吗? false
java.lang.Object@7f31245a
String
3.141592653589793列表——List
ArrayList
ArrayList是List的一个实现类,该类实现了可变的数组,允许保存所有元素,包括null,可以是用索引位置对集合进行快速访问,缺点是向指定的索引位置添加或者删除对象的速度较慢。
ArrayList伴随一个泛型E,指元素的数据类型。
ArrayList可以使用增强的for循环遍历。
ArrayList类的成员方法如下:
isEmpty():判断数组是否为空,若为空则返回true,否则返回false。add(E e):向数组中添加元素,返回一个布尔值,若成功添加则返回true,否则返回false。size(): 返回数组的元素个数。remove(int n): 将第n个元素移除。set(int n, T e): 将第n个元素修改为e。
package CollectionClasses;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListCollection {
public static void main(String[] args) {
//本文件演示怎么使用List类
//List是一个接口 需要使用实现类实例化
//list集合的两个实现类分别为ArrayList和LinkedList
//ArrayList类实现了可变的数组,允许保存所有元素,包括null,可以使用索引位置对集合进行快速访问
//缺点是向指定的索引位置添加或者删除对象的速度较慢
ArrayList<Object> list1 = new ArrayList<>(); //典型的向上转型
System.out.println("添加元素之前list1现在是不是空集合?" + list1.isEmpty()); //isEmpty()方法判断数组是不是空的
list1.add("蔡徐坤"); //add()方法向数组中添加元素
list1.add("王德发");
list1.add(null);
list1.add(Math.E);
list1.add('A');
System.out.println("添加元素之后list1现在是不是空集合?" + list1.isEmpty());
System.out.println("现在list1的元素个数为:" + list1.size()); //size()方法返回数组内元素的个数
System.out.println("第一次遍历list1"); //遍历元素
//遍历链表
for (Object o : list1) {
System.out.println(o);
}
//下面对集合的元素进行调整
list1.remove(0); //移除第一个元素
list1.set(1, Math.PI); //将第二个元素修改为PI
System.out.println("现在list1的元素个数为:" + list1.size());
System.out.println("第二次遍历list1"); //再次遍历
for (Object o : list1) {
System.out.println(o);
}
System.out.println("-----------------------");
//LinkedList类采用链表形式保存对象
//这种结构的优点是便于向集合中插入或删除对象.但是不便于访问对象,效率较低.
List<Object> list2 = new LinkedList<>();
list2.add("蔡徐坤");
list2.add("鹿晗");
list2.add("123456");
list2.add(3.14);
System.out.println("list2的元素个数为:" + list2.size());
System.out.println("第一次遍历list2");
for (Object obj : list2) { //注意这里使用了增强的for循环便利链表 其实数组也可以
System.out.println(obj);
}
System.out.println("取出第1个元素:" + list2.get(0));
list2.remove("鹿晗");
list2.set(1, "456789");
System.out.println("第二次遍历list2");
for (Object obj : list2) {
System.out.println(obj);
}
}
}运行结果:
添加元素之前list1现在是不是空集合?true
添加元素之后list1现在是不是空集合?false
现在list1的元素个数为:5
第一次遍历list1
蔡徐坤
王德发
null
2.718281828459045
A
现在list1的元素个数为:4
第二次遍历list1
王德发
3.141592653589793
2.718281828459045
A
-----------------------
list2的元素个数为:4
第一次遍历list2
蔡徐坤
鹿晗
123456
3.14
取出第1个元素:蔡徐坤
第二次遍历list2
蔡徐坤
456789
3.14LinkedList
LinkedList类采用链表形式保存对象,这种结构的优点是便于向集合中插入或删除对象,但是不便于访问对象,效率较低。
LinkedList的成员方法与ArrayList类似,这两种存储结构由于都是List的子类,因而方法很相似。这里不再演示。
集合——Set
HashSet
HashSet实现了Set接口,由哈希表支持。它不保证Set集合的迭代顺序,特别是它不保证该顺序恒久不变。该类可以使用null。
HashSet类的成员方法:
add(E e):若集合中不存在元素e则添加元素e,若成功添加返回true,否则返回false。remove(Object o):移除元素o,若成功移除则返回true,否则返回false。size():返回集合中的元素个数。isEmpty():判断集合是否为空,若为空则返回true,否则返回false。
public class DemoHashSet {
public static void main(String[] args) {
//HashSet类实现Set接口,由哈希表支持
//它不保证Set集合的迭代顺序,特别是它不保证该顺序恒久不变
//该类可以使用null
//注:在Person1类中 HashCode()方法被重写了 其仅有id的哈希值相同时就返回true
HashSet<Person1> set = new HashSet<>();
set.add(new Person1(1, "小明"));
set.add(new Person1(2, "小明")); //这个对象的名字虽然和上一个对象的名字相等 但是id的哈希值不同 因此认定是不同的人
set.add(new Person1(1, "小张")); //因为这个对象的哈希值和第一个对象的相同 不会添加
System.out.println("set集合的长度是: " + set.size()); //size()方法可以获取集合中元素的个数
System.out.print("set集合中的元素是: ");
for (Object obj : set) {
System.out.print(obj + " "); //注意看结果
}
}
}运行结果:
set集合的长度是: 2
set集合中的元素是: Person1 [ id=1, name = 小明 ] Person1 [ id=2, name = 小明 ]TreeSet
TreeSet类不仅实现了Set接口,还实现了Java.util.SortSet接口,因此TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排列,也可以按照比较器递增排序。
TreeSet和HashSet的成员方法一致,这里就不赘述了。
字典Map
字典也可以称为映射,字典在初始化时可以指定两个泛型,第一个泛型指键的类型,第二个泛型指值的泛型,由于映射关系中一个键对应一个值,因此必须保证键的唯一性。
HashMap
HashMap基于哈希表,允许使用null值和null键,但必须保证键的唯一性。
HashMap的成员方法:
put(K key, V value):向字典中添加键为key和值为value的映射关系。该方法的返回值为value。size():返回字典中存在的映射关系数量。keySet():返回字典中所有键组成的集合。get(Object key):返回键为key对应的值元素。remove(K key):移除键为key的映射关系。
TreeMap的映射具有一定的顺序,但是读写性能较差,也不能使用null,所以我们一般使用HashMap。
package CollectionClasses;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapCollection {
public static void main(String[] args) {
//这个文件演示了映射的使用
//Map接口的两个实现了分别是HashMap和TreeMap
//HashMap基于哈希表 允许使用null值和null键 但必须保证键的唯一性
//TreeMap的映射有一定的顺序 不可以使用null 性能稍差 建议平时使用时使用HashMap
Map<Object, Object> map = new HashMap<>();
map.put("String", "这是一个字符串"); //put()方法用于添加元素 第一个参数是键 第二个参数是要保存的对象
map.put("Object", new Object());
map.put("int", 1234);
map.put("数字", 1234);
map.put(1, "1");
map.put(null, null);
System.out.println("map中的元素个数:" + map.size()); //size()方法返回此对象元素个数
Set<Object> set = map.keySet(); //keySet方法可以返回映射中所有的键集
for (Object obj : set) {
System.out.println("key = " + obj + " value = " + map.get(obj)); //get()根据键值返回对应元素
}
}
}运行结果:
key = null value = null
key = 1 value = 1
key = Object value = java.lang.Object@7f31245a
key = String value = 这是一个字符串
key = 数字 value = 1234
key = int value = 1234