day09——集合

红黑树的规则

1.每一个节点要么是红色要么是黑色
2.根节点是黑色的
3.如果一个节点没有子节点,那么它的子节点看作是Nil(叶子节点),叶子节点是黑色的
4.一个节点为红色,那么它的子节点必须是黑色的
5.对于任意一个节点,到其叶子节点的简单路径包含相同数目黑色节点。

注意:添加元素到红黑树,默认颜色是红色,如果破坏红黑规则,需要进行红黑变化。

在这里插入图片描述

HashSet的基本使用

public class Student {
    private String name;
    private int age;
		//构造方法、get和set方法自己补上
  
  	//复写hashCode和equals方法,是为了保证HashSet集合中元素的唯一性
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

HashSet1.7版本的原理

HashSet数据结构:哈希表结构(数组+链表)
往HashSet集合中添加元素的原理:
  1.计算元素的hashCode值
  2.根据数组的长度计算存储的索引位置,继续判断这个位置有没有存储元素
  	如果没有元素(null),把元素直接存储在这个位置
    如果有元素,继续通过equals方法判断元素的属性值是否一样
  		如果equals比较为true,就说明元素重复
      如果equals比较为false,以链表的形式存储在数组的同一个索引位置
 
注意事项:往HashSet集合中存储元素,要保证元素的唯一性,需要我们复写hashCode和equals方法

在这里插入图片描述

HashSet1.8版本的原理

HashSet数据结构:哈希表结构(数组+链表+红黑树)
往HashSet集合中添加元素的原理:
  1.计算元素的hashCode值
  2.根据数组的长度计算存储的索引位置,继续判断这个位置有没有存储元素
  	如果没有元素(null),把元素直接存储在这个位置
    如果有元素,继续通过equals方法判断元素的属性值是否一样
  		如果equals比较为true,就说明元素重复
      如果equals比较为false,以链表的形式存储在数组的同一个索引位置
  				如果链表的长度超过8,就把链表转化为红黑树(提高查询的效率)
 
注意事项:往HashSet集合中存储元素,要保证元素的唯一性,需要我们复写hashCode和equals方法

在这里插入图片描述

Collection集合小结

Collection接口
  -- List接口:有索引、存取顺序一致、元素可以重复
  	   -- ArrayList类:数组结构,查询快增删慢
  		 -- LinkedList类:链表结构,查询慢增删快
  
  -- Set接口:没有索引、存取顺序不一致、元素不可以重复
  		 -- TreeSet类:红黑树结构,可以对元素进行排序
  		 -- HashSet类:哈希表结构,可以保证元素唯一

Map集合

Map集合中存储的元素是以【键-值对】的形式存在的,每一个【键-值对】用Entry对象来表示。键不能重复,值是可以重复的。

Map的常用方法

public V put(K key,V value)
  添加键和值,键如果重复会覆盖旧的值,并且把旧的值返回。
public V remove(K key)
  根据键来移除整个键值对
public V get(K key)
  通过键获取值
public boolean	containsKey(Object key) 
  判断是否包含键
public boolean	containsValue(Object value) 
  判断是否包含值
public int	size() 
  获取【键值对】的个数

public Set<K>	keySet()
  获取键的集合
public Collection<V>	values() 
  获取值的集合
public Set<Map.Entry<K,V>>	entrySet() 
  获取所有的键值对
Map<String,Integer>  map = new HashMap<>();

//put: 添加键和值
map.put("zhangsan",20);
map.put("lisi",25);
map.put("wangwu",23);

//添加键值对,如果键重复会替换旧的值,并且把旧值返回。
Integer e = map.put("wangwu", 50);
System.out.println(e);

//根据键获取值
Integer value = map.get("lisi");
System.out.println(value);

//删除
map.remove("lisi");

System.out.println(map); 

Map集合的遍历

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

map.put("zhangsan","武汉");
map.put("lisi","上海");
map.put("wangwu","北京");
map.put("zhaoliu","深圳");

//遍历方式1:keyset方法
//获取所有的键
Set<String> keys = map.keySet();
for (String key : keys) {
  //再通过键找对应的值
  String value = map.get(key);
  System.out.println(key+"..."+value);
}

System.out.println("----------");

//遍历方式2:entrySet方法
//获取所有的【键值对】对象 
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
  //获取键
  String key = entry.getKey(); 
  //获取值
  String value = entry.getValue();
  System.out.println(key+"..."+value);
}

在这里插入图片描述

HashSet和HashMap的关系

通过查看源码发现
  	1.HashSet集合底层其实用的就是HashMap集合,把HashSet集合的元素当作HashMap集合的键来存储的
    2.HashSet底层是哈希表结构,所以HashMap也是哈希表结构。

Map集合练习

//键盘录人一个字符串,求字符串中每一个字符出现的个数
Scanner sc=new Scanner(System.in);
String str = sc.next();

//创建一个HashMap集合
HashMap<Character,Integer> map=new HashMap<>();

//遍历字符串中的字符
for (int i = 0; i < str.length(); i++) {
  char ch = str.charAt(i);
  //判断是否包含键
  if(map.containsKey(ch)){
    Integer value = map.get(ch);
    map.put(ch,value+1);
  }else {
    map.put(ch,1);
  }
}

//遍历map集合
Set<Map.Entry<Character, Integer>> entries = map.entrySet();
for (Map.Entry<Character, Integer> entry : entries) {
  Character key = entry.getKey();
  Integer value = entry.getValue();
  System.out.println(key+"("+value+")");
}

TreeSet和TreeMap的关系

通过查看源码发现
  	1.TreSet集合底层其实用的就是TreeMap集合,把TreeSet集合的元素当作TreeMap集合的键来存储的
    2.TreeSet底层是红黑树结构,所以TreeMap也是红黑树结构。
TreeSet<Student> st=new TreeSet<>();
st.add(new Student("张三",20));
st.add(new Student("李四",18));
st.add(new Student("王五",23));
st.add(new Student("赵六",19));
st.add(new Student("赵六",19));

for (Student student : st) {
	System.out.println(student);
}

System.out.println("--------------"); 

TreeMap<Student,String> map=new TreeMap<>();
map.put(new Student("张三",20),"武汉");
map.put(new Student("李四",18),"长沙");
map.put(new Student("王五",23),"合肥");
map.put(new Student("赵六",19),"南京");
map.put(new Student("赵六",19),"石家庄");

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

\\192.168.66.74
账号:share
密码:itheima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值