java String字符串赋值及常量池原理、StringBuilder、StringBuffer

java面试题(吐血整理)--基础知识 本文总结了Java核心知识点,包括:1. JDK/JRE/JVM关系及Java语言特点;2. 数据类型、运算符和流程控制;3. 面向对象特性(封装、继承、多态);4. 字符串处理与常量池机制;5. 异常处理与IO流分类;6. 集合框架与哈希机制;7. 内存管理与垃圾回收;8. 多线程与NIO特性。重点涵盖了基本语法、面向对象、字符串操作、集合框架等Java核心概念,并对比了不同版本的特性差异。 阅读详情

String字符串赋值及常量池原理

String简介

String设计为不可变类主要考虑到:效率和安全。

String常量池

由于String的不可变性,为了提高操作效率,所以设计常量池。从1.8开始,String常量池被放在了堆中,在1.8之前存放在方法区的运行时常量池。

String a = "a"做了什么

String a = "a"

这段代码首先 "a" 此字符串叫字符面值。在编译时,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量 (Literal)和 符号引用 (Symbolic References),每个class文件都有一个class常量池。在运行时,class文件加载后,对应的静态常量池被常驻到内存即运行时常量池。当代码执行到String a = "a"时,声明的变量a将存放"a"字面量对应的引用地址于栈中。

String a = new String(“a”)做了什么

对于字符面值 "a",肯定是在常量池中。然后通过new在堆中创建新的字符串对象。栈中变量a的值即为new的字符串对象的引用地址。

String intern()方法

String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。 对于任意两个字符串s和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。所有字面值字符串和字符串赋值常量表达式都使用 intern方法进行操作。

String作为方法传递

public static String upcase(String old){
        old = "aa";
        return old.toUpperCase();
    }
    public static void main(String[] args) {
        String a = "a";
        String aa = upcase(a);
        
        System.out.println(a);//a
        System.out.println(aa);//AA
        System.out.println(a);//a

    }

在方法传递时,字符串传递的是引用,因此尽管old局部变量被upcase方法重新赋值,但不会影响到main方法中声明的a变量

重载’+'与StringBuilder

java对字符串加法进行了重载,+作为二元运算符。
当a、b变量至少一个是String对象时。
a+b <=> new StringBuilder(a).append(b).toString();
当a、b变量为基本数据类型或者为字符面值
a+b <=> ab
上面两者是完全等价的。说的有点抽象,下面看代码

情况一,常量池引用

 String str1 = "a";
 String str2 = "a";
 System.out.println("str1 == str2: "+(str1==str2));//true

变量str1、str2都是存放常量池中String对象的相同引用。

情况二,重载“+”与字符面值

final String str1 = "aa";
String str2 = "aa"+"1";
String str3 = "aa"+1;
String str4 = str1 + 1;
System.out.println("str2 == str3: "+(str2==str3));
System.out.println("str3 == str4: "+(str3==str4));

都是true,因为字符串的重载+,两个变量是基本数据类型或字符面值是在编译时会自动的合并。同时对于final修饰的String对象且指向常量池,在编译时,依然会合并。

情况三,重载“+” 与String对象

String str1 = "aa";
String str2 = "aa1";
String str3 = str1 + 1;//与下方等效
//String str3 = new StringBuilder(str1).append(1).toString();
System.out.println("str2 == str3: "+(str2==str3));//false
System.out.println("str3.intern() == str2: "+(str3.intern()==str2));//true

实际上str3最终是通过StringBuilder的toString方法创建了String对象。因此str2和str3内存地址不同。但str3的intern与str2是相同的,因为是同一个常量池值。
通过这里我们可以知道对于对象字符串的加法,在for循环内部是避免使用的。因为会创建太多的StringBuilder对象。

StringBuilder与StringBuffer

简介

由于字符串的不可变特性,通常我们会有字符串拼接的需求,如果单纯的使用String+那么性能肯定会受到影响。因此设计出了线程不安全的StringBuilder,和线程安全的StringBuffer

AbstractStringBuilder

StringBuilder和StringBuffer都是集成了抽象类AbstractStringBuilder。AbstractStringBuilder的主要功能就是提供了对字符串的添加、移除、存储方式进行了约定。然后具体的实现对应的功能。核心是利用char[]进行数组存储,通过扩容的方式进行增加类似ArrayList。对于StringBuilder的实现基本上都是调用抽象类实现,对于StringBuffer在字符串操作的方法加入了synchronized同步代码块实现线程安全。

String、StringBuffer和StringBuilder的详解 1.值的可变性String内部的value值是final修饰的,所以,它是不可变类;因此,每次修改String的值,都会产生一个新的对象。StringBuffer和StringBuilder是可变类,它们在字符串变更的时候,不会产生新的对象。2.线程安全String是不可变类,所以它是线程安全的。StringBuilder不是线程安全的。StringBuffer是线程安全的,因为它的每个操作方法都加了synchronized同步关键字。单线程情况下,建议使用StringBuilder。 阅读详情

相关推荐

别再为EPI形变头疼了!FSL的topup+eddy实战保姆级教程(含AP/PA数据采集要点)

本文详细介绍了如何使用FSL的topup和eddy工具解决EPI形变问题,包括数据采集要点、参数设置和实战操作步骤。通过AP/PA双编码数据和精确的形变场估计,有效矫正MRI图像中的几何畸变,提升弥散数据质量。特别适合需要处理高场强MRI数据的研究人员和技术人员。

weixin_28725949的博客 399

十二.Scala字符串

Scala 字符串以下实例将字符串赋值给一个常量:object TestString1 { val greeting: String = "Hello,World!" def main(args: Array[String]) { println( greeting ) } }以上实例定义了变量 greeting,为字符串常量,它的类型为 String (java.lan

david's Blog 2708

Camera | 瑞芯微rk3568平台MIPI-CSI驱动:从设备树到V4L2框架的完整链路解析

本文深入解析瑞芯微rk3568平台MIPI-CSI驱动的完整链路,从设备树配置到V4L2框架集成。详细介绍了rk3568的MIPI-CSI驱动架构、设备树关键节点布局、驱动初始化流程及数据流路径,帮助开发者快速掌握摄像头控制器的调试与优化技巧,实现稳定的视频采集系统。

weixin_28703489的博客 289

一文彻底搞懂字符串、字符串常量池原理

文章目录1. 常量池概述1.1 常量池、运行时常量池与字符串常量池的区别2. 字符串常量池的设计初衷3. 字符串的几种创建方式及原理①:直接赋值②:new String()③:intern()方法3. 面试题:字符串比较          1. 常量池概述         java代码经过编译后会生成.class字节码文件,随便打开一个target目

qq_1149513559的博客 6043

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1844

String类型与常量池(JDK1.8)

String类型的字符串理解

weixin_40701758的博客 336

Unity零基础到入门 ☀️| 轻松学会 Unity界面布局和简单实例——入门级!(^_−)☆

入门级Unity知识,一起加油呀!

努力前行,总会成为自己心中的那道光 1万+

String:字符串常量池,彻底搞懂创建几个对象,是否相等的问题

作者:Seven_Nee 介绍 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 1、字符串常量池的设计意图是什么? 2、字符串常量池在哪里? 3、如何操作字符串常量池? 字符串常量池的设计思想 1、字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据...

weixin_44476888的博客 1179

ModuleNotFoundError: No module named‘langchain.schema.output parserlangchain.schema is not a package

电脑里现有的langchain库版本与import所需的不同,卸载原有langchain,重新下载最新的langchain。在步骤1后,若仍不可运行。在确保已重新下载新langchain后,重启python后,可正常运行。在版本号中填入所需的langchain版本号,可在requirements.txt查看。运行如下代码时,出现error。

weixin_45751925的博客 1713

基于simulink的电动汽车电机驱动系统IGBT开路故障检测

本文介绍了基于Simulink的电动汽车电机驱动系统IGBT开路故障检测方法。通过搭建永磁同步电机(PMSM)驱动系统模型,实现IGBT开路故障注入,并设计基于电流平均值与PWM逻辑比较的故障检测算法。系统可实时采集三相电流信号,通过MATLAB Function模块实现故障诊断,当检测到PWM信号与电流不匹配时输出故障报警。仿真结果显示,系统能在2.05秒内准确识别A相上管开路故障,并通过Scope和XYGraph直观展示故障特征。该方法为电动汽车电力电子系统故障诊断与容错控制提供了实用解决方案,后续可扩

xiaoheshang_123的博客 149

面试系列之String原理详细讲解

String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,本文精心准备了String的必备基础知识,希望可以帮到需要了解String知识的人们。

lgy_2021的博客 1572

把浮点数这件小事讲清楚:ABAP 7.51 里 Open SQL 与 ABAP CDS 的 FLTP 新玩法与避坑指南

ABAP浮点数计算的风险与应对 摘要:ABAP项目中的浮点数(FLTP)在跨平台计算时存在误差风险,同一逻辑在不同数据库平台可能产生细微差异。ABAP 7.51新增了两项关键能力:1)Open SQL和ABAP CDS中可为AVG函数指定结果类型,避免默认返回FLTP;2)ABAP CDS提供FLTP_TO_DEC转换函数。但需注意这些转换仍可能存在平台相关差异,且FLTP_TO_DEC会截断而非四舍五入小数位。开发者在涉及金额、数量等关键业务计算时,应明确数值语义并设计容错机制。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

尝试下了解Java的String

尝试下了解Java的String,

就是单纯的学习分享,最快的成长就是学会分享 1862

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

String底层详解

String类型知识点全解读String的底层实现原理String的赋值StringBuffer和StringBuilder String的底层实现原理 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value i...

qq_42828912的博客 1842

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

String、new String()的知识点梳理

前言 String str="1"和new String("1")的区别,其实是个老生常谈的问题,理解起来也挺简单,但是许多人还是很模糊。今天跟新人交流时发现他们对这块的认识也存在偏差,遂在这里系统整理一下String的相关问题。 在叙述问题先,我们要先明白赋值和引用。因为这点对我们理解下边的代码很重要,不然很容易晕。参考这篇文章:https://blog.youkuaiyun.com/yz930618/...

安迪爸爸 1575

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

String、StringBuffer、StringBuilder的特性851376263

String类:字符串是常量,使用一对""引起来表示。他们的值在创建之后不能修改。 1.String声明为final的,不可被继承 2.String实现了Serializable接口,表示字符串时支持序列化的。 实现了Comparable接口:表示String可以比较大小 3.String内部定义了final char[] value用于存储字符串数据 4.String:代表不可变的字符序列。简称:不可变性体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行.......

weixin_49329785的博客 699

java常量池方法区_java栈、堆、常量池、方法区

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。堆(heap):用于存储对象和数组常量池:常量池的划分Class 文件常量池运行时常量池字符串常量池1. Class 文件常量池Class 文件常量池指的是编译生成的 class ...

weixin_33724264的博客 412

Java String学习笔记

java String、StringBuilder、StringBuffer 相关介绍

0start1的博客 387

java类中String几个常用的构造方法以及String通过不同方式产生对象的比较

Java中String类的构造方法 JAVA基础(String类构造方法)

weixin_46096297的博客 338

String类常见用法

本文摘要: Java字符串处理主要涉及String、StringBuilder和StringBuffer三类。String具有不可变性,提供了构造、比较(==、equals、compareTo)、查找、转换、替换、拆分和截取等操作。StringBuilder和StringBuffer用于可变字符串操作,支持append等方法。字符串常量池优化了相同字符串的内存使用,直接赋值的字符串会共享常量池对象,而new创建的字符串则生成独立对象。理解这些特性对高效处理字符串至关重要。

xiaochuan_bsj的博客 367

寒假笔记3

------->自动拆箱,底层会默认调用intValue(),计算机领域中像这种简化的写法,称为语法糖。String s = String.value of(a)-------->用的较多,即使为null,转换时也不会报错。s1.indexOf("c", 3) -------->从指定位置开始查找,指定字符首次出现的位置,从前向后找。s1.substring()--------> 从指定位置开始截取到末尾,且截取返回新的字符串对象。-------->手动拆箱。

2402_88420504的博客 189

java理论基础面试知识

java基础知识 JVM、JRE和JDK的关系 JVM Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平 台。 JRE Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包 JDK Java ...

辰小影博客 1227

String,StringBuffer ,StringBuilder 的区别及其详解

String 类代表的字符串,程序中任何字符串都是String类的对象字符串是常量;它们的值在创建之后不能更改。通过上图发现String被final修饰,所以字符串的值创建之后就不可以被修改,具有不可变性也就是因为String类字符串定义后不能改变,所以提供了StringBuffer类(字符串缓冲区)来操作字符串。可将字符串缓冲区安全地用于多个线程看完上面,你也就知道String 和StringBuffer的最大区别了那就是StringBuffer创建的字符串可以改变。

m0_73940426的博客 3374

字符串常量池与StringBuilder

intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手动将创建的String对象添加到常量池中。可能有人说因为被final修饰,所以不能修改,首先这是一个很大的误区,final修饰只能说明value引用的对象不能修改,而不是说value引用的值不能修改.我们随便打开一个String的方法,这里打开的是toUpperCase方法,可以发现:所有涉及到修改字符串内容的方法都是创建一个新对象返回.(之前常量池没有存储过任何字符串)

buhuisuanfa的博客 2894

String面试题总结【字符串常量池】【StringBuilder】【StringBuffer】

注意:在jdk1.6版本及以前,如果字符串常量池中没有"aaa" 这样一个字符串 ,还需要将"aaa" 复制到字符串常量池里,然后返回字符串常量池中的这个新创建的字符串"aaa"。所以,常量池中没有“abc”字面量则创建两个对象,否则创建一个对象,以及创建一个引用。同上,看到有"aaa"这个字面量,就会先去字符串常量池中检查是否存在字符串"aaa"这种方式会保证字符串常量池和堆中都有这个对象,最后返回堆内存中的对象引用!如果没有,则会在常量池中创建一个新对象,再返回常量池中aaa的对象引用。

Teslass的博客 1685
上一篇: java基础中==,equals(),Objects.equals()详细区别与细节
下一篇: mybatis sqlite jdbc多表更新、删除的bug以及修复方法
mt23
博客等级 码龄12年 33粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值