记录:通过数组和arrayList完成一个hash表的 增查删
目录跳转
第一章:hash通过数组和arrayList完成一个hash表的 增查删 注:代码放后面
第二章:jvm
剧本:写
剧情A段: 通过数组和arrayList完成一个hash表的 增查删
故事一:写添加方法
第一幕:
new 一个Arraylist数组
第二幕:
写添加方法
1得到对象hashcode
2对数组长度取余得到
第三幕:
为扩容 补了 负载因子:
为判定多少是非空,补了标志notnull
第四幕:
在增加方法中,补扩容操作
先判 notNull*1.0/data.length 是否>load 负载因子
大于则,说明地方超过多半,需要执行扩容方法reset
第五幕:
补扩容方法,扩容两倍
1新数组=new ArrayList[old数组.length*2];
2遍历数组,重新添加
第3幕:在前面补上 notNull=0 先让非空标志为0, 运行add后,就有东西了
故事二:写get方法
第一幕: 写get(){} 并从add(){} 复制 前三行代码,用来找到散列表的位置
第二幕: 通过遍历hash值 得知我要查的o1是否在散列表里,在的话,就查到了
1利用if判断(数据不为空时), 遍历数组某串的数据,
2通过判断hash值的相等情况,来知晓 我要查的o1是否在散列表o里.
3若在,就查到了
故事三:写remove方法
第一幕: 粘贴get的方法,大部分代码
第二幕:将最内层的get 改为 .remove(o), 意思是要删除
第三幕:返回个布尔值,稍改动下代码
剧情B段: 写main方法,测试写的对否 ,写个teacher和student 类,调用散列表,增查删方法
第二章:jvm
jvm笔记
服务端, 延迟小的好 . 但当计算数据等,等个30秒再算也没毛病,这时吞吐量优先更合适.
客户端,一般要给人用的,自然是低延迟好
1 package com.company.forTest; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 public class MyHash { 8 private List<Object>[] data= new ArrayList[4]; 9 private double load=0.75; 10 private int notNull=0; 11 12 public void add(Object o){ 13 int i = o.hashCode(); 14 int index = i%data.length; 15 List<Object> datum = data[index]; 16 if(datum==null){ 17 datum = new ArrayList<Object> (); 18 notNull++; 19 data[index]=datum; 20 } 21 if(!datum.contains(o)){ 22 data[index].add(o); 23 } 24 if(Double.compare(notNull*1.0/data.length,load) >=0){ 25 reSize(); 26 } 27 } 28 29 private void reSize() { 30 List<Object> [] oldData=data; 31 notNull=0; 32 data= new ArrayList[oldData.length*2]; 33 for (List<Object> oldDatum : oldData) { 34 if(oldDatum!=null){ 35 for (Object o : oldDatum) { 36 add(o); 37 } 38 } 39 } 40 } 41 public Object get(Object o){ 42 int i = o.hashCode(); 43 int index = i%data.length; 44 List<Object> datum = data[index]; 45 if(datum!=null){ 46 for (Object o1 : datum) { 47 if(o1.hashCode()==o.hashCode()&&o1.equals(o)){ 48 return o1; 49 } 50 } 51 } 52 return null; 53 } 54 55 public boolean remove(Object o){ 56 int i = o.hashCode(); 57 int index = i%data.length; 58 List<Object> datum = data[index]; 59 if(datum!=null){ 60 for (Object o1 : datum) { 61 if(o1.hashCode()==o.hashCode()&&o1.equals(o)){ 62 return datum.remove(o); 63 } 64 } 65 } 66 return false; 67 } 68 69 @Override 70 public String toString() { 71 StringBuilder sb = new StringBuilder(); 72 for (List<Object> datum : data) { 73 if(datum != null) { 74 sb.append(datum.toString()); 75 sb.append("\n"); 76 } 77 } 78 79 return "MyHash{" + 80 "data=" + sb.toString() + 81 ", load=" + load + 82 ", notNull=" + notNull + 83 '}'+data.length; 84 } 85 86 public static void main(String[] args) { 87 Student student = new Student(); 88 MyHash myHash = new MyHash(); 89 myHash.add(student); 90 myHash.remove(student); 91 Object o = myHash.get(student); 92 for(int i = 0; i < 10; i++){ 93 Teacher teacher = new Teacher(); 94 teacher.setAge(i+40); 95 myHash.add(teacher); 96 } 97 98 System.out.println(myHash); 99 } 100 }
代码: Myhah.java
1 package com.company.forTest; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 public class MyHash { 8 private List<Object>[] data= new ArrayList[4]; 9 private double load=0.75; //负载因子,判断是否扩容的值. 一般能取 0.75-1.5 0.75-1是通过数量判断扩容 1-1.5通过所有节点来判断 10 private int notNull=0; //用来判断 散列表这个 桶 有多少是挂了东西的 11 12 public void add(Object o){ 13 int i = o.hashCode(); 14 int index = i%data.length; 15 List<Object> datum = data[index];
//上面三行代码,用来找到散列表的位置 16 if(datum==null){ //如果散列表这个位置,没有东西,就创建一个 双向联结循环链表(LIst)之 ArrayList, 将其挂在散列表的index这个位置上 List是双向联结循环链表 17 datum = new ArrayList<Object> (); 18 notNull++; 19 data[index]=datum; 20 } 21 if(!datum.contains(o)){ //如果这个位置没有o这个对象,则添加上去 22 data[index].add(o); 23 } 24 if(Double.compare(notNull*1.0/data.length,load) >=0){ //如果 非空桶除以data.length >load ,则说明空间快不足了, 赶紧扩容 25 reSize(); 26 } 27 } 28 29 private void reSize() { 30 List<Object> [] oldData=data; 31 notNull=0; 32 data= new ArrayList[oldData.length*2]; //扩容两倍 33 for (List<Object> oldDatum : oldData) { 34 if(oldDatum!=null){ 35 for (Object o : oldDatum) { 36 add(o); 37 } 38 } 39 } 40 } 41 public Object get(Object o){ 42 int i = o.hashCode(); 43 int index = i%data.length; 44 List<Object> datum = data[index]; 45 if(datum!=null){ //如果传进来的对象o,比如 学生王润洁;在散列表里,也发现王润洁,说明能获取.表现形式是o1和o对象相同, 当然散列码也相同 46 for (Object o1 : datum) { 47 if(o1.hashCode()==o.hashCode()&&o1.equals(o)){ 48 return o1; 49 } 50 } 51 } 52 return null; 53 } 54 55 public boolean remove(Object o){ 56 int i = o.hashCode(); 57 int index = i%data.length; 58 List<Object> datum = data[index]; 59 if(datum!=null){ 60 for (Object o1 : datum) { 61 if(o1.hashCode()==o.hashCode()&&o1.equals(o)){ 62 return datum.remove(o); 63 } 64 } 65 } 66 return false; 67 } 68 69 @Override 70 public String toString() { //重写toString,用来打印,查看代码效果 71 StringBuilder sb = new StringBuilder(); 72 for (List<Object> datum : data) { 73 if(datum != null) { 74 sb.append(datum.toString()); 75 sb.append("\n"); 76 } 77 } 78 79 return "MyHash{" + //重写Myhash,打印出hash值 80 "data=" + sb.toString() + 81 ", load=" + load + 82 ", notNull=" + notNull + 83 '}'+data.length; 84 } 85 86 public static void main(String[] args) { //老师部分: 87 Student student = new Student(); 88 MyHash myHash = new MyHash(); 89 myHash.add(student); 90 myHash.remove(student); 91 Object o = myHash.get(student); 92 for(int i = 0; i < 10; i++){ 93 Teacher teacher = new Teacher(); 94 teacher.setAge(i+40); //因为 95 myHash.add(teacher); 96 } 97 98 System.out.println(myHash); 99 } 100 }
运行结果:
Teacher.java
1 package com.company.forTest; 2 3 import java.util.Objects; 4 5 public class Teacher { 6 private String name; 7 private int age; 8 9 public String getName() { 10 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public int getAge() { 19 return age; 20 } 21 22 public void setAge(int age) { 23 this.age = age; 24 } 25 26 @Override 27 public boolean equals(Object o) { 28 if (this == o) return true; 29 if (o == null || getClass() != o.getClass()) return false; 30 Teacher teacher = (Teacher) o; 31 return age == teacher.age && 32 Objects.equals(name, teacher.name); 33 } 34 35 @Override 36 public int hashCode() { 37 return Objects.hash(name, age); 38 } 39 40 @Override 41 public String toString() { //+hashCode() 在控制阿台,老师部分会打印hash值 42 return "Teacher{" + 43 "name='" + name + '\'' + 44 ", age=" + age + 45 '}'+hashCode(); 46 } 47 }
Student.java
1 package com.company.forTest; 2 3 import java.util.Objects; 4 5 public class Student { 6 private String name; 7 private String School; 8 9 @Override 10 public boolean equals(Object o) { 11 if (this == o) return true; 12 if (o == null || getClass() != o.getClass()) return false; 13 Student student = (Student) o; 14 return Objects.equals(name, student.name) && 15 Objects.equals(School, student.School); 16 } 17 18 @Override 19 public int hashCode() { 20 return Objects.hash(name, School); 21 } 22 23 @Override 24 public String toString() { // 学生部分会打印姓名,学校 和hash值 25 return "Student{" + 26 "name='" + name + '\'' + 27 ", School='" + School + '\'' + 28 '}'+hashCode(); 29 } 30 }