目次
6.1 TreeMapケース1:キーは文字列で、値は文字列です
6.2 TreeMapケース2:キーはStudentで、値はStringです
7.2 List、Set、Mapおよびその他のインターフェースはMapインターフェースから継承しますか?
1.マップコレクションの特徴
- キーを値にマップするオブジェクト
- マップに重複するキーを含めることはできません
- 各キーは最大で1つの値にのみマップできます
2.Mapコレクションの機能の概要
2.1機能の追加
- V put(K key、V value):要素を追加します
2.2削除機能
- V remove(Object key):キーに応じてキーと値のペア要素を削除し、値を返します
- void clear():すべてのKey-Value要素を削除します
2.3判定機能
- boolean containsKey(Object key):コレクションに指定されたキーが含まれているかどうかを判別します
- boolean containsValue(Object value):コレクションに指定された値が含まれているかどうかを判別します
- boolean isEmpty():コレクションが空かどうかを判別します
2.4長さ関数
- int size():コレクション内のキーと値のペアの対数を返します
2.5関数の取得
- Set <K> keySet():セット内のすべてのキーのセットを取得します
- V get(Object key):キーに応じて値を取得します
- Collection <V> values():コレクション内のすべての値のコレクションを取得します
- Set <Map.Entry <K、V >> entrySet():キーと値のペアオブジェクトのコレクションを返します
3.マップコレクションのトラバーサル
3.1キーに基づいて値を見つける
分析手順は次のとおりです。
- すべてのキーを取得します
- キーのセットをトラバースし、各キーを取得します
- キーに基づいて値を見つける
コードの一部は次のとおりです。
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 向集合中添加元素
map.put("杨过", "小龙女");
map.put("杨康", "穆念慈");
map.put("郭靖", "黄蓉");
map.put("杨玄风", "梅超风");
// 获取集合中所有键的集合
Set<String> set = map.keySet();
// 遍历set,得到每一个key
for (String key : set) {
// 根据键去找值
String value = map.get(key);
System.out.println(key + "---" + value);
}
3.2キー値に基づいてオブジェクトのキーと値を見つける
分析手順は次のとおりです。
- すべてのキーと値のペアのコレクションを取得します
- キーと値のペアオブジェクトのコレクションをループして、各キーと値のペアオブジェクトを取得します
- キーと値のペアオブジェクトに従ってキーと値を取得します
コードの一部は次のとおりです。
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 向集合中添加元素
map.put("杨过", "小龙女");
map.put("杨康", "穆念慈");
map.put("郭靖", "黄蓉");
map.put("杨玄风", "梅超风");
// 获取键值对对象的集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
// 循环遍历键值对对象的集合,得到每一个键值对对象
for (Map.Entry<String, String> entry : entrySet) {
// 根据键值对对象得到键和值
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "---" + value);
}
4.HashMapの概要
- HashMapは、ハッシュテーブルに基づくMapインターフェイスの実装です。
- ハッシュテーブルの役割は、キーの一意性を確保することです。
- ハッシュテーブル構造の最下層は、hashcode()メソッドとequals()メソッドに依存しています!
4.1 HashMapケース1:キー文字列値文字列
// 创建集合对象
HashMap<String, String> hm = new HashMap<String, String>();
// 向集合中添加元素
hm.put("allan", "男");
hm.put("bella", "女");
hm.put("zhangsan", "女");
// 遍历
// 获取所有键的集合
Set<String> set = hm.keySet();
for (String key : set) {
// 根据键去找值
String value = hm.get(key);
System.out.println(key + "---" + value);
}
4.2 HashMapケース2:キー整数値文字列
// 创建集合对象
HashMap<Integer, String> hm = new HashMap<Integer, String>();
// 向集合中添加元素
hm.put(28, "allan");
hm.put(2, "bella");
hm.put(28, "zhangsan");
hm.put(27, "allan");
// 遍历
// 获取所有键的集合
Set<Integer> set = hm.keySet();
for (Integer key : set) {
// 根据键找值
String value = hm.get(key);
System.out.println(key + "---" + value);
}
4.3 HashMapケース3:キー文字列値の学生
Student.javaコード:
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 创建集合对象
HashMap<String, Student> hm = new HashMap<String, Student>();
// 创建学生对象
Student s1 = new Student("allan", 27);
Student s2 = new Student("bella", 2);
Student s3 = new Student("zhangsan", 28);
Student s4 = new Student("allan", 27);
// 向集合中添加元素
hm.put("spring001", s1);
hm.put("spring006", s2);
hm.put("spring002", s3);
hm.put("spring008", s4);
// 遍历
// 获取所有键的集合
Set<String> set = hm.keySet();
for (String key : set) {
Student s = hm.get(key);
System.out.println(key + "---" + s.getName() + "---" + s.getAge());
}
4.4 HashMapケース4:主要な学生の値の文字列
要件:2つのオブジェクトのメンバー変数の値が同じである場合、それらは同じオブジェクトです。
分析:HashMapは、ハッシュテーブルに基づくMapインターフェイスの実装であり、ハッシュテーブルの最下層はhashcode()メソッドとequals()メソッドに依存しています。これらの2つのメソッドはStudentクラスでオーバーライドされないため、Objectクラスのhashcode()メソッドとequals()メソッドがデフォルトで使用されます。現時点では、studentオブジェクトのハッシュ値が異なるため、すべてのstudentオブジェクトは次のようになります。出力!
解決策:Studentクラスのhashcode()メソッドとequals()メソッドを書き直してください!
Student.javaのコードは次のとおりです。
package com.hw.map02;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
テストコードは次のとおりです。
// 创建集合对象
HashMap<Student, String> map = new HashMap<Student, String>();
// 创建学生对象
Student s1 = new Student("貂蝉", 27);
Student s2 = new Student("王昭君", 30);
Student s3 = new Student("西施", 33);
Student s4 = new Student("杨玉环", 35);
Student s5 = new Student("貂蝉", 27);
// 添加元素
map.put(s1, "三国");
map.put(s2, "汉朝");
map.put(s3, "春秋战国");
map.put(s4, "唐朝");
map.put(s5, "隋朝");
// 获取集合中所有键的集合
Set<Student> set = map.keySet();
for (Student stu : set) {
String value = map.get(stu);
System.out.println(stu.getName() + "---" + stu.getAge() + "---" + value);
}
操作の結果は次のとおりです。
貂蝉---27---隋朝
西施---33---春秋战国
杨玉环---35---唐朝
王昭君---30---汉朝
5.LinkedHashMapの概要と使用法
LinkedHashMapは、予測可能な反復シーケンスを使用した、マップインターフェイスのハッシュテーブルとリンクの実装です。
- キーの一意性はハッシュテーブルによって保証されます
- キーの順序はリンクリストによって保証されます(保存と取得の順序は同じです)
LinkedHashMapは、レコードの挿入順序を保証します。LinkedHashMapをトラバースすると、最初のレコードが最初に挿入されます。
コードの一部は次のとおりです。
// 创建集合对象
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
// 向集合中添加元素
map.put("spring_001", "hello");
map.put("spring_003", "world");
map.put("spring_001", "javaee");
map.put("spring_002", "hello");
map.put("spring_003", "html");
map.put("spring_004", "javascript");
// 获取集合中键的集合
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
System.out.println(key + "---" + value);
}
操作の結果は次のとおりです。
spring_001---javaee
spring_003---html
spring_002---hello
spring_004---javascript
6.TreeMapの概要
TreeMapは、バイナリツリーに基づくMapインターフェイスの実装です。
キーはバイナリツリー構造であり、キーの並べ替えと一意性を保証できます。
2つのTreeMapケースを見てみましょう!
6.1 TreeMapケース1:キーは文字列で、値は文字列です
// 创建集合对象
// 当构造方法为空时,使用自然排序进行排序
TreeMap<String, String> tm = new TreeMap<String, String>();
// 向集合中添加元素
tm.put("liangchaowei", "刘嘉玲");
tm.put("dengchao", "孙俪");
tm.put("huangxiaoming", "杨颖");
tm.put("zhangjie", "谢娜");
tm.put("huangxiaoming", "范冰冰");
// 遍历
Set<String> set = tm.keySet();
for (String key : set) {
String value = tm.get(key);
System.out.println(key + "---" + value);
}
操作の結果は次のとおりです。
dengchao---孙俪
huangxiaoming---范冰冰
liangchaowei---刘嘉玲
zhangjie---谢娜
6.2 TreeMapケース2:キーはStudentで、値はStringです
Student.javaのコードは次のとおりです。
package cn.itcast_04;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
TreeMapDemo2.javaコードは次のとおりです。
package com.hw.map02;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
/**
* TreeMap:键是二叉树结构,可以保证键的排序和唯一性
*
* TreeMap<Student, String>
* 键:Student
* 值:String
*
* 使用比较器排序,按照年龄从小到大排序
*
* @author HW
*
*/
public class TreeMapDemo2 {
public static void main(String[] args) {
// 创建集合对象
// 当一个方法的参数是接口时,真正需要的是该接口实现类的对象
TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {
public int compare(Student s1, Student s2) {
int num1 = s1.getAge() - s2.getAge();
int num2 = (num1 == 0) ? (s1.getName().compareTo(s2
.getName())) : num1;
return num2;
}
});
// 创建学生对象
Student s1 = new Student("allan", 27);
Student s2 = new Student("bella", 3);
Student s3 = new Student("ella", 28);
Student s4 = new Student("bella", 2);
Student s5 = new Student("allan", 27);
// 向集合中添加元素
tm.put(s1, "男");
tm.put(s2, "女");
tm.put(s3, "女");
tm.put(s4, "男");
tm.put(s5, "女");
// 获取集合中键的集合
Set<Student> set = tm.keySet();
for (Student stu : set) {
String value = tm.get(stu);
System.out.println(stu.getName() + "---" + stu.getAge() + "---" + value);
}
}
}
操作の結果は次のとおりです。
bella---2---男
bella---3---女
allan---27---女
ella---28---女
7.面接の質問
7.1 HashtableとHashMapの違いは?
- ハッシュテーブル:スレッドセーフ、低効率。nullキーとnull値は許可されていません
- HashMap:スレッドは安全で効率的ではありません。nullキーとnull値を許可する
7.2 List、Set、Mapおよびその他のインターフェースはMapインターフェースから継承しますか?
- ListとSetは、Mapインターフェイスから継承せず、Collectionインターフェイスから継承します。
- マップインターフェイス自体はトップレベルのインターフェイスです
7.3コレクションとコレクションの違いは何ですか?
- コレクション:単一列コレクションの最上位インターフェースであり、サブインターフェースはリストとセットです。
- コレクション:コレクション操作のツールクラスです。コレクション操作は静的メソッドであり、コレクションの並べ替えやバイナリ検索のメソッドが含まれます。