1. 什么是集合
- 容器 存储元素的集合
2. 集合的继承树
3. 为什么要使用集合
- ①可以实现动态添加数据 不用考虑是否超出集合的存储范围
- ②集合中提供了丰富的类以及类的方法 可以实现对集合数据进行各种操作
- ③集合中提供了多个接口和具体的实现类 可以存储多种特点的数据
- 有序可重复
- 无序不可重复
- 键值对
4.集合的分类
- Collection接口
- Map接口
5.Collection接口(单列集合)
5.1 Collection 都有哪些具体的实现类
5.2 Collection接口中的抽象方法:
// 增加
add(Object obj);
addAll(Collection coll);
// 删
remove(Object obj);
removeAll(Collection coll);
clear();
// 查
contains(Object obj);
//当前集合中,是否包含 coll集合中的所有元素
containsAll(Collection coll);
// 遍历
iterator();
size();
isEmpty();
//获取当前集合和 coll集合的相同的元素,并返回给当前集合
retainAll(Collection coll);
// 如果当前集合与 obj集合中的元素完全相同 则返回true
equals(Object obj)
hashCode();
// 集合转位为数组
toArray();
5.3 List具体的实现类
- ArrayList
//构造一个初始容量为 10 的Object数组。最大容量为MAX-8。
//空间不足时 扩容1.5倍 复制就的数据到新的list中
ArrayList():
//将Collection 集合转化为Arraylist 集合返回
ArrayList(Collection<? extends E> c)
// 构造一个具有指定初始容量的空列表。
// 如果知道数据的长度 建议使用该构造器
ArrayList(int initialCapacity)
- ArrayList、LinkedList、Vector三者的异同?
- 1.都是作为List接口的实现类,可以用来存储有序的、可以重复的数据
- 2.ArrayList:线程不安全的,效率高;(使用Collections类的方法转为线程安全的);
- Vector:作为List接口的古老类;Vector线程安全的,效率低;底层使用数组实现
- LinkedList:底层使用双向链表实现的;对于频繁的删除,插入操作,建议使用LinkedList
public class CollectionTest {
@Test
public void test3(){
Collection coll = new ArrayList();
coll.add(new String("AA"));
coll.add(new Person("Tom",12));
coll.add("BB");
coll.add(123);
coll.add(456);
//8.retainAll(Collection coll):获取当前集合和coll集合的相同的元素,并返回给当前集合
// Collection coll1 = Arrays.asList(new Integer[]{123,456});//数组--->集合
// coll.retainAll(coll1);
System.out.println("****************");
System.out.println(coll);
//9.remove(Object obj):从当前集合中将obj元素删除 返回值为boolean
coll.remove(123);
// coll.remove(new Person("Tom",12));
System.out.println("****************");
System.out.println(coll);
//10.removeAll(Collection coll): 从一个集合中删除另一个集合 也就是求差集
System.out.println("****************");
Collection coll1 = Arrays.asList(new Integer[]{123,456,125});
coll.removeAll(coll1);
System.out.println(coll);
//11.equals(Object obj):如果当前集合与obj集合中的元素完全相同 则返回true
boolean equals = coll.equals(coll1);
System.out.println(equals);
//12.hashCode():
System.out.println(coll.hashCode());
//13.toArray() 集合到数组的转换
System.out.println(coll);
Object[] array = coll.toArray();
for(int i=0;i<array.length;i++){
System.out.println(array[i]);}
//14.iterator():遍历
}
@Test
public void test2(){
Collection coll = new ArrayList();
coll.add(new String("AA"));
coll.add(new Person("Tom",12));
coll.add("BB");
coll.add(123);//自动装箱
//6.contains(Object obj):判断集合中是否包含obj元素。判断标准:调用obj所在类的:equals()
boolean isExist = coll.contains(new String("AA"));
System.out.println(isExist);
isExist = coll.contains(new Person("Tom",12));
System.out.println(isExist);//false--->true
//7.containsAll(Collection coll1):当前集合中,是否包含coll集合中的所有元素
Collection coll1 = new ArrayList();
coll1.add(123);
coll1.add("BB");
System.out.println("7." + coll.containsAll(coll1));
}
@Test
public void test1(){
Collection coll = new ArrayList();
//1.add(Object obj):将obj添加到集合中
coll.add("AA");
coll.add("BB");
coll.add(123);//自动装箱
coll.add(new Person("Tom",12));
//2.size():获取集合中存储的元素的个数
System.out.println(coll.size());
System.out.println(coll);
//3.addAll(Collection coll):将coll中的元素添加到当前的集合中。
Collection coll1 = new ArrayList();
coll1.add(111);
coll1.add("MM");
coll1.add("GG");
coll.addAll(coll1);
// coll.add(coll1);
System.out.println(coll);
//5.clear():清空集合元素
coll.clear();
//4.isEmpty():判断集合是否为空
System.out.println(coll.isEmpty());
}
}
package com.atguigu.java;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.junit.Test;
/**
* java.util.Collection:单列数据
* |------List子接口:存储有序的、可重复的数据 ---->"动态"数组
* |-----ArrayList:作为List的主要实现类;线程不安全的,效率高;底层使用数组实现
* (Collections中定义了synchronizedList(List list)将此ArrayList转化为线程安全的)
* |-----LinkedList:对于频繁的插入、删除操作,我们建议使用此类,因为效率高;底层使用双向链表实现
* |-----Vector:List的古老实现类;线程安全的,效率低;底层使用数组实现
*
*
* [面试题] ArrayList、LinkedList、Vector区别?
* 共同点:ArrayList、LinkedList、Vector都是List接口的实现类,存储的数据都是有序的、可重复的。
* 区别:如上
*
* List list = new ArrayList();//jdk 7.0 : Object[] elementData = new Object[10];
* sysout(list.size());//0
* list.add(..);//elementData[0] = ..
* ...
* ...
* 一旦要添加的元素超出了底层数组的长度,就需要扩容,默认扩容为原来的1.5倍,同时,需要将原有数组
* 中的元素复制新的数组中。
* ...
*
* 实际情况:需要存储80个数据到ArrayList中,建议:List list = new ArrayList(85);
*
*
*
* 说明:1.向List中添加自定义类的对象的话,要求此自定义类重写equals()方法!
* 2.补充:数据结构解决两个问题:
* 1.数据之间逻辑关系:一对一,一对多,多对多,...
* 2.数据的存储结构:①顺序存储:一维数组 ②链式存储
*
*
*
* @author shkstart 邮箱:shkstart@126.com
* @version 创建时间:2017年8月4日 下午3:11:11
*
*/
public class ListTest {
/*
* 在Collection的基础上,新增的方法:
void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置.如果不存在,返回-1.
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置.如果不存在,返回-1.
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合
substring(int from ,int to) / read(int from,int length)
总结:List中的常用方法:
增:add(Object obj)
删:remove(Object obj) / remove(int index)
改:set(int index, Object ele)
查:get(int index)
插:add(int index, Object ele)
遍历:iterator();增强for;for
长度:size()
*/
//遍历
@Test
public void test4(){
List list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("Tom",12));
list.add(456);
//遍历方式一:
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("*************");
//遍历方式二:
for(Object o : list){
System.out.println(o);
}
System.out.println("*************");
//遍历方式三:因为List提供索引
for(int i = 0;i < list.size();i++){
System.out.println(list.get(i));
}
}
@Test
public void test3(){
List list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("Tom",12));
list.add(456);
//修改:
list.set(1, "BB");
System.out.println(list);
//获取子集合:
List subList = list.subList(1, 3);
System.out.println(subList);
}
@Test
public void test2(){
List list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("Tom",12));
list.add(456);
int index = list.indexOf(456);
System.out.println(index);
int lastIndex = list.lastIndexOf(456);
System.out.println(lastIndex);
Object obj = list.remove(2);
System.out.println(obj);
System.out.println(list);
System.out.println(list.get(2));
}
@Test
public void test1(){
List list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("Tom",12));
System.out.println(list);
//插入:add(int index, Object ele)
list.add(1, "BB");
System.out.println(list);
//插入:addAll(int index, Collection eles)
List list1 = Arrays.asList(1,2,3);
list.addAll(2, list1);
// list.add(2,list1);
System.out.println(list);
//查询:get(int index)
System.out.println(list.get(1));
}
}
5.4 子接口Set
5.4.1 子接口Set的特点
- 元素无序 不可重复的集合
- 元素无序:元素存储的位置不是一个挨着一个是无序的。
- 不可重复:在这个集合中 不能存储数据相同的 元素
5.4.2 实现类
- HashSet:作为主要实现类,来存储无序 不可重复的数据)
- LinkedHashSet:这个类继承 HashSet 可以按照数据添加顺序实现遍历 底层与HashSet相同 除此之外 还提供了一对索引记录添加的顺序 遍历效率高)
- TreeSet
5.4.3 HashSet是如何保证无序 不可重复性的?
- 哈希算法 和 equals方法
- 找位置(hashCode方法) 利用哈希算法计算出要添加数据的存储位置
- 比较(equals方法) 如果这个位置有元素 利用equals方法比较两个元素是否相同 如果相同 添加失败 如果不相同,利用链表链起来
5.4.4 HashSet如何添加自定义类型的数据?
- 需要重写hashCode方法 equals方法,HashSet对哈希算法的要求 如果要添加的值一样 计算出的Hash值一定要相同 如果添加的值不一样 尽可能的不相同。对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值
5.4.4 TreeSet
- TreeSet实现类(往TreeSet中添加的元素要是同种类型才可以添加,只有同种类型才可以排序 包装类默认已经重写了compareTo方法)
- 底层存储结构:使用红黑树的方式进行存储的,不同于一维数组、链表
- TreeSet特别之处:数据是可以按照指定属性进行排序的 但是要保证添加的数据必须是同一个类创建的对象。
5.4.5 TreeSet怎么排序
- 自然排序:TreeSet( ) 默认调用所添加数据类型类中重写的compareTo()方法进行排序
- 自定义类实现Comparable接口
- 重写compareTo()方法。重写的规则:指明按照哪个属性进行排序
// 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或 Arrays.sort进行自动排序。
// 实现此接口的对象可以用作有序映射中的键或有 序集合中的元素,无需指定比较器
class Goods implements Comparable {
private String name;
private double price;
@Override
//如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回 负整数,如果当前对象this等于形参对象obj,则返回零。
public int compareTo(Object o) {
if(o instanceof Goods) {
Goods other = (Goods) o;
if (this.price > other.price) {
return 1;
} else if (this.price < other.price) {
return -1;
}
return 0;
} throw new RuntimeException("输入的数据类型不一致");
} //构造器、getter、setter、toString()方法略
}
- 定制排序: TreeSet(Comparator comparator)构造器,排序时候调用重写的compare()方法
- 怎么实现定制排序?
- ①创建一个实现 Coparator接口实现类的对象
- ②需要重写compare(Object,object)指明如何排序
- ③将 Coparator接口实现类的对象作为参数传递到TreeSet的构造器中,创建TreeSet的对象
- ④向TreeSet中添加compare()中判断的类的对象即可。
Goods[] all = new Goods[4];
all[0] = new Goods("War and Peace", 100);
all[1] = new Goods("Childhood", 80);
all[2] = new Goods("Scarlet and Black", 140);
all[3] = new Goods("Notre Dame de Paris", 120);
//重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2
Arrays.sort(all, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Goods g1 = (Goods) o1;
Goods g2 = (Goods) o2;
return g1.getName().compareTo(g2.getName());
}
});
System.out.println(Arrays.toString(all));
- 定制排序和自然排序的区别?
- 自然排序:空参构造器,需要集合中数据类型去实现Comparable 接口 并重写compareTo( )方法,比较固定 不适应随时更改自己需求的排序
- 定制排序:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排 序的比较。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort), 从而允许在排序顺序上实现精确控制。
5.5 集合遍历
5.5.1迭代器
-
什么是迭代器(Iterator):提供一种快捷遍历Collection的接口。
-
为什么要集合要提供迭代器?
- java集合容器的种类有很多种,ArrayList、LinkedList、HashSet…,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。 因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器。即我们无需关心该遍历对象的底层结构是什么样子的.只要实现Collection接口的集合,使用迭代器就可以遍历这个对象的内部元素。不同Collection实现类的对迭代器方法的实现也不同。
-
迭代器的方法
public interface Iterator<E> {
//是否有下一个元素
boolean hasNext();
//①指针下移② 并将下移后的元素返回。
E next();
//从迭代器指向的 collection 中移除迭代器返回的最后一个元素
void remove();
}
- 为什么Iterator定义为一个接口而不定义一个类呢?
- 因为java中集合的种类繁多,不同的集合,iterator中重写的方法也是不同的,所以不能定义为一个类统一种遍历方式。
- 集合的遍历方式
- 迭代器
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(new String("AA"));
coll.add(new Person("Tom",12));
coll.add(new Person("Tom",12));
coll.add("BB");
coll.add(123);
coll.add(456);
Iterator iterator = coll.iterator(); //返回集合的迭代器 也就是说返回专门遍历集合的接口 这个iterator专门遍历collection 集合 即常见的list 和set集合
// 使用iterator的hasNext()、next().推荐使用
while(iterator.hasNext()){ //
System.out.println(iterator.next());
}
}
- 增强for循环:适合遍历Collection集合和数组
- 当遍历collection集合时 底层原理时使用iterator 进行遍历的。
- 当遍历数组时底层实现原理就是普通的for循环来实现遍历的。
// 语法格式:
for(数据类型 变量名 :遍历的目标){ //数据类型 变量名:声明一个变量用来接收遍历目标遍历后的元素
}
for
(Object obj:coll ) { // 从coll中取出一个元素赋给obj 打印 再取出一个 再赋给再打印,直到取完为止。
System.out.println(obj );
6.Map接口(key-value)
6.1 Map中数据的特点
- 存放无序 不可重复的值 键值对
6.2 为什么Map有这种特点呢?
- ① 左边key构成的集合是一个set集 只能存放 无序 不可重复 (怎么保证呢 ? 使用set存储 要求key所在的类重写hashCode()和equals()方法)
- ② 右边value 构成collection 集 存放可重复的 无序的 (要去value所在的类重写equals方法)
- ③ 所以 整个entry构成set集 只能存放 无序 不可重复的
6.3 Map接口的实现类
- HashMap :一个特殊的HashSet, 相当所有的 key指向同一个值 ;线程不安全 效率高 可以存储NULL的key和value;
- linkHashMap 作为HashMap的子类,底层与HashMap的存储方式相同。在添加的同时,还使用双向链表记录了添加的先后顺序,实现按照添加的先后顺序遍历。
- TreeMap : 可以按照添加的(k,v)中的k的指定的属性,实现遍历。
- HashTable :古老的实现类 线程安全的 效率低 不可以存null的key活value。
- Properties :键、值都是String类型,常用来处理属性文件
Properties类中常用的方法:
setProperty(String key, String value) 调用 Hashtable 的方法 put,向集合中添加数据
getProperty(String key):用指定的键在此属性列表中搜索属性。
getProperty(String key, String defaultValue):用指定的键在属性列表中搜索属性。
load(InputStream inStream):从输入流中读取属性列表(键和元素对),到集合中
load(Reader reader):按简单的面向行的格式从输入字符流中读取属性列表(键和元素对),到集合中
- 注意:HashSet的底层使用的是HashMap 其他的Set也类似。 HashMap的key构成的集合就是HashSet。其他的Map也类似。
6.4 Map中的抽象方法
添加/修改:put(Object key,Object value);
删除:remove(Object key)
查询:
get(Object key)
containsKey(Object key)
containsValue(Object value)
遍历:遍历key集:keySet()
长度:size()
遍历value集: values()
遍历entry集:entrySet()
6.5 主要实现类HashMap
-
(1)HashMap底层是怎样存放的? (无序 不可重复)
①原理:新建一个HashMap的时候就会初始化一个长度为16的Entry数组,根据key 值利用哈希算法计算出 存的位置 如果 hash值相同 调用equals方法 比较key是否相同,若相同 则替换掉原来的位置 ,若不同 形成链表.如果形成链表结构达到8的时候 则使用红黑树替换.(存放于比较与value无关) -
② 代码层面:
HashMap map = new HashMap();//底层创建了长度为16,加载因子为0.75的Entry[]数组
map.put(k1,v1);
…
当添加的元素得到12的时候,进行扩容,默认扩容为原来的2倍,同时将原有的数据copy过去。
指导意义:开发中,建议使用HashMap( intinitialCapacity) -
HashMap实现类具体的实现方法有哪些?
添加/修改:put(Object key,Object value);
删除:remove(Object key)
查询:get(Object key)
长度:size()
遍历:(遍历出是无序的)
遍历key集:keySet() (可以用两种遍历方式增强for循环 和 iterator方法)
遍历value集: values() (可以用两种遍历方式增强for循环 和 iterator方法)
遍历entry集: entrySet() (调用 Map 内部类entry()的key()方法和value()方法)
keySet() (利用get(key)得到相应的Value值)
- 方法测试
package com.atguigu.java;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class MapTest {
/*
* 遍历相关的方法:
* Set keySet()
* Collection values()
* Set entrySet()
*/
@Test
public void test4(){
Map map = new HashMap();
map.put("Jerry", 1005);
map.put("Tom", 1001);
map.put(new Person("HanMeimei",1342), 23);
//1.遍历key集
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println();
//2.遍历value集
//将map所有的value封转到集合中
Collection values = map.values();
for(Object obj : values){
System.out.println(obj);
}
System.out.println();
//3.遍历key-value的方式一:
Set keySet1 = map.keySet();
for(Object key : keySet1){
System.out.println(key + "---->" + map.get(key));
}
System.out.println();
//遍历key-value的方式二:
Set entrySet = map.entrySet();
for(Object entry : entrySet){
// System.out.println(entry);
Map.Entry e = (Map.Entry)entry;
System.out.println(e.getKey() + "*****" + e.getValue());
}
}
/*
* Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)
总结:添加:put(Object key,Object value)
删除:remove(Object key)
修改:put(Object key,Object value)
查询:get(Object key)
长度:size()
遍历:keySet() / values() / entrySet()
*/
@Test
public void test3(){
Map map = new HashMap();
map.put("Jerry", 1005);
map.put("Tom", 1001);
map.put(new Person("HanMeimei",1342), 23);
//清空:clear()
// map.clear();//与map = null不同
System.out.println(map.size());
//containsKey(Object key):是否包含指定的key
System.out.println(map.containsKey("Tom"));
//containsValue(Object value):是否包含指定的value
System.out.println(map.containsValue(1001));
//isEmpty():判断是否非空
System.out.println(map.isEmpty());
}
@Test
public void test2(){
Map map = new HashMap();
//1.添加:put(Object key,Object value):将key,value添加到当前map中
map.put("Jerry", 1005);
map.put("Tom", 1001);
map.put(new Person("HanMeimei",1342), 23);
//2.修改:put(Object key,Object value)/replace(K key, V oldValue, V newValue)/replace(K key, V value)
map.put("Tom", 2001);
//3.删除:remove(Object key)
Object value = map.remove("Jerry");
System.out.println(value);
//4.查询:get(Object key) 得到key对应value的值
Object value1 = map.get("Tom");
System.out.println("*************");
System.out.println(value1);
//5.长度:size()
System.out.println(map.size());
System.out.println(map);
}
/*
* Map接口框架:
*
* Map
* |----HashMap:作为Map的主要实现类;线程不安全的,效率高;可以存储null的key和value
* |----LinkedHashMap: 作为HashMap的子类,底层与HashMap的存储方式相同。在添加的同时,
* 还使用双向链表记录了添加的先后顺序,实现按照添加的先后顺序遍历。
* |----TreeMap:可以按照添加的(k,v)中的k的指定的属性,实现遍历。
* |-----Hashtable:作为Map的古老实现类;线程安全的,效率低;不可以存储null的key或value
* |----Properties:键、值都是String类型,常用来处理属性文件
*
* 说明:HashSet的底层使用的是HashMap.其他的Set也类似。 HashMap的key构成的集合就是HashSet。其他的Map也类似
*
* 面试题:
* 1.HashMap的底层实现原理? (重要)
*
* put():
* 当向HashMap中添加数据(k1,v1)时,首先根据k1所在类的hashCode()方法,计算k1的哈希值,
* 此哈希值就决定了(k1,v2)在HashMap对应的底层数组中的存放位置,如果此位置上没有存放其他数据,
* 则此(k1,v1)存储成功。如果此位置上已经存放了(k2,v2).则调用k1所在类的equals()。如果
* 返回true,将v1替换原有的v2.如果返回false,(k1,v1)和(k2,v2)使用链表结构进行存储。
* ((k1,v2)--->(k2,v2)).
* (jdk8.0以后)如果形成链表结构的数据量得到8的时候,使用红黑树替换链表结构,保证存、取的效率更高。
*
* 代码层面:
* HashMap map = new HashMap();//底层创建了长度为16,加载因子为0.75的Entry[]数组
* map.put(k1,v1);
* ...
* 当添加的元素得到12的时候,进行扩容,默认扩容为原来的2倍,同时将原有的数据copy过去。
*
* 指导意义:开发中,建议使用HashMap(int initialCapacity).
*
* 2.HashMap和Hashtable的异同?
*
*
*
* 说明:1.map中entry的存放位置/方式,取决于entry中key的存放位置/方式。
*/
@Test
public void test1() {
Map map = new HashMap();
map.put("Tom", 13);
map.put("HanMaimei", 33);
map.put(new Person("Lilei", 23), 13);
map.put("Jerry", 34);
map.replace("Tom",13,20);
System.out.println(map);
}
/*
* Map:存储双列集合。
* 1.存储的是键值对特点的数据:key-value
* 2.key中的元素是无序、不可重复的。使用Set进行存储。--->要求key所在的类重写:hashCode()和equals()
* 3.value中的元素是无序、可重复的。使用Collection进行存储。---->要求value所在的类重写:equals()
* 4.一个key-value构成一个Entry。entry是无序的、不可重复的。使用Set进行存储。--->可以通过key体现。
*
*/
}
package com.atguigu.java;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class MapTest {
@Test
public void test() {
Map map = new HashMap();
// 添加
map.put("jerry", 1005);
map.put("Tom", 1001);
map.put(new Person("HanMeiMei", 1342), 1001);
// 修改
map.put("Tom", "Jerry");
System.out.println(map);
// 删除
// Object val = map.remove("Tom");
// System.out.println(val);
// 查询
Object object = map.get("jerry");
// 遍历:keySet() / values() / entrySet()
System.out.println("*************");
// ①遍历key集合 遍历value结合
System.out.println("***遍历Key集合***");
Set keySet = map.keySet();
Iterator iterator = keySet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("***遍历Value集合***");
Collection values = map.values();
for (Object obj : values) {
System.out.println(obj);
}
System.out.println("***遍历 key Value集合 方式一***");
// ② 遍历 key-value集
// 方式一 :
Set entrySet = map.entrySet();
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()) {
System.out.println(iterator2.next());
}
System.out.println("***遍历 key Value集合 方式二 ***");
// 方式二
Set entrySet1 = map.entrySet();
for (Object obj : entrySet1) {
System.out.println(obj);
}
System.out.println("***遍历 key Value集合 方式三 ***");
// 方式三
Set entrySet3 = map.entrySet();
for (Object obj : entrySet3) {
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey() + "__________" + entry.getValue());
}
// 方式四:
System.out.println("************");
Set keySet1 = map.keySet();
for (Object key : keySet1) {
System.out.println(key +"______"+map.get(key));
}
}
}
7 .操作集合的工具类
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List, int, int ):将指定 list 集合中的 i 处元素和 j 处元素进行交换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
Object min(Collection)
Object min(Collection,Comparator)
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
void copy(List dest,List src ):将src中的内容复制到 dest中 //正确的复制 List dest = Arrays.asList(new Object[list.size()]);
Collections.copy( dest, list);
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值