java基础学习-6

Java基础学习-6

  • 双列集合
    • Map的常见API
      • Map的遍历方式
    • HashMap
      • 小练习
    • LinkedHashMap
    • TreeMap
      • TreeMap--小练习1
      • TreeMap--小练习2
      • TreeMap--小练习3
      • 小总结

1~51

双列集合

双列集合的特点
键值对应
键值对
双列集合一次需要存一对数据,分别为键和值
键不能重复,只可以重复
键和值是一一对应的,每一个键只能找到自己对应的值
键+值这个整体我们称之为"键值对"或者"键值对对象",在Java中叫做"Entry对象"

Map的常见API

Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
V put (K key, V value)----添加元素
V remove(Object key)----根据键删除键值对元素
void clear()----移出所有的键值对元素
boolean containsKey(Object key)----判断集合是否包含指定的键
boolean containsValue(Object value)----判断集合是否包含指定的值
boolean isEmpty()----判断集合是否为空
int size()----集合的长度,也就是集合中键值对的个数

//1、创建Map集合的对象
Map<String,String> m = new HashMap<>();

//2、添加元素
//put方法的细节:
//添加/覆盖
//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null
//在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把覆盖的值进行返回
m.put("卡卡","咸鱼");

//3、打印集合
System.out.println(m);

Map的遍历方式

1、键找值
2、键值对
3、Lambda表达式

Map<String> map = new HashMap<>();

map.put("咸鱼","卡卡")Set<String> keys = map.keySet();
for(String key : keys){
	String value = map.get(key);
	System.out.println(key+"="+value);
}
Map<String,String>map = new HashMap<>();
map.put("标枪选手","马超");
map.put("人物挂件","明世隐");
map.put("御龙骑士","尹志平");

//3、Map集合的第二种遍历方式
//通过键值对对象进行遍历
//3.1通过一个方法获取所有的键值对对象,返回一个Set集合
Set<Map.Entry<String,String>> entries = map.entrySet();
//3.2 遍历entries这个集合,去得到每一个键值对对象
for(Map.Eentry<String,String> entry : entries){
	//3.3利用emtry调用get方法获取键和值
	String key = entry.getKey();
	String value = entry.getValue();
	System.out.println(key + "=" + value);
}

default void forEach(BiConsumer action)----结合lambda遍历Map集合

Map<String,String> map = new HashMap<>();

map.put("鲁迅""这句话是我说的");
map.put("曹操""不可能绝对不可能");
map.put("刘备""接着奏乐接着舞");
map.put("柯镇恶""看我眼色行事");

//3、利用lambda表达式进行遍历
map.forEach(new BiConsumer<String,String>(){
	@Override
	public void accept(String key,String value){
		System.out.println(key + "=" + value);
	}
});

map.forEach((key,value)->System.out.println(key+"="+value));

HashMap

HashMap是Map里面的一个实现类
没有额外需要学习的特有方法,直接使用Map里面的方法就可以了
特点都是由键决定的:无序、不重复、无索引
HashMap跟HashSet底层原理是一模一样的,都是哈希表结构

1、HashMap底层是哈希表结构的
2、依赖hashCode方法和equals方法保证键的唯一
3、如果键存储的是自定义对象,需要重写hashCode和equals方法
如果值存储自定义对象,不需要重写hashCode和equals方法

小练习

需求:
创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
存储三个键值对元素,并遍历
要求:同姓名,同年龄认为是同一个学生

public class Student{
	private Stirng name;
	private int age;
	public Student(){}
	public Student(Stirng name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	public int getAge(){
		reuturn age;
	}
	public void setAge(int age){
		this.age=age;
	}
	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()) reutrn false;
		Student student = (Student) o;
		return age == student.age&&Object.equals(name,student.name);
}
public static void main(String[] args){
	HashMap<Student,String> hm = new HashMao<>();
	Student s1 = new Student(name:"zhangsan",age:23;
	Student s2 = new Student(name:"lisi",age:24);
	Student s3 = new Student(name:"wangwu",age:25);
	Student s4 = new Student(name:"wangwu",age:25);
	
	hm.add(s1,"江苏");
	hm.add(s2,"浙江");
	hm.add(s3,"福建");
	hm.add(s4."山东");

	Set<Student> keys = hm.keySet();
	for(Student key : keys ){
		String value hm.get(key);
		System.out.println(key +"="+value);
	}
}

核心点:
HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法

需求:
某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多

判断集合中是否包含该景点
不包含:表示第一次出现
包含:表示已经出现过了

String[] arr = {"A","B","C","D"};
//利用随机数模拟80个同学的投票,并把投票的结果存储起来
ArrayList<String> list = new ArrayList<>();
Random r = new Random();
for(int i=0;i<80;i++){
	int index = r.nextInt(arr.length);
	list.add(arr[index]);
}
HashMap<String,Integer> hm = new HashMap();
for(String name:list){
	//判断当前的景点在map集合当中是否存在
	if(hm.containsKey(name)){
		//存在
		//先获取当前景点已经被投票的次数
		int count = hm.get(name);
		//表示当前景点又被投了一次
		count++;
		//把新的次数再次添加到集合当中
		hm.put(name,count);
	}else{
		//不存在
		hm.put(name,1);
	}
}
int max = 0;
Set<Map.Entry<String,Integer>> entries = hm.entrySet();
for(Map.Entry<String,Integer> entry : entries){
	int count = entry.getValue();
	if(count>max){
		max=count;
	}
}
System.out.println(max);
for(Map.Entry<String ,Integer> entry:entries){
	int count = entry.getValue();
	if(count == max){
		System.out.println(entry.getKey());
	}
}

LinkedHashMap

由键决定:有序、不重复、无索引
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序

LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
lhm.put("a",123);
lhm.put("a",123);
lhm.put("b",456);
lhm.put("c",789);
System.out.println(lhm);

TreeMap

TreeMap跟TreeSet底层原理一样,都是红黑树结构的
由键决定特性:不重复、无索引、可排序
可排序:对键进行排序
注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

代码书写两种排序规则
实现Comparable接口,指定比较规则
创建集合时传递Comparator比较器对象,指定比较规则

integer、Double默认情况下都是按照升序排列的
String按照字母在ASCII码表中对应的数字升序进行排列的

TreeMap–小练习1

需求:
键:整数表示id
值:字符串表示商品名称
要求:按照id的升序排列,按照id的降序排列

TreeMap<Integer,String> tm = new TreeMap<>();
tm.put(1,"粤利粤");
tm.put(2,"康帅傅");
tm.put(3,"九个核桃");
tm.put(4,"雷碧");
tm.put(5,"可恰可乐");
System.out.println(tm);

TreeMap–小练习2

需求:
键:学生对象
值:籍贯
要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名年龄视为同一个人

```java
public class Student{
	private Stirng name;
	private int age;
	public Student(){}
	public Student(Stirng name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	public int getAge(){
		reuturn age;
	}
	public void setAge(int age){
		this.age=age;
	}
	public String toString(){
		return "Student{name="+name+",age="+age+"}";
	}
	@Override
	public int compareTo(Student o){
		int i = this.getAge()-o.getAge();
		i = i == 0? this.getName().compareTo(o.getName()):i;
		return i;
	}
}
TreeMap<Student,String> tm = new TreeMap<>();
Student s1 = new Student (name:"zhangsan",age:23);
Student s2 = new Student (name:"lsii",age:24);
Student s3 = new Student (name:"wangwu",age:25);

tm.put(s1,"江苏");
tm.put(s2,"天津");
tm.put(s3,"北京");
System.out.println(tm);

TreeMap–小练习3

需求:字符串“aababcabcdabcde”
请统计字符串中每一个字符出现的次数,并按照以下格式输出
输出格式:
a(5)b(4)c(3)d(2)e(1)

String s = "aababcabcdabcde";
TreeMap<Character,Integer> tm = new TreeMap<>();
for(int i=0;i<s.length();i++){
	char c = s.charAt(i);
	//拿着c到集合中判断是否存在
	//存在,表示当前字符又出现了一次
	//不存在,表示当前字符是第一次出现
	if(tm.containsKey(c)){
		int count = tm.get(c);
		count++;
		tm.put(c,count);
	}else{
		tm.put(c,1);
	}
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
tm.forEach(new BiConsumer<Character,Integer>()){
	@Override
	public void accept(Character key ,Integer value){
		sb.append(key).append("(").append(value).append(")");
	}
});
System.out.println(sb);

小总结

1、TreeMap集合的特点是怎么样的?
不重复、无索引、可排序
底层基于红黑树实现排序,增删改查性能较好

2、TreeMap集合排序的两种方式
实现Comparable接口,指定比较规则
创建集合时传递Comparator比较器对象,指定比较规则

你可能感兴趣的:(java,学习,开发语言)