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());
}
}
}