每日要点
Set
Collection
- Set
- HashSet
- TreeSet
例子
//Set<String> set = new HashSet<>();
Set<String> set = new TreeSet<>();
set.add("apple");
set.add("grape");
set.add("blueberry");
set.add("pitaya");
set.add("apple");
System.out.println(set.size());
for (String str : set) {
System.out.print(str.hashCode() + " ---> ");
System.out.println(str);
}
System.out.println("===================");
set.remove("pitaya");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
set.clear();
System.out.println(set.size());
哈希存储只要能设计出一个好的哈希函数就是存取性能都特别好的存储方案
好的哈希函数应该是:让不同的对象尽可能产生不同的哈希码
哈希存储/哈希函数 有的地方也称之为散列存储/散列函数
如果要使用HashSet那么一定要重写两个方法:
- hashCode() ---> 让相同的对象产生相同的哈希码,让不同的对象尽可能产生不同的哈希码
- equals() ---> 定义比较两个对象的规则 (引用、类型、属性)
- 自反性
- 对称性
- 传递性
- 一致性
- equals() ---> 定义比较两个对象的规则 (引用、类型、属性)
public int hashCode() {
}
public boolean equals(Object obj) {
}
要使用TreeSet那么对象必须是可比较的因为TreeSet底层是一颗排序树
可以通过实现Comparable接口并重写compareTo方法来实现比较的功能
public int compareTo(T o) {
}
杂项
模型类(Model)/实体类(Entity) ---> 数据(Data)
失血模型/贫血模型
String类的indexOf()方法 返回-1没有类似的,返回其他整数为在字符串最先出现的位置
lastIndexOf 最后出现
例子
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 哈希存储只要能设计出一个好的哈希函数就是存取性能都特别好的存储方案
// 好的哈希函数应该是:让不同的对象尽可能产生不同的哈希码
// 哈希存储/哈希函数 有的地方也称之为散列存储/散列函数
// 如果要使用HashSet那么一定要重写两个方法:
// - hashCode() ---> 让相同的对象产生相同的哈希码,让不同的对象尽可能产生不同的哈希码
// - equals() ---> 定义比较两个对象的规则 (引用、类型、属性)
// - 自反性
// - 对称性
// - 传递性
// - 一致性
@Override
public int hashCode() {
final int prime = 31;
int result = 17;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return name + ":" + age;
}
// 要使用TreeSet那么对象必须是可比较的因为TreeSet底层是一颗排序树
// 可以通过实现Comparable接口并重写compareTo方法来实现比较的功能
@Override
public int compareTo(Student o) {
if (this.name.compareTo(o.name) == 0) {
return this.age - o.age;
}
else {
return this.name.compareTo(o.name);
}
}
}
class Test02 {
public static void main(String[] args) {
// Set<Student> set = new HashSet<>();
Set<Student> set = new TreeSet<>();
Student s1 = new Student("王大锤", 18);
set.add(s1);
set.add(new Student("小白", 36));
Student s2 = new Student("王大锤", 128);
set.add(s2);
System.out.println(s1.equals(s2));
System.out.println(set.size());
for (Student student : set) {
System.out.print(student.hashCode() + " ---> ");
System.out.println(student);
}
}
}
例子2
String str1 = "hello, world";
System.out.println(str1.indexOf("llo"));
String str2 = "hello00000000, goooooood";
System.out.println(str2.lastIndexOf("ooo"));
作业
-
1.通讯录
联系人:
// 模型类(Model)/实体类(Entity) ---> 数据(Data)
// 失血模型/贫血模型
public class ContactInfo {
private String name;
private String tel;
private String email;
public ContactInfo(String name, String tel, String email) {
this.name = name;
this.tel = tel;
this.email = email;
}
public String getName() {
return name;
}
public String getTel() {
return tel;
}
public String getEmail() {
return email;
}
@Override
public String toString() {
return String.format("姓名:%s\n电话号码:%s\n电子邮件:%s\n ", name, tel, email);
}
}
通讯录:
public class ContactMannager {
private List<ContactInfo> infoList;
public ContactMannager() {
this.infoList = new ArrayList<>();
infoList.add(new ContactInfo("张三", "18209802948", "71231@163.com"));
infoList.add(new ContactInfo("李四", "18132435235", "7wre@qq.com"));
infoList.add(new ContactInfo("王五", "18323562312", "sdfq@gmail.com"));
infoList.add(new ContactInfo("张三", "18213802948", "7123ads1@163.com"));
}
public void add(ContactInfo info) {
infoList.add(info);
}
public void delete(ContactInfo info) {
infoList.remove(info);
}
public List<ContactInfo> findByName(String name) {
List<ContactInfo> resultList = new ArrayList<>();
for (ContactInfo info : infoList) {
if (info.getName().indexOf(name) != -1) {
resultList.add(info);
}
}
return resultList.size() > 0 ? resultList : Collections.<ContactInfo>emptyList();
}
public List<ContactInfo> findAll() {
return infoList;
}
}
测试:
class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ContactMannager mannager = new ContactMannager();
boolean end = false;
while(!end) {
int choice;
do {
System.out.println("1.添加联系人");
System.out.println("2.联系人列表");
System.out.println("3.查找联系人");
System.out.println("4.退出");
System.out.print("请选择: ");
choice = input.nextInt();
} while (choice < 1 || choice > 4);
switch (choice) {
case 1:
{
System.out.print("请输入联系人名称: ");
String name = input.next();
System.out.print("请输入联系人电话: ");
String tel = input.next();
System.out.print("请输入联系人电子邮件: ");
String email = input.next();
ContactInfo info = new ContactInfo(name, tel, email);
mannager.add(info);
break;
}
case 2:
{
List<ContactInfo> list = mannager.findAll();
for (ContactInfo info : list) {
System.out.println(info);
}
break;
}
case 3:
{
System.out.print("请输入联系人名称: ");
String name = input.next();
List<ContactInfo> list = mannager.findByName(name);
for (int i = 0; i < list.size(); i++) {
System.out.println("编号: " + i);
System.out.println(list.get(i));
}
if (list != null) {
System.out.println("1.删除联系人");
System.out.println("default.返回上级菜单");
String choose = input.next();
switch (choose) {
case "1":
System.out.print("请输入要删除联系人的编号: ");
int num = input.nextInt();
if (0 <= num && num < list.size()) {
mannager.delete(list.get(num));
}
break;
default:
break;
}
}
break;
}
case 4:
end = true;
break;
}
}
input.close();
}
}