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

这篇具有很好参考价值的文章主要介绍了你不知道的自动装箱和拆箱。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

“改天是明天,下次是每一次,以后是以后的每一天”
你不知道的自动装箱和拆箱

自动装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型(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

1 4 7 11 15
2 5 8 12 19
3 6 9 16 22
10 13 14 17 24
18 21 23 26 28

请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

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;
    }
}

题解:

因为每行都是按顺序排的,所以我们直接找右边最后的一个数值,如果比目标值大那就找下一行,如果比目标值小,那么就找前一个数字,一次循环就可以找到。文章来源地址https://www.toymoban.com/news/detail-430407.html

到了这里,关于你不知道的自动装箱和拆箱的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基础巩固、探寻Java装箱和拆箱的奥妙!

    前言   今天在逛某知名论坛的时候,看到一篇\\\"请不要使用包装类型,避免造成性能损失\\\"的文章。一下子就吸引了我的注意。大意就是,能用基本数据类型就尽量用基本数据类型,因为包装类型自动拆箱、装箱会带来性能损失尤其是循环使用时会大量创建对象。所以今天聊

    2023年04月25日
    浏览(40)
  • Java中的自动装箱与自动拆箱

    在Java中,基本数据类型与其对应的封装类之间可以进行自动转换,这种特性称为自动装箱(autoboxing)和自动拆箱(unboxing)。自动装箱和自动拆箱使得我们在使用基本数据类型时更加方便,同时也提高了代码的可读性和健壮性。本文将详细介绍Java中的自动装箱和自动拆箱机

    2023年04月22日
    浏览(34)
  • int和Integer的区别是什么,自动装箱和自动拆箱到底是什么?

    基本类型 vs. 包装类型: int 是Java的基本数据类型,它直接存储整数值,不具备任何方法或属性。基本类型通常更高效,占用更少的内存。 Integer 是 int 的包装类,它是一个对象,具有方法和属性。包装类提供了一些额外的功能,如转换为其他数据类型、比较、转换为字符串等

    2024年02月08日
    浏览(39)
  • 【Java基础教程】(三十二)常用类库篇 · 第二讲:包装类 Wrapper Class——概念及用途, 自动装箱与拆箱,常用操作方法~

    在Java编程中,包装类(Wrapper Class)是一种特殊的类,它们允许将基本数据类型包装(Wrap)成对象。每个原始数据类型都有对应的包装类,例如 Integer 对应整型, Double 对应浮点型等。包装类提供了一些有用的方法和功能,方便我们操作和处理与原始数据类型相关的数据。

    2024年02月15日
    浏览(57)
  • Java 装箱拆箱原理 & 包装类型缓存池

    byte short int long float double boolean char 为了让上述基本数据类型可以转为对象,Java在1.5推出了一系列包装类,基本类和包装类互相转换的过程,称为装箱和拆箱 缓存池也叫常量池。它是事先存储一些常量数据用以提高性能节省空间的一种技术,大部分的包装类型都实现了缓存池

    2024年02月16日
    浏览(37)
  • C# 一看就懂的装箱拆箱案例

    在C#中,装箱(Boxing)和拆箱(Unboxing)是值类型与引用类型之间相互转换的过程。 当一个值类型(如整数、结构体或枚举等)需要转换为对象(System.Object)或接口类型时,系统会自动创建一个新的对象实例,并将该值类型变量的值复制到新创建的对象中。这个过程就称为装

    2024年02月02日
    浏览(40)
  • C#学习系列之装箱、拆箱、自定义转化、重载运算符

    学习基础。 装箱:值类型转化为引用类型。方便统一操作和存储。 本质上就是在堆上创建了引用类型的副本,新创建的引用类型和值类型(栈中)相互独立。 拆箱:显式转化。 显式或隐式转化,变成预期类型。 隐式转换语法 显式转化语法 利用现有的某种运算符,针对自定

    2024年02月05日
    浏览(37)
  • 数据结构----基本封装、包装类、装箱与拆箱、泛型详解

    在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 除了 Integer 和 Character, 其余基本类型的包装类都是

    2024年01月23日
    浏览(44)
  • 你不知道的自动化?使用自动化测试在项目中创造高业务价值...

    脱离数据支撑谈价值多少有点底气不足,但脱离自动化的初衷和背景谈质量数据度量,也有些南辕北辙。 Python自动化测试:https://www.bilibili.com/video/BV16G411x76E/ 自动化测试的价值体现? 基于团队内部,从解决问题角度出发的技术落地实践和数据度量; 基于跨团队合作,从KPI

    2024年02月03日
    浏览(44)
  • 你不知道的 ES2023

    6 月 27 日 ECMA 大会批准了 ECMAScript 2023 (es14)规范,意味着新的一些语法将正式成为标准。下面来看看 ECMAScript 2023 有哪些值得我们关注的新特性。 具体相关提案原文详情可以跳转:已完成提案 •从后往前查找数组 •Hashbang 语法 •Symbol 类型作为 WeakMap 类型的键 •不改变原数组

    2024年02月15日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包