红黑树的规则
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