你不知道的自动装箱和拆箱

news2024/11/10 15:41:02

“改天是明天,下次是每一次,以后是以后的每一天”
每一天

自动装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的valueOf(int) 方法

拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int);调用方法:Integer的intValue方法

在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:

Integer i = new Integer(10)

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:

Integer i = 10;

面试题1

public class Main{
	public static void main(String[] args){
		Integer i1 = 100;
		Integer i2 = 100;
		Integer i3 = 200;
		Integer i4 = 200;
		
		System.out.println(i1 == i2);
		System.out.println(i3 == i4); 
	}
}

运行结果

true
false

为什么会出现这样的结果?

输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。

此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:

public static Integer valueOf(int i){
  if(i >= -128 && i <= IntegerCache.high){
    return IntegerCache.cache[i + 128];
  }else {
    return new Integer(i)
  }
}

private static class IntegerCache{
  static final int high;
  static final Integer cache[];
  
  static{
    final int low = -128;
    
    // high value may be configured by property
    // high 可以按照属性来配置
    int h = 127;
    if(integerCacheHighPropValue != null){
      // Use Long.decode here to avoid invoking methods that
      // 在此处使用 Long.decode 以避免调用以下方法
      // require Integer's autoboxing cache to be initialized
      // 需要初始化整数的自动装箱缓存
      int i = Long.decode(integerCacheHighPropValue).intValue();
      i = Math.max(i, 127);
      // Maximum array size is Integer.MAX_VALUE
      // 最大数组大小为 Integer.MAX_VALUE
      h = Math.min(i, Integer.MAX_VALUE - -low);
    }
    high = h;
    
    cache = new Integer[(high - low) + 1];
    int j = low;
    for(int k = 0; k < cache.length; k++){
      cache[k] = new Integer(j++);
    }
  }
  private IntegerCache(){}
}

结论:

从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间, 便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是 同一个对象,而i3和i4则是分别指向不同的对象。

面试题2

public class Main {
    public static void main(String[] args) {
        Double i1 = 100.0;
        Double i2 = 100.0;
        Double i3 = 200.0;
        Double i4 = 200.0;
        System.out.println(i1==i2); // false
        System.out.println(i3==i4); // false
    }
}

运行结果

false
false

原因: 在某个范围内的整型数值的个数是有限的,而浮点数却不是。

永远

二分查找

题目:搜索二维矩阵

难度:🌟🌟🌟

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/search-a-2d-matrix-ii

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

1471115
2581219
3691622
1013141724
1821232628

请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        boolean flag = false;
        for(int i = 0 ; i < matrix.length ; i++){
            int l = 0;
            int r = matrix[i].length - 1;
            while(l <= r){
                int middle = (l + r) >> 1;
                if(target == matrix[i][middle]){
                    flag = true;
                }
                if(target > matrix[i][middle]){
                    l = middle + 1;
                }else {
                    r = middle - 1;
                }
            }
        }

        return flag;
    }
}

题解:

记得老师说过,二维数组就是多个一维数组组成的,所以在第一层for循环中就相当于最简单的二分查找啦

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int l = matrix.length;
        int n = matrix[0].length;
        int a = 0;
        int b = n - 1;
        boolean flag = false;
        while(a < l && b >= 0){
            if(matrix[a][b] == target){
                flag = true;
            }
            if(matrix[a][b] > target){
                b--;
            }else {
                a++;
            }
        }
        return flag;
    }
}

题解:

因为每行都是按顺序排的,所以我们直接找右边最后的一个数值,如果比目标值大那就找下一行,如果比目标值小,那么就找前一个数字,一次循环就可以找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导蓝牙耳机哪款好,分享几款性能比较高的骨传导耳机

骨传导耳机是一种新型的耳机&#xff0c;它将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。不需要通过耳道&#xff0c;是一种耳挂式的无线耳机。 骨传导耳机与普通耳机相比&#xff0c;最大的优势是不需要入耳&am…

VasDolly实现多渠道打包

目录 一、添加对VasDolly Plugin的依赖 二、 引用VasDolly Plugin 三、添加对VasDolly helper类库的依赖 四、根目录新建文件添加渠道列表 五、主App工程的build.gradle中配置channel 六、根据已有基础包重新生成多渠道包 官方地址&#xff1a; GitHub - Tencent/VasDol…

【21】linux进阶——grep命令搜索查找

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

【1048. 最长字符串链】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给出一个单词数组 words &#xff0c;其中每个单词都由小写英文字母组成。 如果我们可以 不改变其他字符的顺序 &#xff0c;在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB &#xff0c;那么…

【AI】Python 安装时启用长路径支持

文章目录 场景&#xff1a;解释&#xff1a;关于文件长路径&#xff1a;计算方法&#xff1a; 场景&#xff1a; Python 安装时&#xff0c;会出现 Disable path length limit 的提示。 解释&#xff1a; 在 Windows 操作系统中&#xff0c;文件路径的长度是有限制的。在早期…

连续Hopfield神经网络的优化——旅行商问题优化计算

连续Hopfield神经网络 连续Hopfield神经网络&#xff08;Continuous Hopfield Network, CHN&#xff09;是一种基于能量最小化原理的神经网络模型&#xff0c;与离散Hopfield网络相比&#xff0c;它的状态是连续的&#xff0c;典型地采用实数值或者概率分布。在优化连续Hopfie…

各大外卖平台占据共享经济市场主要份额,占比近50%

哈喽大家好&#xff0c;随着大量互联网用户和移动支付的普及、大量用户通过共享平台将闲置资源和服务与需求方进行匹配&#xff0c;实现了资源的高效利用和消费者福利的提升。在全球化驱动的新型消费需求以及政策支持下&#xff0c;共享经济正在向更加成熟和规范化的方向发展。…

【生态环境保护】绿水青山就是金山银山——生态环保篇

环保是一个持续性的话题&#xff0c;不仅仅是在国内&#xff0c;整个世界都是一个命运共同体从城市垃圾分类&#xff0c;到农村/村镇污水治理&#xff0c;城乡一体化和因地制宜的实施方式&#xff0c;是我们一直在探索的。 从余村到全国&#xff0c;从中国到世界&#xff0c;“…

网络安全合规-数据安全治理体系建设

一、数据安全治理体系建设思路&#xff1a; 一级文档。由决策层认可、面向组织的数据安全方针&#xff0c;通常应包括组织数据安全工作的总体目标、基本原则、数据安全决策机构设置与职责划分等。 二级文档。根据数据安全方针的要求&#xff0c;对组织数据安全工作各关键领域的…

黑客攻击的心理学:了解黑客的行为背后隐藏的心理因素

第一章&#xff1a;引言 在当今数字时代&#xff0c;网络已经成为人们交流、信息传递、商业活动的主要方式之一。但随之而来的是网络安全问题的不断浮现&#xff0c;其中最为突出的就是黑客攻击。黑客攻击不仅仅是技术问题&#xff0c;还涉及到心理学、社会学等多方面因素。了…

LoRA 理解

LLM的参数量对于时间和显存要求都带来很大的挑战。现存的两种显著范式: 增加adapter&#xff1a;主要问题在于推理时带来的额外计算量和延迟。优化prompt&#xff1a; 前缀微调(Prefix Tuning)较难优化&#xff0c;而且随着参数量增长性能并非单调变化。 那有什么方法可以 解…

一篇简单的文章带你玩转SpringBoot 之定时任务详解

序言 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要有以下三种创建方式&#xff1a; 一、基于注解(Scheduled)二、基于接口&#xff08;SchedulingConfigurer&#xff09; 前者相信大家都很熟悉&#xff0c;但是实际使用中我们往往想从数据库中读取指定时间来动态…

Linux网络编程TCP连接的建立和终止

文章目录 前言一、TCP的三路握手二、TCP连接终止总结 前言 本篇文章将讲解TCP的连接的建立和终止&#xff0c;主要就是讲解TCP的三路握手和TCP连接断开内部发生的一些机制和事件。 一、TCP的三路握手 TCP三路握手所交换的三个分节&#xff1a; (1)服务器必须准备好接受外来…

C++题解之对顶堆:中位数

中位数 题目链接&#xff1a;洛谷P1168 中位数 题目描述 给定一个长度为 N N N 的非负整数序列 A A A&#xff0c;对于前奇数项求中位数。 输入格式 第一行一个正整数 N N N。 第二行 N N N 个正整数 A 1 … N A_{1\dots N} A1…N​。 输出格式 共 ⌊ N 1 2 ⌋ …

【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 上期&#xff0c;我带大家给C打了招呼&#xff0c;捎带着认识了命名空间和输入输出&#xff0c;那…

LeetCode——链表简单题题解

83. 删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 解题思路&#xff1a;用一个指向节点类型的指针保…

Vscode配置C/C++开发环境

下载Vscode进行安装。 下载MinGW-W64 GCC最新版本&#xff0c; 选择x86_64-win32-seh进行下载。解压放入自定义目录&#xff08;英文路径&#xff09;后&#xff0c;添加$:\mingw64\bin到系统Path环境变量。安装C/C插件。 在.c后缀文件中按Ctr Shift P&#xff0c;选择C/C …

Windows系统文件被faust勒索病毒加密勒索病毒解密恢复,电脑中病毒了怎么修复?

恶意软件的攻击已经让电脑用户变得更加谨慎了。在最近的一波攻击中&#xff0c;faust勒索病毒已经对使用Windows系统的计算机造成了广泛的破坏。该病毒利用加密技术锁定用户的文件&#xff0c;只有在支付一定数额的赎金后才会解锁这些文件。如果你的计算机中也受到了这种勒索病…

MaxScript编写bone转换biped工具

一、制作转换工具的缘由 大家好&#xff0c;我是阿赵。我经常从各种渠道得到了一些角色模型&#xff0c;这些模型得到之后&#xff0c;会发现是带有蒙皮和骨骼&#xff0c;甚至带有动作的。   不过这些资源很多都是从游戏截取出来的&#xff0c;导入到3DsMax之后&#xff0c;…

信息安全复习十:Web与电子商务安全

一、章节梗概 1.信息安全的学科内容 2.Web和电子商务安全问题提出 3.安全套接字协议SSL与传输层安全协议TLS 4.安全电子交易(SET)简要介绍 复习&#xff1a; 密码学内容&#xff1a;对称密钥密码、公开密钥密码、报文鉴别 PKI&#xff1a;数字签名、数字证书、信任关系 身份认…