记录:通过数组和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

 

代码: 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 }

 

posted @ 2021-02-23 22:00  八佰山兵上北坡  阅读(81)  评论(0编辑  收藏  举报