容器之ArrayList与HashMap底层实现

  • Post author:
  • Post category:其他



老规矩先上框架图:


在这里插入图片描述



代码部分:



1. 测试ArrayList类的方法:

package RongQI.Collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 测试Collection接口中的方法
 */
public class TestArraylist {
    public static void main(String[] args) {
        test03();
    }

    public static void test01(){
        Collection<String> c=new ArrayList();
        //size()查看元素个数
        System.out.println(c.size());
        //isEmpty()查看是否为空
        System.out.println(c.isEmpty());
        //add()添加元素
        c.add("高老大");
        c.add("高老二");
        System.out.println(c);
        //remove() 把对象从容器中移出,但对像还在
        c.remove("高老二");
        System.out.println(c);
        c.clear();
        System.out.println(c);
        //contains 判断是否包含的情况
        System.out.println(c.contains("高老二"));
        test02();
    }
    public  static void test02(){
        List<String>list01=new ArrayList<>();
        list01.add("aa");
        list01.add("oi");
        list01.add("qwe");

        List<String>list02=new ArrayList<>();
        list02.add("aa");
        list02.add("asd");
        list02.add("zxc");
        System.out.println(list01);
        //addAll将另一个集合所有元素添加到另一个集合
        list01.addAll(list02);
        System.out.println(list01);
        //一个集合去除另一个集合中相同的元素
        //相当于两个集合:A-B
        list01.removeAll(list02);
        System.out.println(list01);
        //retainAll 取交集
        list01.retainAll(list02);
        //containsAll如果集合A包含所有的集合B 返回TRUE
        list01.containsAll(list02);
    }
    //测试索引相关方法
    public static  void test03(){
        List<String>list=new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("B");
        System.out.println(list);
        //list.add(2,"皓月当空");在指定位置插入元素,后面元素后移一位
        list.add(2,"皓月当空");
        System.out.println(list);
        //list.remove(2); 将2位置的元素进行移出 然后后面元素都向前移动一位
        list.remove(2);
        System.out.println(list);
        //list.set(2,"rty"); 将2处元素进行更换
        list.set(2,"rty");
        System.out.println(list);
        //获得指定位置的元素
        System.out.println(list.get(2));
        //list.indexOf("B") 返回List中第一次出现指定元素的位置,没有就返回-1
        System.out.println(list.indexOf("B"));
        //list.lastIndexOf("B")返回list中从后向前数第一次碰到指定元素的位置
        System.out.println(list.lastIndexOf("B"));
    }
}




2.测试Map类方法

package RongQI.Map;

import java.util.HashMap;
import java.util.Map;

public class TestMap {
    public static void main(String[] args) {
        TestMap testMap=new TestMap();
        testMap.testMap2();
    }
    public static void testMap1(){
        //键值对里可以是任意对象
        Map<Integer,String> m1=new HashMap();
        // m1.put(1,"one"); 向m1里存键值对
        m1.put(1,"one");
        m1.put(2,"two");
        m1.put(3,"three");
        //m1.get(1)获得指定键值对
        System.out.println(m1.get(1));
        System.out.println(m1);
        //m1.size()获得m1内键值对的个数
        System.out.println(m1.size());
        //m1.isEmpty() 判断m1是否为空
        System.out.println(m1.isEmpty());
        //m1.containsKey(2) 是否含有2这个键
        System.out.println(m1.containsKey(2));
        //m1.containsValue("two") 是否包含“two”这个值
        System.out.println(m1.containsValue("two"));

        Map<Integer,String >m2=new HashMap<>();
        m2.put(3,"4");
        m2.put(5,"五");
        //m1.putAll(m2); 将另一个map加到第一个去
        //若键重复(equals方法判断),就会覆盖前一个
        m1.putAll(m2);
        System.out.println(m1);
    }
    public  void testMap2(){
        Employee e1=new Employee(1001,"张三",5000);
        Employee e2=new Employee(1002,"李四",7000);
        Employee e3=new Employee(1003,"王五",8000);
        Employee e4=new Employee(1001,"赵六",8000);


        Map<Integer,Employee> map=new HashMap<>();
        map.put(e1.getId(),e1);
        map.put(e2.getId(),e2);
        map.put(e3.getId(),e3);
        //若再次存入相同的键,会覆盖上一个
        map.put(e4.getId(),e4);
        System.out.println(map.get(e1.getId()).getName());
        System.out.println(map);


    }
    //雇员信息
    class  Employee{
        private int id;
        private String name;
        private  double salary;

        public Employee(int id, String name, double salary) {
            this.id = id;
            this.name = name;
            this.salary = salary;
        }

        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 double getSalary() {
            return salary;
        }

        public void setSalary(double salary) {
            this.salary = salary;
        }
    }
}



3.HashMap的底层实现(put方法 toSring方法)

1.创建一个结点类

/*
用于SxtHashMap中
 */
public class Node2 {
    int hash;
    Object key;
    Object value;
    Node2 next;
}

2.实现

package RongQI.Map;

import javax.xml.soap.Node;
import java.util.Arrays;

/*
自定义一个HashMap
 */
public class SxtHashMap01 {
    Node2[] table;//位桶数组 bucket array
    int size; //存放键值对的个数

    public SxtHashMap01() {
        this.table =new Node2[16];//长度一定是2的整数幂
    }
    public void put(Object key,Object value){
        //定义新的节点对象
        Node2 newNode =new Node2();
        newNode.hash=myHash(key.hashCode(),table.length);
        newNode.key=key;
        newNode.value=value;
        newNode.next=null;
        boolean keyRepeat =false;
        Node2 temp=table[newNode.hash];
        Node2 iterLast=null;
        if(temp==null){
            //如果节点为空,直接赋值
            table[newNode.hash]=newNode;
        }else{
            //若不为空则尾插链表
            while (temp!=null){
                //判断是否有重复 ,有则覆盖
                if(temp.key.equals(key)){
                    keyRepeat=true;
                    System.out.println("key重复了");
                    temp.value=value;//重复了覆盖value就行
                    break;
                }else{
                    iterLast=temp;
                    temp=temp.next;
                }
            }
            if(keyRepeat==false){
                iterLast.next=newNode;
            }

        }
    }
    public int myHash(int v,int length){
          return v&(length-1);
    }

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder("{");
        for(int i=0;i<table.length;i++){
            Node2 temp=table[i];
            while (temp!=null){
                sb.append(temp.key+":"+temp.value+",");
                temp=temp.next;
            }
        }
        sb.setCharAt(sb.length()-1,'}');
        return sb.toString();
    }

    public static void main(String[] args) {
        SxtHashMap01 m=new SxtHashMap01();
        m.put(10,"aa");
        m.put(20,"bb");
        m.put(30,"cc");
        m.put(40,"dd");
        System.out.println(m);
    }
}



版权声明:本文为weixin_43834595原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。