4.3.3 查询元素
我们知道了ArrayList 通过 get方法来查询元素,但HashSet没有提供类似的get方法来查询元素。
这里我们介绍一个迭代器(Iterator)接口,所有的Collection都实现了Iterator接口,它可以以统一的方式对各种集合元素进行遍历。我们来看下Iterator接口的常用方法:
hasNaxt() 方法检测集合中是否还有下一个元素;
next()方法返回集合中的下一个元素;
iterator():返回此集合中元素的迭代器。
实例如下:
实例演示
package com.caq.oop.demo08; import java.util.Set; import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { //实例化一个新的空集 Set<String> hashSet = new HashSet<>(); //向hashSet集中依次添加元素 hashSet.add("Monkey"); hashSet.add("Tiger"); hashSet.add("Dog"); hashSet.add("Cat"); System.out.println("hashSet中的内容为:" + hashSet); //获取hashSet中元素的迭代器 Iterator<String> iterator = hashSet.iterator(); System.out.println("迭代器的遍历结果为:"); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
运行结果:
hashSet中的内容为:[Monkey, Cat, Dog, Tiger] 迭代器的遍历结果为: Monkey Cat Dog Tiger
4.3.4 自定义类的常用操作
请查看如下实例:
实例演示
package com.caq.oop.demo08; import java.util.Iterator; import java.util.Set; import java.util.HashSet; public class Test { static class NBA{ private String name; private String positon; public NBA(String name, String positon) { this.name = name; this.positon = positon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPositon() { return positon; } public void setPositon(String positon) { this.positon = positon; } @Override public String toString() { return "NBA{" + "name='" + name + '\'' + ", positon='" + positon + '\'' + '}'; } public static void main(String[] args) { Set<NBA> hashSet = new HashSet<>(); //实例化三个NBA对象 NBA nba1 = new NBA("Kobe","SG"); NBA nba2 = new NBA("LBJ", "SF"); NBA nba3 = new NBA("Pual", "PG"); //新增元素 hashSet.add(nba1); hashSet.add(nba2); hashSet.add(nba3); //使用Iterator遍历hashSet Iterator<NBA> iterator = hashSet.iterator(); System.out.println("迭代器的遍历结果为:"); while (iterator.hasNext()) { System.out.println(iterator.next()); } //查找并删除 if (hashSet.contains(nba1)){ hashSet.remove(nba1); } System.out.println("删除name为Kobe的对象后,集合元素为:"); System.out.println(hashSet); } } }
运行结果:
迭代器的遍历结果为: NBA{name='Pual', positon='PG'} NBA{name='LBJ', positon='SF'} NBA{name='Kobe', positon='SG'} 删除name为Kobe的对象后,集合元素为: [NBA{name='Pual', positon='PG'}, NBA{name='LBJ', positon='SF'}]
为了方便演示,我们定义了一个静态内部类ImoocStudent,它有两个属性nickname和position,定义了属性的getter和setter,并重写了toString()方法。在main()方法中,我们实现了自定义类在HashSet中的增删改查,使用迭代器可以遍历元素。
5. Map 集合
5.1 概念和特性
我们已经知道Map是以键值对(key-value)的形式存储的对象之间的映射,key-value是以java.util.Map.Entry类型的对象实例存在。
可以使用键来查找值,一个映射中不能包含重复的键,但值是可以重复的。每个键最多只能映射到一个值。
5.2 HashMap 实现类
HashMap是java.util.Map接口最常用的一个实现类,前面所学的HashSet底层就是通过HashMap来实现的,HashMap允许使用null键和null值。
5.2.1 构造方法
HashMap():构造一个新的空映射;默认的初始容量为 16(最常用),负载系数为 0.75;
HashMap(int initialCapacity):构造一个新的空映射; 具有指定的初始容量,负载系数为 0.75;
HashMap(int initialCapacity, float loadFactor):构造一个新的空映射; 支持的 HashMap 实例具有指定的初始容量和指定的负载系数;
HashSet(Map<? extends K, ? extends V> m):构造一个新映射,其中包含指定映射相同。
5.2.2 常用成员方法
void clear():从该映射中删除所有映射;
Set<Map, Entry<K, V>> entrySet:返回此映射中包含的映射的集合;
V get(Object key):返回指定键映射到的值,如果该映射不包含键的映射,则返回 null;
Set<K> keySet:返回此映射中包含的键的结合;
V put(K key, V value):将指定值与此映射中指定键关联;
V remove(Object key):如果存在,则从此映射中删除指定键的映射。
Collection<V> values:返回此映射中包含的集合。
5.3 实例
下面我们使用 HashMap 来实现一个英汉字典的例子。
实例演示
package com.caq.oop.demo08; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); //添加数据 map.put("Monkey", "猴子"); map.put("Tiger", "老虎"); map.put("Rabbit", "兔子"); //打印map System.out.println(map); //删除key为monkey的数据 map.remove("Monkey"); System.out.println("删除键为Monkey的映射后,map内容为:"); System.out.println(map); //修改元素 map.put("Tiger", "老鼠"); System.out.println("修改键为Tiger的值后,Tiger=" + map.get("Tiger")); // 遍历map System.out.println("通过遍历entrySet方法得到 key-value 映射:"); Set<Entry<String, String>> test = map.entrySet(); for (Entry<String, String> entry : test) { System.out.println(entry.getKey() + "-" + entry.getValue()); } // 查找集合中键为 Rabbit 对应的值 Set<String> keySet = map.keySet(); for (String key : keySet) { if (key.equals("Rabbit")) { System.out.println("Rabbit 键对应的值为:" + map.get(key)); break; } } } }
运行结果:
{Monkey=猴子, Rabbit=兔子, Tiger=老虎} 删除键为Monkey的映射后,map内容为: {Rabbit=兔子, Tiger=老虎} 修改键为Tiger的值后,Tiger=老鼠 通过遍历entrySet方法得到 key-value 映射: Rabbit-兔子 Tiger-老鼠 Rabbit 键对应的值为:兔子
实例中,Map 的 key 是字符串类型,value 也是字符串类型。值得注意的是,我们在创建HashMap的时候,在Map类型的后面有一个<String, String>,分别表示映射中将要存放的 key 和 value 的类型都为 String 类型。在遍历映射的时候,我们调用了entrySet方法,它返回了此映射中包含的映射的集合。通过键查找值,我们可以调用keySet方法来获取映射中的键的集合,并且遍历这个集合即可找到对应键,通过键就可以获取值了。
6. 小结
Java 的集合,它们定义在java.util包中,Java 中的集合主要有Collection和Map两大接口。
List集合是元素有序并且可以重复的集合;
Set集合是元素无序并且不可以重复的集合;
Map是以键值对(key-value)的形式存储的对象之间的映射,它们都支持泛型。
我们分别介绍了 3 个接口常用的实现类的用法。
这是重点,需要多多进行编码练习。