Java-包装类

news2025/1/10 10:52:41

这里写目录标题

  • 包装类(Wrapper)
    • 包装类和基本数据的转换
  • String VS StringBuffer VS StringBuilder
    • String
    • StringBuffer
    • StringBuilder

包装类(Wrapper)

针对八种基本数据类型相应的引用类型

基本数据类型包装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

Boolean、Character

Untitled.png

Untitled2.png

包装类和基本数据的转换

  1. 装箱(Boxing)

    装箱是将基本数据类型转为对应的包装类对象的过程,可以直接通过赋值或者方法调用

    int primitiveInt = 42;
    Integer wrapperInt = primitiveInt; // 自动装箱  底层使用的是Integer.valueOf(primitiveInt)
    
    或者显示装箱
    int primitiveInt = 42;
    Integer wrapperInt = Integer.valueOf(primitiveInt); // 手动装箱
    
    字符串转为包装类
    String str = "123";
    Integer wrapperInt = Integer.valueOf(str);
    
  2. 拆箱(Unboxing)

    拆箱是将包装类对象转为基本数据类型的过程,它可以直接通过赋值或者方法调用完成

    Integer wrapperInt = 42;
    int primitiveInt = wrapperInt; // 自动拆箱
    
    或者显示的拆箱
    Integer wrapperInt = 42;
    int primitiveInt = wrapperInt.intValue(); // 手动拆箱
    
    包装类转为字符串
    Integer wrapperInt = 123;
    String str = wrapperInt.toString();
    

Integer.valueOf(int)源码分析

Integer.valueOf(int) 方法是用于将一个 int 值转换为对应的 Integer 对象的静态方法。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);   //超过范围后,才会重新new一个对象
}
  1. 首先检查给定的证书是否在 [ − 128 , 127 ] [-128,127] [128127]范围之内;
  2. 如果在这个范围之内,就会从缓存中获取Integer对象,而不是创建一个对象,这样可以减少对象的创建和内存消耗;
  3. 如果不在这个范围之内,就会创建一个新的Integer对象,存储到堆。

例如:

Integer num1 = Integer.valueOf(1); 
Integer num2 = Integer.valueOf(1); 
System.out.println(num1==num2);    //true,都指向同一个对象

Integer num1 = Integer.valueOf(128); 
Integer num2 = Integer.valueOf(128); 
System.out.println(num1==num2);    //false,由于超过除了缓存范围,创建一个新Integer对象

String VS StringBuffer VS StringBuilder

类型说明效率优点使用场景
String不可变的字符序列复用率高字符串很少修改
StringBuffer可变的字符序列较高线程安全字符串存在大量修改,并在多线程
StringBuilder可变的字符序列最高(单线程)线程不安全字符串存在大量修改,并在单线程

String

String对象是用于保存字符串,也就是字符序列;

字符串常量对象使用双引号括起来的字符序列,例如:“你好”、“12.97”;

字符串的字符使用Unicode字符编码,一个字符占两个字节

Untitled.png

  1. Serializable:子类可以实现串行化,可以在网络传输;
  2. Comparable:子类可以比较;

常见的构造器

  1. String (String):直接通过字符串创建
  2. String (char[]):使用字符数组创建字符串
  3. String (char[], int, int):使用字符数组的一部分来创建一个字符串对象。第二个参数是起始索引,第三个参数是子数组的长度。
  4. String (byte[]):接受一个字节数组来创建一个字符串对象
  5. String (byte[], int ,int):使用字节数组的一部分来创建一个字符串对象。第二个参数是起始索引,第三个参数是子数组的长度。

特性

String str1="hello";   //对象存放在常量池中
String str2=new String("hello")  //对象存放在堆中

Untitled.png

  1. String是final修饰的类,无法被其他类继承;
  2. 字符串是不可变的,一个字符串对象一旦被分配,其内容就无法修改
String s1="hello"
s2="hahah"
在方法区的常量池中,实际上创建了两个对象:hello、hahah
String a="hello"+"world";  实际上只创建了一个对象:helloworld
String str1="hello";
String str2="world";
String str4=str1+str2;
  1. 当执行**String str4 = str1 + str2 ,Java编译器会使用StringBuilder**类来处理字符串的拼接。
  2. StringBuilder s=new StringBuilder()对象,str1、str2的内容会复制到StringBuilder的缓存区中;
  3. sb.append(str1)、sb.append(str2);
  4. String str4=sb.toString();底层实际上是在中创建了一个对象;

最后在常量池中创建了三个对象:hello、world、helloworld。

StringBuffer

Untitled.png

  1. StringBuffer的直接父类是AbstractStringBuilder;

  2. 继承Serializable接口,对象可以串行化(网络传输);

  3. 在父类中,AbstractStringBuilder有属性char[] value,用于存储字符,不是final修饰;
    Untitled.png

  4. StringBuffer是一个final类,无法被继承
    Untitled2.png

StringBuffer VS String

  1. String保存的字符串常量,每次更新String类就是更改地址,效率低。
  2. StringBuffer保存的是字符串变量存放在char[]数组,内容可以更改,不用每次更新地址(创建新对象),效率高。

常见构造器

  1. new StringBuffer() :无参数构造方法,创建一个空的 StringBuffer 对象,初始容量为 16 个字符。
  2. new StringBuffer(int capacity) :带有容量参数的构造方法,创建一个具有指定容量的 StringBuffer 对象。如果预计字符串将比较长,可以指定一个较大的容量以避免频繁的扩容操作。
  3. new StringBuffer(String str) :创建一个包含指定字符串内容的 StringBuffer 对象,初始容量为 str.length() + 16

源码分析

StringBuffer sb = new StringBuffer("hello");
  1. 初始化char[]数组的容量为str.length() + 16
    Untitled.png

    Untitled2.png

  2. 执行append方法,将字符串添加到char[]数组,可以看到StringBuffer是线程安全的。
    Untitled.png

    Untitled2.png

  3. 最后完成数据存储
    Untitled.png

常见方法

  1. append(String str) :将指定的字符串附加到当前字符串的末尾。
  2. insert(int offset, String str) :在指定的偏移量位置插入指定的字符串。
  3. delete(int start, int end) :删除从指定开始位置到结束位置之间的字符。
  4. deleteCharAt(int index) :删除指定索引位置的字符。
  5. replace(int start, int end, String str) :用指定的字符串替换从开始位置到结束位置之间的字符。
  6. substring(int start) :返回从指定位置开始到字符串末尾的子字符串。。
  7. length():返回字符串的长度(字符数)。
  8. charAt(int index) :返回指定索引位置的字符。

StringBuilder

一个可变的字符序列。

StringBuilder是线程不安全的,用在字符串缓冲区被单个线程使用的时候。

父类关系图
Untitled.png

  1. StringBuilder的直接父类是AbstractStringBuilder;
  2. 实现了Serializable接口,对象可以串行化(对象可以网络传输/保存到文件);

源码分析

  1. StringBuilder是final类,无法被继承;
    Untitled.png

  2. 字符序列存放AbstractStringBuilder的char[] value数组,因此存放在堆中。
    Untitled2.png

  3. StringBuilder所有的方法没有互斥处理(synchronized),因此推荐在单线程的情况下使用;
    Untitled.png

通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java常用包装类的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。

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

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

相关文章

C++设计模式(1)-- 单例模式

基本概念 在一个项目中&#xff0c;全局范围内&#xff0c;某个类的实例有且仅有一个&#xff0c;通过这个唯一实例向其他模块提供数据的全局访问&#xff0c;这种模式就叫单例模式&#xff0c;单例模式的典型应用就是任务队列 涉及一个类多对象操作的函数有以下几个&#xff…

嵌入式基础知识-IP地址与子网划分

本篇介绍IP地址与子网划分的一些基础知识&#xff0c;在嵌入式开发&#xff0c;使用网络功能时&#xff0c;需要了解网络的一些基础知识。 1 IP地址 1.1 IPv4与IPv6 对比信息IPv4IPv6长度32位128位地址表示形式点分十进制冒分十六进制表示示例192.168.5.1002002:0000:0000:0…

this关键字在不同上下文中的值是如何确定的?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

最全解决docker配置kibana报错 Kibana server is not ready yet

问题复现&#xff1a; 在浏览器输入http://192.168.101.65:5601/ 访问kibana报错 Kibana server is not ready yet 问题报错&#xff1a; 首先查看kibana的日志 docker logs kibana 看到报错如下&#xff1a; {"type":"log","timestamp":&q…

【小笔记】复杂模型小数据可能会造成过拟合还是欠拟合?

【学而不思则罔&#xff0c;思而不学则殆】 10.8 问题 针对这个问题&#xff0c;我先问了一下文心一言 它回答了为什么会过拟合和欠拟合&#xff0c;但并没有回答我给的场景。 简单分析 分析模型 复杂模型就表示模型的拟合能力很强&#xff0c;对于数据中特征&#xff08…

如何保证 RabbitMQ 的消息可靠性?

项目开发中经常会使用消息队列来完成异步处理、应用解耦、流量控制等功能。虽然消息队列的出现解决了一些场景下的问题&#xff0c;但是同时也引出了一些问题&#xff0c;其中使用消息队列时如何保证消息的可靠性就是一个常见的问题。如果在项目中遇到需要保证消息一定被消费的…

Mybatis 拦截器(Mybatis插件原理)

Mybatis为我们提供了拦截器机制用于插件的开发&#xff0c;使用拦截器可以无侵入的开发Mybatis插件&#xff0c;Mybatis允许我们在SQL执行的过程中进行拦截&#xff0c;提供了以下可供拦截的接口&#xff1a; Executor&#xff1a;执行器ParameterHandler&#xff1a;参数处理…

深入解析PostgreSQL:命令和语法详解及使用指南

文章目录 摘要引言基本操作安装与配置连接和退出 数据库操作创建数据库删除数据库切换数据库 表操作创建表删除表插入数据查询数据更新数据删除数据 索引和约束创建索引创建约束 用户管理创建用户授权用户修改用户密码 备份和恢复备份数据库恢复数据库 高级特性结语参考文献 摘…

在win10里顺利安装了apache2.4.41和php7.4.29以及mysql8.0.33

一、安装apache和php 最近在学习网站搭建。其中有一项内容是在windows操作系统里搭建apachephp环境。几天前根据一本书的上的说明尝试了一下&#xff0c;在win10操作系统里安装这两个软件&#xff1a;apache2.4.41和php7.4.29&#xff0c;安装以后apche能正常启动&#xff0c;…

【转载】LLM-Native 产品的变与不变

1. LLM-Native&#xff1a;AGI 的另一种路径 《银河系漫游指南》的作者——道格拉斯亚当斯曾经对「技术」一词做出这样一种解释&#xff1a; 「技术」是描述某种尚未发挥作用的东西的词汇。 这是一个充满实用主义的定义&#xff0c;这句话可以被更直观地表述为&#xff1a;当…

机器学习7:pytorch的逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…

安卓玩机----解锁system分区 可读写系统分区 magisk面具模块

玩机教程----安卓机型解锁system分区 任意修改删除系统文件 system分区可读写 参考上个博文可以了解到解锁system分区的有关常识。但目前很多机型都在安卓12 13 基础上。其实最简单的方法就在于刷写一个解锁system分区的第三方补丁包。在面具更新不能解锁系统分区的前提下。…

8.2 JUC - 5.CountdownLatch

目录 一、是什么&#xff1f;二、demo演示三、应用之同步等待多线程准备完毕四、 应用之同步等待多个远程调用结束五、CountDownLatch 原理 一、是什么&#xff1f; CountdownLatch 用来进行线程同步协作&#xff0c;等待所有线程完成倒计时。 其中构造参数用来初始化等待计数…

C#,数值计算——数据建模Fitab的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Fitting Data to a Straight Line /// </summary> public class Fitab { private int ndata { get; set; } private double a { get; set; } …

RabbitMQ之Fanout(扇形) Exchange解读

目录 基本介绍 适用场景 springboot代码演示 演示架构 工程概述 RabbitConfig配置类&#xff1a;创建队列及交换机并进行绑定 MessageService业务类&#xff1a;发送消息及接收消息 主启动类RabbitMq01Application&#xff1a;实现ApplicationRunner接口 基本介绍 Fa…

跨域请求方案整理实践

项目场景&#xff1a; 调用接口进行手机验证提示,项目需要调用其它域名的接口,导致前端提示跨域问题 问题描述 前端调用其他域名接口时报错提示: index.html#/StatisticalAnalysisOfVacancy:1 Access to XMLHttpRequest at http://xxxxx/CustomerService/template/examineMes…

openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制

文章目录 openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制92.1 不支持的特性92.2 MOT限制92.3 不支持的DDL操作92.4 不支持的数据类型92.5 不支持的索引DDL和索引92.6 不支持的DML92.7 不支持的JIT功能&#xff08;…

ThingsBoard如何自定义tcp-transport

1、概述 很久没有更新了,一直忙于其他的事情,最近去搞了一个在ThingsBoard中自定义一个tcp-transport,用于连接使用tcp长连接的设备,目前使用tcp和mqtt协议连接服务端的设备还是很多,ThingsBoard的PE版提供了Integration是可以实现tcp的接入,但是CE版是没有提供接入tcp长…

前端性能优化之防抖节流

前端性能优化之防抖&节流 1.什么是防抖和节流2.代码实现2.1 实现防抖2.2 实现节流 3.应用场景3.1 防抖的应用3.2 节流的应用 1.什么是防抖和节流 防抖和节流是前端开发中常用的两种性能优化技术。 为什么需要防抖和节流呢&#xff1f; 两者目的都是为了防止某个时间段内…