泛型的特点和深浅拷贝的区别以及不相等对象的hashcode值的问题

永远都不为自己选择的道路而后悔,人生如同坐火车,风景再美也会后退,流逝的时间和邂逅的人终会渐行渐远,前行的始终是自己
在这里插入图片描述

泛型常用特点

泛型是JavaSE1.5之后的特性,《Java核心技术》中对泛型的定义是:

“泛型”意味着编写的代码可以被不同类型的对象所重用

“泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer,String,自定义的各种类型等,但在我们使用的时候通过具体的规则类约束,如我们可以约束集合中只存放Integer类型的元素,如

List<Integer> iniData = new ArrayList<>()

使用泛型的好处:

以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。

深拷贝和浅拷贝的区别

  • 浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.

    意思就是虽然拷贝了,但是都指向一个引用

  • 深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍.

    意思就是全部都拷贝了,指向不同的引用

两个不相同的对象有可能有相同的hashcode值

在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.

当hash冲突产生时,一般有以下几种方式来处理:

  • 拉链法

    每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链 表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.

  • 开放定址法

    一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总 能找到,并将记录存入

  • 再哈希(双哈希法)

    有多个不同的Hash函数.当发生冲突时,使用第二个,第三个…等哈希函数 计算地址,直到无冲突.

在这里插入图片描述

二分查找

题目:乘法表中第k小的数

难度:🌟🌟🌟🌟🌟

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/kth-smallest-number-in-multiplication-table

几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第 k 小的数字吗?

乘法表是大小为 m x n 的一个整数矩阵,其中 mat[i][j] == i * j(下标从 1 开始)。

给你三个整数 m、n 和 k,请你在大小为 m x n 的乘法表中,找出并返回第 k 小的数字。
示例1
示例2
请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

class Solution {
    public int findKthNumber(int m, int n, int k) {
        int l = 1;
        int r = n*m;
        while(l < r){
            int mid  = (l+r) >> 1;
            if(check(m, n, mid, k)){
                l = mid + 1;
            }else {
                r = mid; 
            }
        }
        return r;
    }

    public boolean check(int m, int n, int mid, int k){
        int i = m;
        int j = 1;
        int count = 0;
        while(i > 0 && j <= n && j > 0){
            if((i * j) <= mid){
                count += i;
                j++;
            }else {
                i--;
            }
        }
        return count < k;
    }
}

题解:

这个问题类似于求一个二维数组的第k小问题,只不过由mat[i][j] < mid 变成了i*j < mid

详情看二分查找—有序矩阵中第 K 小的元素

class Solution {
    public int findKthNumber(int m, int n, int k) {
        int l = 1, r = m * n;
        while (l < r) {
            int mid = l + r >> 1, cnt = getCnt(mid);
            if (cnt >= k) r = mid;
            else l = mid + 1;
        }
        return r;
    }
    int getCnt(int mid) {
        int ans = 0;
        for (int i = 1; i <= n; i++) ans += (i * m) <= mid ? m : mid / i;
        return ans;
    }
}

精简答案!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以定义一个泛型接口`MinMaxFinder<T>`,其中`T`代表对象的类型,接口中包含两个方法: 1. `T findMax(T[] arr)`:返回`arr`数组中的最大。 2. `T findMin(T[] arr)`:返回`arr`数组中的最小。 以下是示例代码: ```java public interface MinMaxFinder<T extends Comparable<T>> { T findMax(T[] arr); T findMin(T[] arr); } ``` 其中,`T extends Comparable<T>`表示泛型`T`必须实现`Comparable`接口,以支持比较大小。 然后,可以实现该接口来返回具体对象集的最大和最小。例如,对于整数数组: ```java public class IntegerMinMaxFinder implements MinMaxFinder<Integer> { @Override public Integer findMax(Integer[] arr) { Integer max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } @Override public Integer findMin(Integer[] arr) { Integer min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } } return min; } } ``` 如果要返回字符串数组的最大和最小,可以实现另一个类: ```java public class StringMinMaxFinder implements MinMaxFinder<String> { @Override public String findMax(String[] arr) { String max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i].compareTo(max) > 0) { max = arr[i]; } } return max; } @Override public String findMin(String[] arr) { String min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i].compareTo(min) < 0) { min = arr[i]; } } return min; } } ``` 这样,就可以实现一个泛型接口来返回任意类型的对象集的最大和最小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值