Java13基础(StringBuilder和StringBuffer 包装类)

目录

一. StringBuilder和StringBuffer

扩容机制:

链式操作:

一些方法:

区别:

小结:

二. 包装类

创建对象:

自动装箱:

自动拆箱:

缓存池:

进制转换:

 一些常量:

小结:


一. StringBuilder和StringBuffer

String类的特点:任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指 向而已。

Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象:

●String不可变字符串
●StringBuilder可变字符串

public static void main(String[] args) {
String不可变字符串
//StringBuilder可变字符串
//StringBuilder(); 无参构造创建,初始化数组char[]的容量为16,扩容<<1+2容量够,则直接返回newCapcity ,如果扩容后容量不够newCpacity = minCpacity
//StringBuilder(容量); 初始化容量为指定容量的char[]数组
//StringBuilder(str); super(str.length() + 16);StringBuilder sb = new StringBuilder("我爱学习");for (int i = 0; i < 100; i++) {// 追到到末尾sb.append(i).append(",");}// insert追加内容到指定位置sb.insert(0, "你好");String str = null;// StringBuilder可以追加nullsb.append(str);System.out.println(sb);}

扩容机制:

见 StringBuilder与StringBUffer扩容机制

链式操作:

如果我们查看StringBuilder的源码,可以发现,进行链式操作的关键是,定义的append()方法会返回this,这样,就可以不断调用自身的其他方法。

一些方法:

●replace(start, end, str)  替换指定区间的字符串

StringBuilder sb = new StringBuilder("还是想考研");
//  replace(start, end, str)  替换指定区间的字符串sb.replace(0, 1, "zkt");System.out.println(sb);// zkt是想考研

●reverse() 反转

//	反转StringBuilder sb = new StringBuilder("还是想考研");sb.reverse();System.out.println(sb);// 研考想是还

细节:

由于StringBuilder和StringBuffer没有重写equals方法,所以还是使用的Object的equals方法。对比的是两个对象的地址是否相等。为了比较StringBuilder和StringBuffer字符串内容是否相等,需要先将其转换为string,String 由于重写了equals方法,所以使用equals函数是对比两个字符串内容是否相等。

StringBuilder sb1 = new StringBuilder("abc");StringBuilder sb2 = new StringBuilder("abc");System.out.println("地址是否相等" + (sb1 == sb2));// 地址是否相等false// 没有重写equals,比较的仍旧是地址System.out.println("内容是否相等" + (sb1.equals(sb2)));// 内容是否相等falseSystem.out.println(sb1.toString().equals(sb2.toString()));// true

区别:

●StringBuilder  类的继承和实现一样   1.5   线程不安全   性能好
●StringBuffer   类的继承和实现一样   JDK1.0   线程安全  效率相对差一点点

            StringBuffer sbBuffer=new StringBuffer();sbBuffer.append("a");
String[] nameString = { "zkt1", "zkt2", "zkt3", "zkt4" };StringBuilder sb = new StringBuilder();for (int i = 0; i < nameString.length; i++) {sb.append(nameString[i]).append(",");}//sb.replace(sb.length()-1, sb.length(), "!");sb.deleteCharAt(sb.length()-1).append("还是想考研!");System.out.println(sb);//zkt1,zkt2,zkt3,zkt4还是想考研!

小结:

●StringBuilder是可变对象,用来高效拼接字符串。
●StringBuilder可以支持链式操作,实现链式操作的关键是返回实例本身。
●StringBuffer线程安全(现在很少使用),性能较差;StringBuilder线程不安全,但性能较好。

二. 包装类

在Java中,数据类型被分两种:基本类型和引用类型。引用类型可以赋值为null,表示空,但基本类型不能赋值为null:
●基本类型:byte,short,int,long,boolean,float,double,char
●引用类型:所有class和interface类型、数组

String s = null;
int n = null; // compile error!

Java核心库为每种基本类型都提供了对应的包装类型, 我们可以直接使用,并不需要自己去定义:

基本类型

对应的引用类型

boolean

java.lang.Boolean

byte

java.lang.Byte

short

java.lang.Short

int

java.lang.Integer

long

java.lang.Long

float

java.lang.Float

double

java.lang.Double

char

java.lang.Character

创建对象:

●new操作符创建Interger对象

//new操作符创建Interger对象Integer n =new Integer("22");int i = 10;Integer n1 =new Integer(i);

●调用valueOf方法创建Interger对象

		//调用valueOf方法创建Interger对象Integer n2 = Integer.valueOf(20);Integer n3 = Integer.valueOf("99");

自动装箱:

 因为int和Integer可以互相转换,所以,Java编译器可以帮助我们自动在int和Integer之间自动进行类型转换:

自动装箱: 基本数据类型-->引用数据类型

这种直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing)

        编译器自动使用Integer.valueOf(int)

        编译器自动使用Integer.intValue()

// 自动装箱: 基本数据类型-->引用数据类型int i1 = 10;Integer n1 = i1; // Integer.valueOf(i1)自动装箱System.out.println(n1.toString());

自动拆箱:

自动拆箱: 基本数据类型<--引用数据类型

把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)

// 自动拆箱: 基本数据类型<--引用数据类型Integer n2 = new Integer(99);int i2 = n2; // n2.intValue();自动拆箱System.out.println(i2);

装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报NullPointerException

// 自动拆箱可能会有异常,不能为null,不然会出现NullPointerExceptionInteger n3 = null;int i3 = n3;System.out.println(i3);

注意:自动装箱和自动拆箱只发生在编译阶段,目的是减少代码量

缓存池:

可以发现,==比较,较小的两个相同的Integer返回true,较大的两个相同的Integer返回false,这是因为Integer内部已经把-128~+127在缓存池中已经创建好了。所以,编译器把Integer x = 127;自动变为Integer x = Integer.valueOf(127);就可以直接使用缓存池中的127,从而节省内存。所以,基于缓存池的存在,Integer.valueOf()对于-128~+127之间的数字,始终返回相同的实例,因此,==比较“恰好”为true,但我们绝不能因为Java标准库的Integer内部有缓存优化就用==比较,必须用equals()方法比较两个Integer。      

//Integer.valueOf() 缓存池 -128-127之间Integer i1 = Integer.valueOf(127);Integer i2 = Integer.valueOf(127);System.out.println(i1 == i2);//trueSystem.out.println(i1.equals(i2));//trueInteger i3 = Integer.valueOf(128);Integer i4 = Integer.valueOf(128);System.out.println(i3 == i4);//falseSystem.out.println(i3.equals(i4));//true//new开辟新空间Integer i5 = new Integer(100);Integer i6 = new Integer(100);System.out.println(i5 == i6);//false

进制转换:

进制转换 String<--->int:

●Integer.parseInt();对应进制的字符串转成10进制的整数

// Integer.parseInt();对应进制的字符串转成10进制的整数int x1 = Integer.parseInt("10");// 10进制字符串10->10进制整数10System.out.println("10进制字符串->10进制整数" + x1);// 10
int x2 = Integer.parseInt("10", 2);// 2进制字符串10->10进制整数2System.out.println("2进制字符串10->10进制整数" + x2);// 2

●Integer还可以把整数格式化为指定进制的字符串

    // Integer.toString();10进制整数转成对应进制的字符串String s1 = Integer.toString(100);// 10进制整数100->10进制字符串System.out.println("10进制整数100->10进制字符串" + s1);// 100String s2 = Integer.toString(5, 2);// 10进制整数5->2进制字符串System.out.println("10进制整数5->2进制字符串" + s2);// 101// 将10进制的整数转成16,8,2进制的字符串// 10->16String hexString = Integer.toHexString(15);System.out.println(hexString);// f// 10->8String octString = Integer.toOctalString(8);System.out.println(octString);// 10// 10->2String binString = Integer.toBinaryString(5);System.out.println(binString);// 101

 一些常量:

Java的包装类型还定义了一些有用的静态变量:

System.out.println(Integer.MAX_VALUE);//2147483647System.out.println(Integer.MIN_VALUE);//-2147483648System.out.println(Long.SIZE);//64System.out.println(Long.BYTES);//8System.out.println(Long.MAX_VALUE);//9223372036854775807System.out.println(Long.MIN_VALUE);//-9223372036854775808

最后,所有的整数和浮点数的包装类型都继承自Number,因此,可以非常方便地直接通过包装类型获取各种基本类型:

Integer i1 = new Integer(128);System.out.println(i1.byteValue());//-128System.out.println(i1.shortValue());//128
// 向上转型为Number:
Number num = new Integer(999);// 获取byte, int, long, float, double:
byte b = num.byteValue();
int n = num.intValue();
long ln = num.longValue();
float f = num.floatValue();
double d = num.doubleValue();

小结:

●Java核心库提供的包装类型可以把基本类型包装为class
●自动装箱和自动拆箱都是在编译期完成的(JDK>=1.5)
●装箱和拆箱会影响执行效率,且拆箱时可能发生NullPointerException
●包装类型的比较必须使用equals()
●整数和浮点数的包装类型都继承自Number

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

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

相关文章

亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件

一款将wordpress文章同步到其他WordPress网站的插件&#xff0c;通过这款插件&#xff0c;可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤&#xff1a; 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹&#xff0c;然后启用插…

【数据结构】心里有 “B树“ 么?

序言 在学习数据库之前&#xff0c;博主觉得有必要学习B树系列&#xff0c;以便之后更好地了解其原理&#xff0c;既然说到这里了&#xff0c;那就再说几句&#xff0c;数据库是帮助我们管理存在硬件当中的数据&#xff0c;如果要从中读取数据&#xff0c;就要考虑到硬件的读取…

poll 机制

poll 机制 一、poll机制概述二、使用流程三、编程3.1 驱动编程3.1 应用编程 四、POLL 机制的内核代码详解五、编译后上机实验 poll 机制与休眠唤醒机制的区别&#xff1a; 休眠唤醒方式时&#xff0c;进程如果没有得到唤醒信号&#xff0c;需要一直休眠&#xff0c;进程就干不了…

企业数智化转型痛点

建设痛点 企业信息系统建设经历的三个阶段&#xff1a;信息化、网络化&#xff08;即我们常说的互联网&#xff09;、以及目前正在进行中的数智化。 企业数智化转型过程中&#xff0c;IT管理人员会面临以下问题困扰&#xff1a; 1&#xff0c;系统架构不规范 业务系统技术标准不…

React 中重新实现强制实施表单

就像设计人员一样&#xff0c;在添加逻辑之前&#xff0c;您需要为不同的状态“模拟”或创建“模拟”。例如&#xff0c;这里只是表单的视觉部分的模拟。这个模拟由一个 prop 控制&#xff0c;其默认值为 &#xff1a;statusempty 识别组件的不同视觉状态确定触发这些状态更改…

解决java.lang.IllegalArgumentException异常的正确方法

java.lang.IllegalArgumentException 是 Java 中的一个异常类&#xff0c;表示方法中传递的参数不合法。这个异常通常在方法被调用时抛出&#xff0c;表明方法的参数出现了问题。要正确解决这个异常&#xff0c;你可以按照以下步骤进行&#xff1a; 查看异常信息&#xff1a;首…

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

iOS ------ MRC

一&#xff0c;MRC MRC&#xff1a;Manual reference Counting与ARC是两种不同的内存管理机制。ARC是自动引用计数&#xff0c;有编译器在编译时自动插入内存管理代码。而MRC是手动引用计数&#xff0c;开发者需要手动管理对象的引用计数。开发者需要手动调用retain&#xff0…

信息系统架构基本概念及发展_2.信息系统架构的定义

1.几种架构的定义 信息系统架构仍在不断发展中&#xff0c;还没有形成一个公认的定义&#xff0c;这里举出几个定义。 定义1&#xff1a;软件或计算机系统的信息系统架构是该系统的一个&#xff08;或多个&#xff09;结构&#xff0c;而结构由软件元素、元素的外部可见…

最全-全分辨率免ROOT免费脚本开发工具《懒人精灵》系统视频教程

---全分辨率免ROOT免费脚本开发工具《懒人精灵》--- 一、基础板块-视频教程 1.懒人精灵核心基础视频教程(一)&#xff1a;https://www.bilibili.com/video/BV1vr4y1P7hh/ 2.懒人精灵核心基础视频教程(二)&#xff1a;https://www.bilibili.com/video/BV1BB4y1X7rw/ 二、插件-…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

2024年建筑施工特种作业人员安全生产知识试题

100分题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 单选题&#xff08;1-10&#xff09; 1.因生产安全事故受损害的从业人员&#xff0c;除…

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像&#xff1a; PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb St…

ElasticSearch集群环境

ElasticSearch集群环境 1、Linux单机 下载地址&#xff1a;LINUX X86_64 (elastic.co) 下载之后进行解压 tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz 名字太长了改个名字改成es mv elasticsearch-7.8.0 es因为安全问题&#xff0c;Elasticsearch 不允许 root 用户…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景&#xff0c;用户需要在表单中大量使用选择框以及输入框填写数据&#xff08;每一行大概有三十几个输入框&#xff09;&#xff0c;当选择框与输入框达到一定数量的时候&#xff0c;页面会出现输入不连续、卡顿的现象&#xff0c;如下图&#xff1a;…

【信息系统项目管理师知识点速记】风险管理:规划风险管理

规划风险管理是确保项目风险得到有效管控的关键前期步骤,它为整个项目生命周期中识别、分析、应对和监控风险提供了蓝图。 核心目的 匹配度:确保风险管理策略与项目风险水平、组织及干系人重要性相匹配。适时调整:项目初期完成,但需在重大变动时重新评估和调整。输入要素 …

16.直方图均衡化

数字图像处理(17): 直方图均衡化处理 简介 直方图均衡化是一种简单有效的图像增强技术&#xff0c;通过改变图像的直方图来改变图像中各像素的灰度&#xff0c;主要用于增强动态范围偏小的图像的对比度。当原始图像的灰度分布较为集中的时候&#xff0c;可能造成图像不够清晰&…

如何高效率阅读文献

很多导师曾说&#xff0c;不应该花费超过30分钟阅读一篇论文&#xff0c;在某些特殊的时间段&#xff0c;30分钟甚至可能都算是太多的时间&#xff0c;比如&#xff1a;你正准备毕业论文或者想要发表论文的时候…… 文献阅读为何如此重要&#xff1f;又该如何有效快速的阅读&a…

C++基础与深度解析 | 什么是C++ | C++开发环境与相关工具 | C++编译/链接模型

文章目录 一、什么是C二、C的开发环境与相关工具三、C的编译/链接模型 一、什么是C C是一门比较流行的编程语言&#xff08;高级语言&#xff09;&#xff0c;同时也是一门复杂的语言。从TIOBE 编程社区指数中可以看出&#xff1a;在2024.04中&#xff0c;其编程语言受欢迎程度…

HCIP【BGP综合实验】

目录 一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 三、实验思路&#xff1a; 四、实验步骤&#xff1a; 1、进行网段的子网划分&#xff08;整个实验总共有19条网段&#xff09;&#xff1a; (1)首先&#xff0c;根据实验要求&#xff0c;将172.16.0.0/16全部划…