【友情链接】———–—>Java中的各种集合大汇总,学习整理
【友情链接】————–> Collection集合
【友情链接】————–> ArrayList集合及其常用功能
【友情链接】————–> ArrayList应用<两大案例的数据分组聚合>
【友情链接】———–—> Iterator迭代器
【友情链接】———–—>List集合 & LinkedList集合 & Vector集合
【友情链接】———–—>set集合 & HashSet集合 & 哈希值& LinkedHashSet集合 &TreeSet集合&可变参数
【友情链接】———–—>Map集合 & HashMap集合 & LinkedHashMap集合&HashTable集合
【友情链接】———–—>Collections类集合工具类
一、了解Map集合
Map集合概述:
Interface Map<key,value> key:键的类型 value:值的类型
Map集合的特点:
- 1.Map集合是一个双列集合,每个元素都包含两个值(key,value)
- 2.Map集合中的元素key和value的数据类型可以相同,也可以不同
- 3.Map集合中的元素,key是不允许重复的,但value可以重复
- 4.Map集含中的元素,key和value是一 一对应的关系
二、 了解Map接口的常用子类集合
(1)、java.util. HashMap<K,V>集合∶
HashMap集合实现了Map接口,HashMap集合的底层是一个哈希表结构(查询的速度特别的快),HashMap集是一个无序的集合,元素的存储和取出的顺序不一定是一致的。因为要保证集合中的键key的唯一性和不重复性,所以需要重写键key的hashCode方法和equals()方法。
注意:Hashttap集合的底层哈希结构,在JDK1.8之前,是由数组加上单向链表组成的,而在JDK1.8之后,是由数组加上单向链表或者红黑树组成的。底层与HashSet很类似。
(2)、 java.util.LinkedHashMap<K,V>集合 :
LinkedHashMap集合继承了HashMap集合,LinkHashMap集合的底层采用的是哈希表加上链表的结构。 LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。链表结构用来保证元素的存储和取出顺序的一致性(也就是用于保证迭代的顺序),而哈希表结构可以保证的键的唯一性和不重复性,但是LinkedHashMap集合需要重写键key的hashCode()方法和equals()方法。
举个例子:
//创建一个hashmap集合
HashMap<String, String> hashMap = new HashMap<>();
//添加元素
hashMap.put("banana","banana");
hashMap.put("yellow","yellow");
hashMap.put("orange","orange");
hashMap.put("apple","apple");
hashMap.put("red","red");
hashMap.put("banana","banana");
//打印
System.out.println(hashMap);
//打印结果{banana=banana, orange=orange, red=red, apple=apple, yellow=yellow}
//hashmap是无序的集合,不允许存储重复的元素,元素存取的顺序不一致
System.out.println("------————-这是一条分界线————--------");
//创键一个LinkedHashMap集合
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
//添加元素
linkedHashMap.put("banana","banana");
linkedHashMap.put("yellow","yellow");
linkedHashMap.put("orange","orange");
linkedHashMap.put("apple","apple");
linkedHashMap.put("red","red");
linkedHashMap.put("banana","banana");
//打印
System.out.println(linkedHashMap);
//打印结果{banana=banana, yellow=yellow, orange=orange, apple=apple, red=red}
//LinkedHashMap集合是一个有序的集合,不允许存储重复的元素,存取元素的顺序是一致的
三、Map集合中常用的功能
1. public V put(K key ,V value): 把指定的键与指定的值添加到Map集合中。
返回值 : V
在存储键值对时:
如果key不重复,返回值V为 null;
如果key重复,那么会用新的value来换Map集合中重复的value ,返回值是被替换的value的值
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
Integer put = map.put("成德善", 25);
System.out.println(put);//null
System.out.println("-------------------------");
Integer put1 = map.put("成德善", 18);
System.out.println(put1);//返回被替换的value 25
System.out.println("-------------------------");
System.out.println(map);
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
2. public V remove(Object key):把指定的键所对应的键值对元素`在Map集合中删除,返回被删除元素的值。
返回值:V
key存在,返回该册涂的值 ;
key不存在, 返回 nuLL
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println("before remove :\t"+map);
Integer remove = map.remove("油腻大叔");
System.out.println("remove:\t"+remove);
Integer remove1 = map.remove("成德善");
System.out.println(remove1);
System.out.println("after remove:\t"+map);
3.public v get(0bject hey)根据指定的键,在Map集合中获取对应的值。
返回值:
key存在,返回对应的value值
key不存在,返回null
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
Integer get = map.get("狗焕");
System.out.println(get);
Integer get2 = map.get("珍珠");
System.out.println(get2);
4.boolean containsKey(Object key)判断集合中是否包含指定的键。
包含返回true ,不包含返回false
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
boolean b = map.containsKey("刘东龙");
System.out.println(b);
boolean b1 = map.containsKey("成龙");
System.out.println(b1);
5.boolean containsValue(Object value)判断集合中是否包含指定value
包含返回true ,不包含返回false
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
boolean b = map.containsValue(28);
System.out.println(b);
boolean b1 = map.containsValue(35);
System.out.println(b1);
6.boolean isEmpty() 判断集合是否为空
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
//boolean isEmpty() 判断集合是否为空
boolean empty = map.isEmpty();
System.out.println(empty);
7.int size():集合的长度
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
//int size():集合的长度
int size = map.size();
System.out.println(size);
8.void clear():清空集合
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
System.out.println(map);
//void clear():清空集合
map.clear();
System.out.println(map);
boolean empty1 = map.isEmpty();
System.out.println(empty1);
Map集合的两种遍历方式:
第一种遍历方式: 通过键找值
使用方法:Set KeySet()返回此映射中包含的键的Set集合。
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
map.put("刘龙",36);
map.put("李龙",26);
map.put("张晓天",27);
System.out.println(map);
//把Map集合所有的key取出来,存储到一个set集合中
Set<String> set = map.keySet();
//遍历map集合
//1.使用迭代器和while循环遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String key = iterator.next();//取键key
Integer value = map.get(key);//取值value
System.out.println(key+"\t=\t"+value);
}
System.out.println("888888888888888888888888888888888");
//2.使用增强for遍历
for (String key : map.keySet()) {
System.out.println(key+"\t=\t"+map.get(key));
}
键值对对象Entry
Map.Entry < K, V > : 在Map接口中有一个内部接口 Entry
Map中存放的是两种对象,一种key(键),一种value(值),它们是yi yi对应的关系,而这一对对象又称做Map中的一个Entry(项)。Entry将键值对的对应关系封装成了对象也就是键值对对象,这样遍历Map集合,就可以从每一个键值对(Entry )对象中获取对应的键与对应的值。而Map集合一经创键,就会在Map集合中创键一个Entry对象,用来记录键与值(键值对对象,键与值的映射关系)。
Entry中提供了获取对应的键key和对应的值value的方法:
- public getKey () : 获取Entry对象中的键key
- public v getvalue() : 获取Entry对象中的值value
Map集合中也提供了获取所有Entry对象的方法:
- public Set < Map.Entry<K,V> > entrySet() : 获取到Map集合中所有的键值对对象的Set集合
第二种遍历方式:使用Entry对象遍历
Map集含中的entrySet()方法;
Set<Nap.Entry<k,v>> entrySet()返回此映射中包含的映射关系的Set集合。
//使用多态,来创建一个map集合
Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("成宝拉",18);
map.put("狗焕",20);
map.put("油腻大叔",35);
map.put("刘东龙",17);
map.put("刘龙",36);
map.put("李龙",26);
map.put("张晓天",27);
System.out.println(map);
//使用map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到set集合
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
//遍历map
//1.使用迭代器 while遍历
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
//取出每一个entry对象
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();//取key
Integer value = entry.getValue();//取value
System.out.println(key+"\t=\t"+value);
//System.out.println(entry);
}
System.out.println("****************************************");
//2.使用增强for遍历
for (Map.Entry<String, Integer> stringIntegerEntry : entrySet) {
System.out.println(stringIntegerEntry);
}
四、HashMap集合存储自定义类型元素
HashMap集合存储自定义类型元素键值对,必须要重写hashcode()方法和equals()方法,用于保证键key的不可重复(唯一)
举个例子;
//创建一个Student类,重写hashcode和equals方法
import java.util.Objects;
public class Student {
private String name;
private int age;
//重写equals()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
//重写hashcode()方法
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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;
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class demoHashMapSaveStudent {
public static void main(String[] args) {
test01();//测试<String,Student>
System.out.println();
System.out.println("--------------------------------------------");
test02();//测试<Student,String>
}
public static void test01(){
/*
* HashMap存储自定义类型键值
* key : String类型
* String类中已经重写了hashcode方法和equals方法,已经保证了key不重复
* value :Student对象
* value可以重复(同名同年龄的人看作为同一个人)
* */
//创建hashmap集合
HashMap<String, Student> hashMap = new HashMap<>();
//添加元素
hashMap.put("清华大学",new Student("小明",20));
hashMap.put("北京大学",new Student("小张",21));
hashMap.put("复旦大学",new Student("小明",19));
hashMap.put("清华大学",new Student("小明",25));
//遍历hashmap集合
for (String key : hashMap.keySet()) {
System.out.println(key+"\t:\t"+hashMap.get(key));
}
}
public static void test02(){
/*
* HashMap存储自定义类型键值
* key : Student对象
* Student对象需要重写hashcode方法和equals方法,才能保证key不重复(唯一),
* (同名同年龄的人看作同一个人,也就是重复的key)
* value :String类型
* value可以重复
* */
//创建hashmap集合
HashMap<Student,String> hashMap = new HashMap<>();
//添加元素
hashMap.put(new Student("小明",20),"北京人");
hashMap.put(new Student("小红",30),"南京人");
hashMap.put(new Student("小刘",25),"广东人");
hashMap.put(new Student("小明",20),"上海人");
//遍历map集合,使用entry
Set<Map.Entry<Student, String>> entrySet = hashMap.entrySet();
for (Map.Entry<Student, String> studentStringEntry : entrySet) {
System.out.println(studentStringEntry);
}
}
}
测试结果截图:
五、了解HashTable集合
java.util.HashTable<K,V>集合也是实现了(implements) Map<K,V>接口
HashMap集合与HashTable集合相比较:
- HasMap集合的底层是一个哈希表,是一个线程不安全的集合,为多线程的集合, HasMap集合的速度快, HasMap集合与之前说的所有的集合都可以存储 null 值和 null 键
- HashTable集合的底层是一个哈希表,并且是一个线程安全的集含,为单线程集合,HashTable集合的速度慢,HashTabLe集合不能存储 null 值和 null 键
HashTable集合与Vector集合一样,都是在jdk1.2版本之后被更先进的集合(HashMap ,ArrayList)取代了;但是HashTabLe的子类Properties任然在使用,并且Properties集合是唯一的一个和 IO流 相结合的集合。
看个例子:
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(null ,"hashmap");
hashMap.put("hashMap",null);
hashMap.put(null,null);
System.out.println(hashMap);//打印{null=null, hashMap=null}
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put(null ,"hashmap");
hashtable.put("hashMap",null);
hashtable.put(null,null);
System.out.println(hashtable);//java.lang.NullPointerException
制作不易,各位友友们,大佬们给点鼓励!
点赞👍 收藏+关注 一键三联走起!