Map
1.Map可以根据键来提取对应的值
2.Map的键不允许重复,如果重复,对应的值会被覆盖
3.Map存放的都是无序的数据
4.Map的初始容量是16,默认的加载因子的0.75
Map集合的迭代
public class TestMap {
public static void main(String[] args) {
//1.创建Map对象
/*Map中的数据要符合映射规则,一定注意要同时指定K和V的数据类型
* 至于K和V具体要指定成什么数据类型,取决于具体的业务要求*/
Map<Integer,String> map=new HashMap<>();
//2.向map集合中添加元素,注意方法是put(),并且需要同时存入一对值
map.put(9527,"白骨精");
map.put(9528,"黑熊精");
map.put(9529,"鲤鱼精");
map.put(9530,"孔雀精");
map.put(9527,"汤森");
System.out.println(map);
/*1.map中的value可以重复,比如我们可以存入两个”孔雀精“
* 2.map中的key不允许重复,如果重复,后面的value会把前面的value覆盖掉*/
//3.测试常用方法
// map.clear();//清空集合
System.out.println(map);
System.out.println(map.isEmpty());//判断集合是否为空
System.out.println(map.size());//获取的是map中键值对的个数
System.out.println(map.containsKey(9527));//true,判断map中是否包含指定的键
System.out.println(map.containsValue("白骨精"));//false,判断map中是否包含指定的值
System.out.println(map.get(9527));//根据key值获取对应的value
System.out.println(map.remove(9529));//根据Key值删除这个键值对
System.out.println(map.containsKey(9529));
System.out.println(map.containsValue("鲤鱼精"));
Collection<String> values = map.values();//将map中的所有值取出存入collection集合中
System.out.println(values);
//4.map集合迭代的方式一
/*方式一:
* 想遍历map中的数据,但是map本身没有迭代器,所以我们需要把map先转成set集合
* Set<Ket>:把map中所有的key值存入set集合中--keySet()*/
//将map中所有的key值取出,存入set集合中ketSet();
Set<Integer> s = map.keySet();
//获取set集合的迭代器
Iterator<Integer> it = s.iterator();
//判断集合是否有下一个集合可以迭代
while (it.hasNext()){
//获取本轮循环到的Key,并通过key值获取value的值
Integer key = it.next();
String value = map.get(key);
System.out.println("{"+key+"**"+value+"}");
}
//map集合的迭代方式二
/*想要遍历map集合,需要先转成set集合
* 是把map中的每一对键值对看成是Entry
* map中有几对键值对,set中就有几个Entry*/
Set<Map.Entry<Integer, String>> set2 = map.entrySet();
//获取set集合迭代器
Iterator<Map.Entry<Integer, String>> it2 = set2.iterator();
//判断集合是否有下一个元素可以迭代
while (it2.hasNext()){
Map.Entry<Integer, String> entry = it2.next();
System.out.println(entry);
}
}
Set
概述
1.Set是一个不包含重复元素的collection
2.Set集合中的数据是无序的(因为set集合没有下标)
3.Set集合中的元素不可以重复-常用来给数据去重
Set测试
/*本类用于测试Set*/
public class TestSet {
public static void main(String[] args) {
//1.创建对应的集合对象
Set<String> set=new HashSet<>();
//2.向set集合中存入数据
set.add("紫霞仙子");
set.add("至尊宝");
set.add("蜘蛛精");
set.add("紫霞仙子");
set.add(null);
/*1.set集合中的元素都是没有顺序的
* 2.set集合中的元素不能重复
* 3.set集合允许存null值,但是最多存一个*/
System.out.println(set);
//测试常用方法
System.out.println(set.contains("唐僧"));//false
System.out.println(set.isEmpty());//false
System.out.println(set.remove(null));
System.out.println(set);
System.out.println(set.size());//获取集合中元素的总数
System.out.println(Arrays.toString(set.toArray()));//将集合转为数组
//集合间的操作
Set<String>set2=new HashSet<>();
set2.add("兔子");
set2.add("老虎");
set2.add("海豚");
set2.add("狮子");
System.out.println(set2);
set.addAll(set2);//将set2的元素添加到set
System.out.println(set);
System.out.println(set.containsAll(set2));//判断set是否包含set2的集合
set.retainAll(set2);
System.out.println(set);
set.removeAll(set2);
System.out.println(set);
//使用iterator迭代set2集合
Iterator<String> it = set2.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
}
关于Set去重测试
首先创建自定义类
/*本类用作set集合自定义类型是否可以去重的物料类*/
//1.创建自定义的引用类型
public class Student {
//2.属性
String name;
int age;
//3.提供本类的全参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
如果set集合中存放的是我们自定义的类型,那么需要给自定义类型中添加重写的equals()与hashCode() ,set集合才会实现按照类型+属性+属性值来去重, 否则会认为s2 s3对象是两个不同的对象,因为地址值不同,所以不会去重
public class TestSet2 {
public static void main(String[] args) {
//4.创建集合对象Set
Set<Student> set=new HashSet<>();
//5.创建自定义类Student对象
Student s1=new Student("张三",3);
Student s2=new Student("李四",4);
Student s3=new Student("李四",4);
//6.将创建好的对象,存入Set集合
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set);
/*如果set集合中存放的是我们自定义的类型,那么需要给自定义类型中添加重写的equals()与hashCode()
* set集合才会实现按照类型+属性+属性值来去重
* 否则会认为s2 s3对象是两个不同的对象,因为地址值不同,所以不会去重*/
}
}