浅谈哈希表和有序表

文章详细介绍了HashMap在Java中的使用,包括其Key的存储方式,时间复杂度分析,以及基本类型和自定义类的区别。同时,对比了有序表的概念,如红黑树实现的TreeMap,强调了有序表的增删改查时间复杂度为O(logn)。文章还举例展示了TreeMap的操作,如查找、插入和删除等。
摘要由CSDN通过智能技术生成

哈希表

HashMap在开发中一定都用过,其Key就是用Hash表来进行存储,而HashMap中,无论数据量多大,增删改查操作的时间复杂度都是 O(1)(忽略掉单样本大小的情况下,比如说:加一个数字,如果加一个字符串,字符串长度很长,是一本书的内容,那它就不是O(1),如果添加的都是字符串,那复杂度就是O(K),K为平均长度),只不过如果数据量大的话这个常数操作的时间可能会有点长。
HashMap中,如果Key是Java的基本数据类型,那么它就是值传递,如果是自定义的Java类,就是引用传递,代码如下。

  //Integer对象在超过127之后,会new新的对象来存储,所以a,b的地址不相等
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);
        HashMap<Integer, String> map = new HashMap();
        map.put(a, "a");
        //但在HashMap中,基本数据类型不存在引用传递,此时会返回true
        System.out.println(map.containsKey(b));

        HashMap<String, String> map1 = new HashMap();
        String s1 = "a";
        String s2 = new String("a");
        System.out.println(s1 == s2);
        map1.put(s1, "a");
        System.out.println(map1.containsKey(s2));
        
        HashMap<Te, String> test = new HashMap();
        Te t1 = new Te(1);
        Te t2 = new Te(1);
        System.out.println(t1 == t2);
        test.put(t1, "我是test1");
        System.out.println(test.containsKey(t2));

一个HashMap<String,String>中,如果Key和Value存储的字符串特别大,比如说Key和Value分别存的是一本书的内容,Key和Value有多大,就会开辟多大的空间来存储,此时如果用一个Book类来存储这本书的内容,HashMap<Book,Book>的形式来存储,Key就会非常小,只有Book的地址8字节。

有序表

有序表是一个接口名,Java中能够实现有序表的有很多,比如红黑树、AVL树、SB树、跳表等。。。所有有序表想提供的功能,这些结构都可以实现。增删改查的时间复杂度为 O ( l o g n ) O(log^n) O(logn),Java中常见的TreeMap就是有序表的结构,底层是红黑树来实现。
有序表中,基本类型按值传递,如果想要存储自定义的类,需要自己实现比较器。如果自己实现的比较器(根据学生类的age进行排序),那两个学生age相同的话,TreeMap中只会存储一个。
代码如下:

TreeMap<Integer, String> treeMap = new TreeMap();
        treeMap.put(3, "我是3");
        treeMap.put(9, "我是9");
        treeMap.put(5, "我是5");
        treeMap.put(2, "我是2");
        treeMap.put(1, "我是1");
        treeMap.put(7, "我是7");

        System.out.println(treeMap.ceilingKey(1));
        System.out.println(treeMap.ceilingKey(11));

        System.out.println(treeMap.get(1));
        System.out.println(treeMap.get(11));

        treeMap.put(5,"它是5");
        System.out.println(treeMap.get(5));

        treeMap.remove(5);
        System.out.println(treeMap.get(5));

        System.out.println(treeMap.firstKey());
        System.out.println(treeMap.lastKey());

        //<= 5的第一个数
        System.out.println(treeMap.floorKey(5));
        //>= 5的第一个数
        System.out.println(treeMap.ceilingKey(5));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值