Set,String和Map
1. Set集合
1.1 Set特征
Set集合特征
无序
添加顺序和存储顺序不一致,
不能依赖Set做排序处理!!!
不可重复
Set中不能出现相同元素
1.2 HashSet存储过程
HashSet底层存储数据的结构是哈希表。
哈希表存储效率和查询效率都很高!!!
哈希表中每一个单元格都可以存储多个元素,是一个【桶式结构】,没有顺序,没有要求
但是我们所期望使用的哈希表是在每一个单元格内都有且只存储一个元素,提高存储和查询效率
哈希表存储数据依赖于HashCode方法,需要获取对应当前元素的哈希值。
存储元素到hashSet中
1. 首先获取当前存储对象的HashCode值
2. 通过底层哈希表的【移位运算】,计算得到当前元素一个存储在哈希表的位置。
3.
a. 当前哈希表单元格位置没有其他元素,直接存入
b. 当前哈希表单元格位置有其他元素,需要调用equals方法进行比较
【期望】每一个单元格有且只有一个元素。
equals方法比较结果为true,hashCode值一致,同一个单元格内不可能出现
相同元素
1.3 TreeSet存储要求
TreeSet存储自定义元素
1. 自定义类遵从Comparable接口
2. 自定义比较器类遵从Comparator接口
package com.qfedu.a_set;
import java.util.Objects;
/**
* 当前自定义类,遵从Comparable<T>接口,给当前类提供一个比较方式!!!
* 要求当前类实现Comparable<T>接口中的 compareTo方法
* int compareTo(T t);
*/
public class SingleDog implements Comparable<SingleDog> {
private int id;
private String name;
private char gender;
public SingleDog() {
}
public SingleDog(int id, String name, char gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "SingleDog{" +
"id=" + id +
", name='" + name + '\'' +
", gender=" + gender +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof SingleDog)) {
return false;
}
SingleDog singleDog = (SingleDog) o;
return getId() == singleDog.getId() &&
getGender() == singleDog.getGender() &&
Objects.equals(getName(), singleDog.getName());
}
@Override
public int hashCode() {
return Objects.hash(getId(), getName(), getGender());
}
@Override
public int compareTo(SingleDog o) {
System.out.println("compareTo Method Called!");
/*
大于0
前者大于后者
小于0
后者大于前者
等于0
两者一致,无法存入
*/
return this.getId() - o.getId();
}
}
package com.qfedu.a_set;
import java.util.Comparator;
/**
* 自定义比较器类对象,遵从Comparator<T>接口
* 需要实现的方式:
* int compare(T o1, T o2)
*/
public class MyComparator implements Comparator<SingleDog> {
@Override
public int compare(SingleDog o1, SingleDog o2) {
System.out.println("compare Method Called!!!");
return o1.getId() - o2.getId();
}
}
2. String类
2.1 String类存储方式和比较方式要求
package com.qfedu.b_string;
public class Demo1 {
public static void main(String[] args) {
String str1 = "刘氏烤羊排";
String str2 = "刘氏烤羊排";
String str3 = new String("刘氏烤羊排");
String str4 = new String(str1);
/*
双等号比较是比较当前变量中保存的空间首地址
在开发中如果是双引号包含的字符串,内容一致则为同一个字符串!!!
*/
System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str2 == str3 : " + (str2 == str3));
System.out.println("str3 == str4 : " + (str3 == str4));
System.out.println("str4 == str1 : " + (str4 == str1));
// 字符串等于判断推荐使用equals方法
System.out.println("str1.equals(str2) :" + str1.equals(str2));
System.out.println("str2.equals(str3) :" + str2.equals(str3));
System.out.println("str3.equals(str4) :" + str3.equals(str4));
System.out.println("str4.equals(str1) :" + str4.equals(str1));
}
}
2.2字符串内存分析
2.3 String类常用方法
int length() 获取字符串的长度
char charAt(int index) 获取特定位置的字符 (角标越界)
int indexOf(String str) 获取特定字符串的位置(overload)
int indexOf(char ch) 获取特定字符的位置(overload)
int indexOf(String str, int fromIndex) 从指定下标位置fromIndex开始,获取指定字符串的位置
int indexOf(char ch, int fromIndex) 从指定下标位置fromIndex开始,获取特定字符的位置(overload)
int lastIndexOf(int ch) 获取最后一个字符的位置
int lastIndexOf(String str) 获取最后一个字符串的位置
int lastIndexOf(int ch, int fromIndex) 从指定下标位置fromIndex开始,获取最后一个指定字符的位置
int lastIndexOf(String str, int fromIndex) 从指定下标位置fromIndex开始,获取最后一个指定字符串的位置
boolean endsWith(String str) 是否以指定字符结束
boolean isEmpty()是否长度为0 如:“” null V1.6
boolean contains(CharSequences) 是否包含指定序列 应用:搜索
boolean equals(Object anObject) 是否相等
boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等
String(char[] value) 将字符数组转换为字符串
String(char[] value, int offset, int count)
offset 偏移量,从哪一个下标开始获取数据 count获取字符的个数
static String valueOf(char[] data)
static String valueOf(char[] data, int off, int len)
char[] toCharArray() 将字符串转换为字符数组
String replace(char oldChar, char newChar) 替换
String[] split(String regex) 切割
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)截取字符串
String toUpperCase() 转大写
String toLowerCase() 转小写
String trim() 去除空格
3. Map双边队列
3.1 Map特征
Map<K, V> 接口,存储数据都是【键值对】形式
键值对:
姓名=猴王
年龄=16
性别=男
开发中很多数据都是键值对形式
数据库 字段和对应值
XML文件标签和存储数据
JSON 键和值
interface Map<K, V>
--| HashMap<K, V>
--| TreeMap<K, V>
3.2 Map常用方法
增:
put(K k, V v); 保存一个键值对到当前Map双边队列中
putAll(Map<? extends K, ? extends V> map);
添加另一个Map双边队列到当前Map双边队列中
要求K是当前Map对应K本身或者其子类
要求V是当前Map对应V本身或者其子类
删:
remove(Object key); 根据指定的Key删除对应的键值对
改:
put(K k, V v); 如果对应K存在,使用v修改对应的值
查:
int size(); 当前Map双边队列中键值对个数
boolean isEmpty(); 判断当前双边队列是否为空
boolean containsKey(Object key); 判断Key是否存在
boolean containsValue(Object value); 判断指定Value是否存在
Set<K> keySet(); 返回当前所有Key对应的Set集合
Collection<V> values(); 返回所有值对应的Collection集合