包装类概述

Java中有8中基本数据类型,分别是:

  包装类就是这8种数据类型所对应的引用数据类型,分别是:

  - 可能有同学会问:Java为什么要给基本数据类型提供对应的引用数据呢?
 

  - 第一,Java是面向对象的语言,给它们设计对应的引用类型,非常符合万物皆对象的设计理念
 

  - 第二,有类,那么就会有属性,会有方法。那么针对这些类型的一些数据操作可以变得更加简单,比如说:
 

  - 如果要根据字节数计算int的取值范围就有些麻烦,但是它的包装类Integer就提供了`Integer.MIN_VALUE`和`Integer.MAX_VALUE`记录了范围数据
 

  - 第三,Java中集合和泛型作为经常使用的对象,它们只支持引用数据类型,比如说,如果需要使用集合存储int类型整数。那么直接声明集合的泛型为int是不可以的,此时就可以使用它对应的包装类Integer
 

  - 所以结论就是:使用包装类可以方便不同数据类型的相关操作,另外集合也会经常用到包装类!
 

  2. 自动装箱
 

  - 既然包装类有很好的使用价值,那么自然就是要创建它们的对象去使用。而自动装箱就是一种可以很方便快捷的拿到它们对象的方式,几种包装类的设计非常相似,这里就以Integer举例

  Integer num = 23;

  3. 自动拆箱
 

  - 和自动装箱相反,自动拆箱指的就是可以将一个包装类对象直接赋值给其对应的基本数据类型变量,例如:

 Integer num = 23;int a = num;

  - 这种情况就是所谓的自动拆箱,其实底层是调用Integer包装类的`intValue()`方法,返回了记录的数据值23。以此类推,如果是Double,底层就是调用的`doubleValue()`方法获取数据值返回。
 

  4. 常见操作
 

  - 基本数据类型转字符串:
 

  - 静态方法:toString(基本数据类型的数据值),例如:`String str = Integer.toString(23);`
 

  - 推荐使用String的静态方法:valueOf(基本数据类型的数据值),例如:`String str = String.valueOf(20);`
 

  - 数值内容的字符串转基本数据类型:
 

  - 调用parseXXX的方法,例如:`int num = Integer.parseInt("66");`
 

  - 注意:如果字符串不是数值内容,而是"a"、"b"、"中"...这样的非数值,就会引发异常:NumberFormatException
 

  5. 面试题
 

  - 观察以下代码,说结果

Integer a = 127;
Integer b = 127;
System.out.println(a == b);Integer c = Integer.valueOf(127);
System.out.println(a == c);Integer d = new Integer(127);
System.out.println(a == d);Integer x = 128;
Integer y = 128;
System.out.println(x == y);

  - 结果分别是:true,true,false,false
 

  - 原因:
 

  - Integer自动装箱底层会调用valueOf()方法,源代码:

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

  - 可以看到,会拿数据值和Integer的一个静态内部类IntegerCache类的low属性于high属性做范围判断,其中low的值是-128,high的值是127
 

  - 也就是说,调用valueOf()方法,会判断数据是否在-128~127的范围内。如果在范围内,就从静态内部类IntegerCache的一个cache数组属性中获取一个Integer对象
 

  - 如果不在这个范围内,就是新new一个Integer对象
 

  - IntegerCache这个静态内部类有一个静态代码块:

static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {h = Math.max(parseInt(integerCacheHighPropValue), 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(h, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;// Load IntegerCache.archivedCache from archive, if possibleCDS.initializeFromArchive(IntegerCache.class);int size = (high - low) + 1;// Use the archived cache if it exists and is large enoughif (archivedCache == null || size > archivedCache.length) {Integer[] c = new Integer[size];int j = low;for(int i = 0; i < c.length; i++) {c[i] = new Integer(j++);}archivedCache = c;}cache = archivedCache;// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}

  - 一般情况下,这段代码第一个if不会进入,所以high的值就被赋值127,经过计算,size变量的值就是256。
 

  - 第二个if语句的条件通常是可以成立的,所以就创建了一个长度为256的Integer类型数组,通过一个for循环,给这个数组就从-128开始赋值,一致赋值到127结束,刚好是256个。
 

  - 至此,内部类中就出现了一个Integer类型数组,缓冲了256个Integer对象,对应的数据范围正好是:-128~127。
 

  - 那么通过以上分析可知,只要是通过自动装箱或者valueOf()方法去获取对象,只要数据范围在-128~127,不管获取多少次,都会从数组中去拿缓冲的对象,所以拿到的始终是同一个,所以判断的结果就是true。
 

  - 但如果不在这个范围内,就是去new一个新的Integer对象,会开辟一个新的对象空间,地址值肯定不一样,所以结果就是false。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app使用小图标的方式

1.首先我们需要去这里 随便点入一个进入第二步骤 2.把你需要的小图标加入到购物车 3.点击购物车把小图标【添加至项目】 4.最后下载到本地【解压放到项目中去】 5.如下&#xff1a; 6.在main.js里面引入 import ./style/iconfont.css 7.最后就是在页面中直接通过样式类名使…

教你如何用PS制作iOS端APP应用图标AppIcon.appiconset

开发iOS端APP要准备18个不同尺寸的logo&#xff0c;虽然现在有网站提供在线生成APP应用图标&#xff0c;但是这样可能存在泄露高清logo甚至被抢占的风险&#xff0c;下面我将教大家如何用Photoshop制作iOS端AppIcon.appiconset。 其实很简单&#xff0c;我们只要按照Xcode提示做…

【新拟态】左上角标签样式、ICON图标样式、模仿AppStore的应用图标

效果如图↑ <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"…

老胡的周刊(第088期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 nginx-ui[2] Nginx 后台管理 UI&#xff1a;…

【总结】1739- 使用 Pake 一键将网页打包成桌面 App

通常&#xff0c;我们说的软件指的是一个可以独立运行的程序&#xff0c;那么我们前端工程师开发的网页也属于软件吗&#xff1f;从计算机的角度来说&#xff0c;网页也是一个软件&#xff0c;但它很少让人归为软件一类。作为一个前端 web 开发者&#xff0c;我一直被桌面 App …

资讯周报@2 (2023-03-19)

title: 资讯周报-2 date: 2023-03-19 author: “KazooTTT” tags: 周报资料收集chatgpt设计figmavercel 时间范围&#xff1a;2023-03-12-2023-03-19 来源&#xff1a;github、twitter、微博、b站 一、浏览器插件&油猴脚本 沉浸式双语网页翻译扩展 #翻译 #浏览器插件 …

chatgpt赋能python:利用Python抢鞋的技巧与方法

利用Python抢鞋的技巧与方法 随着互联网的迅速发展&#xff0c;近年来&#xff0c;越来越多的人选择网上购物&#xff0c;其中包括了运动鞋的选购。而在运动鞋市场上&#xff0c;限量版鞋款成为了热门&#xff0c;但是由于数量有限&#xff0c;往往在发售后的几秒钟就被抢购一…

【OpenAI】利用 OpenAI 的 ChatGPT 和 GPT-4 训练与Ogimi 创始人谈冥想

OpenAI在12月1日发布的NLP&#xff08;自然语言识别&#xff09;新模型ChatGPT&#xff0c;刚刚与广大网友度过了一个愉快而又有意义的周末。 该模型是OpenAI在2020年推出的NLP预训练模型——GPT-3的衍生产品。在此之前&#xff0c;一直有预测OpenAI将在今年底或明年初推出GPT-…

AI_News周刊:第五期

2023.03.06-2023.03.11 News 1.OpenAI 发布了ChatGPT 和 Whisper API OpenAI 以比预期低得多的价格发布了 ChatGPT 和 Whisper API&#xff0c;部分原因是为了响应开源 LLM 和竞争对手模型的进步。ChatGPT 可通过 GPT-Turbo 以每 1k 代币 0.002 美元的价格获得&#xff0c;比…

ChatGLM-6B论文代码笔记

ChatGLM-6B 文章目录 ChatGLM-6B前言一、原理1.1 优势1.2 实验1.3 特点&#xff1a;1.4 相关知识点 二、实验2.1 环境基础2.2 构建环境2.3 安装依赖2.4 运行2.5 数据2.6 构建前端页面 3 总结 前言 Github&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考链接&#xff1a…

迷人的人工智能:为什么它是程序员的第四大“浪漫”?

人工智能是指让计算机具有类似人类的智能和思维的技术&#xff0c;它是当今科技领域最前沿和最具潜力的研究方向之一。 马斯克是一位著名的企业家&#xff0c;他对人工智能也非常感兴趣&#xff0c;并投资了多个与之相关的公司&#xff08;最著名的当属时下最火热的ChatGPT背后…

浅析人工智能,大数据

人工智能发展到了什么阶段? 人工智能的发展从开始到现在,经历了三个阶段,第一个阶段我们叫做计算智能,这个阶段要解决的事情,叫做能存会算。第二个阶段是感知智能,这个阶段是能听会说,能看会认。第三个阶段往下发展应该叫认知智能,要达到什么样的程度呢?要能够理解、会…

CTP 7*24小时期货自动交易程序

如何配置程序&#xff1a; 策略如何行&#xff1a; 运行程序&#xff1a; 更详细的说明&#xff1a; 常见问题及说明&#xff1a; 配置程序后无法登陆&#xff1f; 昨天程序还可以正常登陆&#xff0c;今天怎么不行了&#xff1f; 怎样及时发现交易过程中出现问题&am…

如何在智能合约中调用另一个合约的函数

智能合约是在区块链中被执行的一段程序&#xff0c;因为它们在区块链上执行&#xff0c;所以不依赖于任何的中心化服务器。目前最主流的智能合约编程语言是 Solidity。 在以太坊区块链中&#xff0c;智能合约可以和其他已经部署的智能合约进行交互。除了以太坊&#xff0c;其他…

chatgpt是否会代替程序员

ChatGPT能否取代程序员&#xff1f; ChatGPT是一种非常普遍的人工智能&#xff08;AI&#xff09;系统&#xff0c;被广泛应用于自然语言处理领域。但是&#xff0c;这个问题是一个非常复杂的问题&#xff0c;需要经过认真的思考和辩论。ChatGPT能否取代程序员&#xff1f;这个…

GPT1、GPT2、GPT3、InstructGPT

GPT全称是 Generative Pre-Trained Transformer。顾名思义&#xff0c;GPT的目的就是通过Transformer为基础模型&#xff0c;使用预训练技术得到的通用的文本模型。目前已经公布论文的有文本预训练GPT-1、GPT-2、GPT-3&#xff0c;以及InstructGPT。ChatGPT和InstructGPT在模型…

python编程游戏代码tkinter,python编程游戏代码大全

python有趣的编程代码 class Point: row0 col0 def __init__(self, row, col): row col def copy(self): return Point(, )#初始框架import pygameimport random#初始化()W800H600ROW30COL40size(W,H)windowpygame.display.set_mode(size)pygame.display.set_cap…

python小游戏——推箱子代码开源

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿所有的美好&#…

【C++小游戏】推箱子代码

注&#xff1a;本程序完全原创&#xff0c;如果有BUG&#xff0c;欢迎私信投诉。 Upd 2023/1/2 : 把代码扔到 LOJ 里格式化了一下&#xff0c;希望代码看起来没原来那么丑陋。 Upd 2023/3/3 : 修复了一个没有测试出来的 bug&#xff08;箱子推进去后无法立即显示&#xff09; …