Set、Map

Set子接口:
特点:无序、无下标、元素不可重复(当插入新元素时,如果新元素与已有元素进行equals比较,结果为true时,则拒绝新元素的插入)
方法:全部继承自Collection中的方法
foreach循环:
for(数据类型 变量名 : 容器名称){ //可遍历集合或数组(常用在无序集合上)
Set接口实现类:
HashSet:
HashSet的底层使用的HashMap类,即是将所有需要存入HashSet的值,直接保存在HashMap中
HashSet如何去掉重复?
先判断hashCode是否一致,==比较地址,equals比较内容
LinkedHashSet:
底层使用LinkedHashMap(链表结构)存储,节点形式单独存储数据,并可以指向下一个节点,通过顺序访问节点,可保留元素插入顺序
TreeSet:
实现了SortedSet接口,要求必须可以对元素排序。
所有插入元素,必须实现Comparable接口,覆盖compareTo方法。
根据compareTo方法返回0作为去重的依据,(意味重复)
Map体系集合:
Map:地图、映射
概念:存储一对数据(Key-value),无序、无下标、键不可重复、值可以重复。
HashMap算法:
拿到任何一个对象好,通过hash(key)做运算,key>>>16(除以16),只可能得到0~15之间的一个数组,作为插入数组的下标Hashtable:HashMap的线程安全版本
TreeMap:自动对key做排序,根据compareTo的返回值去重
Properties:Hashtable 子类,主要用于存储key和value都是字符串的情况,常在读取配置文件之后,保存文件中的键值对。反射、JDBC

作业:

4、

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class TestListSet {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("Hello");
		list.add("Learn");
		list.add("Hello");
		list.add("WelCome");
		
		Set<String> set = new HashSet<String>();
		set.addAll(list);
		System.out.println(set.size());//打印3,set无法储存相同元素
	}

}

6、

class Worker{
	String name;
	int age;
	public int hashCode() {
//		return 0;
		int result = 0;
		if(name != name)result = name.hashCode();
		return result + age;
//		return super.hashCode();
	}
}

7、

import java.util.HashSet;
import java.util.Set;

public class TestClassWork {

	public static void main(String[] args) {
		Set<Worker> set = new HashSet<Worker>();
		set.add(new Worker("tome" , 18 , 2000));
		set.add(new Worker("tome" , 18 , 2000));
		set.add(new Worker("tome" , 18 , 2000));
		System.out.println(set.size());//打印3,虽然元素内容相同,但不是同一对象
		for(Worker worker : set) {
			System.out.println(set.toString());
		}
		
	}
}
class Worker{
	String name;
	int age;
	double salary;
	public Worker() {}
	public Worker(String name , int age , double salary) {
		this.name = name; 
		this.age = age;
		this.salary = salary;
	}
	
	double hachCode() {
		return name.hashCode() + age + salary;
	}
	
	public boolean equals(Worker w) {
		if(w.name == name  &&  w.age == age && w.salary == salary) {
			return true;
		}else {
			return false;
		}
	}
	public String toString() {
		return name + "\t" + age + "\t" + salary;
	}
	public boolean eauals(Object o) {
		if(this.hachCode() == o.hashCode()) {
			return true;
		}
		if(o == null) {
			return false;
		}
		if(this.getClass() != o.getClass()) {
			return false;
		}
		Worker w = (Worker)o;
		if(this.name.equals(w.name) && this.age == w.age && this.salary == w.salary ) {
			return true;
		}
		return false;
	}
}

9、
put方法表示放入一个键值对,如果键已存在则重写,如果键不存在则插入
remove方法接受1个参数,表示删除该键对应值
get方法表示获取键值对,get方法的参数表示键,返回值表示值
要想获得Map中所有的键,应该使用方法keySet(),该方法返回值类型为Set
要想获得Map中所有的值,应该使用方法entrySet(),该方法返回值类型为Set

10、13、

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class TestMap {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Map<Integer, String> map = new HashMap<Integer , String>();
		map.put(1930, "乌拉圭");
		map.put(1934, "意大利");
		map.put(1938, "意大利");
		map.put(1950, "乌拉圭");
		map.put(1954, "德国");
		map.put(1958, "巴西");
		map.put(1962, "巴西");
		map.put(1966, "英格兰");
		map.put(1970, "巴西");
		map.put(1974, "德国");
		map.put(1978, "阿根廷");
		map.put(1982, "意大利");
		map.put(1986, "阿根廷");
		map.put(1990, "德国");
		map.put(1994, "巴西");
		map.put(1998, "法国");
		map.put(2002, "巴西");
		map.put(2006, "意大利");
		System.out.println("输入年份查询世界冠军归属地:");
		int input = scan.nextInt();
		if(map.get(input) != null) {
			System.out.println(map.get(input));
		}else {
			System.out.println(input + "年没有举办世界杯");
		}
		
		System.out.println("输入球队名字,查询夺冠年份");
		String str = scan.next();
		
		if(map.containsValue(str)) {
			for(Integer i : map.keySet()) {
				if(map.get(i).equals(str)) {
					System.out.print(i + "\t");
				}
			}
		}else {
			System.out.println(str + "没有获得过世界杯");
		}
	}

}

11、

import java.util.HashMap;
import java.util.Map;

public class TestMap {

	public static void main(String[] args) {
		Map<String , String> map = new HashMap<String , String>();
		map.put("Tom", "CoreJava");
		map.put("John", "Oracle");
		map.put("Susan", "Oracle");
		map.put("Jerry", "JDBC");
		map.put("Jim", "Unix");
		map.put("Kevin", "JSP");
		map.put("Lucy", "JSP");
		map.put("Allen", "JDBC");
		map.replace("Luck", "Jsp");
		System.out.println(map.entrySet());
		for(String s : map.keySet()) {
			if(map.get(s).equals("JSP")) {
				System.out.println(s);
			}
		}
	}

}

12、

import java.util.HashSet;
import java.util.Set;

public class TestHashSet {

	public static void main(String[] args) {
		Set<Student> set = new HashSet<Student>();
		Student stu1 = new Student();
		Student stu2 = new Student(18 , "Tom");
		Student stu3 = new Student(18 , "Tom");
		set.add(stu1);  // 空指针异常
		set.add(stu2);
		set.add(stu3);
		System.out.println(set.size());

	}

}
class Student{
	int age;
	String name;
	public Student() {}
	public Student(int age ,String name) {
		this.age = age;
		this.name = name;
	}
	public int hashCode() {
		return name.hashCode() + age;
	}
	public boolean equals(Object o) {
		if(o == null) return false;
		if(o == this) return true;
		if(o.getClass() != this.getClass())  return false;
		Student stu = (Student)o;
		if(stu.equals(name) && stu.age == age) return true;
		else return false;
	}
}

14、

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class TestMap {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入一组字符串:");
		String str = scan.next();
		Map<Character , Integer> map = new HashMap<Character , Integer>();
		for(char c : str.toCharArray()) {
			if(map.get(c) == null) {
				map.put(c, 1);
			}else {
				map.put(c, map.get(c)+1);
			}
		System.out.println(map.entrySet());
		}

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值