JAVA中的String

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图) 本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。 阅读详情

String的Tricky的地方

简单而言,java中的直接用字符串初始化的Spring是指向常量池的。而常量池中的内容是不可改变的。(这句话千万别理解成String对象都在常量池。正常生成的String对象也存在于堆)。

public class Sandbox4 extends Sandbox2{
	String s1 = "test1";
	public static void main(String[] args) {
		Sandbox4 a= new Sandbox4();
		a.ChangeString(a.s1);
		System.out.print(a.s1);
	}
	void ChangeString(String s){
		s = "test2";
	}
	
}

如果你强行要改变他的值。JVM回在常量池中新生成一个对象。而java中都是穿值的。上面的程序中进入方法的s是一个引用。方法改变了引用的值,而不是引用所指向对象的值。所以程序的释出仍然是test1。即使你采用new String的方法声明s1也结果不会改变的。JAVA API中已经明确说了String中的内容不能改变。只能新建一个对象替换。

另外的一点是,当你使用字符串字面量给String赋值时,有可能新生成一个对象(比如说上面的例子)。也有可能不新生成一个对象,而是指向常量池中已经存在的对象。

public class Sandbox4 extends Sandbox2{
	String s1 = "test1";
	public static void main(String[] args) {
		Sandbox4 a= new Sandbox4();
		String s2 = "test1";
		System.out.print("s1==s2:"+(a.s1==s2));
	}	
}

但是,如果将上述换成new String的方法来定义引用,则是两个不同的对象。
如果你想生成一个非常量的String。请使用StringBuffer类。

这里还要牵扯一个问题。就是final。
当书写final Object obj类似的定义时,obj指向的对象并不是不可以变的!而只是obj指向的对象不能变成别的对象。所以跟上面说的情况不同。不能说String是默认final修饰的。这是两回事。

java中的是比较他们的内存地址。object中的equals就是用实现的。当然可以重写。hashcode是用来均匀映射的。理论上hashcode相等不代表什么。
但是,在hashmap等的实现中这样却不行。事实上,我们在不能允许两个equals相等的对象hashcode不同。所以,如果你重写了equals方法,而且会用到集合框架。请重写hashcode。你重写的equals方法一般是要求两个对象中部分或者全部字段相等。显然,用这些字段计算hashcode就好啦。

在这里插入图片描述
在JDK1.8中,常量池被分到了metaSpace。

String不可变原理

String的底层是字符数组。

private final char[] value;

数组引用被设置成了final。我们知道final只在编译期间有用,而且数组引用的final不代表数组中每个元素也是final。所以,String可以被反射改变。

public static void testReflection() throws Exception {  
      
    //创建字符串"Hello World", 并赋给引用s  
    String s = "Hello World";   
      
    System.out.println("s = " + s); //Hello World  
      
    //获取String类中的value字段  
    Field valueFieldOfString = String.class.getDeclaredField("value");  
      
    //改变value属性的访问权限  
    valueFieldOfString.setAccessible(true);  
      
    //获取s对象上的value属性的值  
    char[] value = (char[]) valueFieldOfString.get(s);  
      
    //改变value所引用的数组中的第5个字符  
    value[5] = '_';  
      
    System.out.println("s = " + s);  //Hello_World
}  

但是,不是说String直接字面常量赋值会存储于常量池吗?万能的反射才不管方法区是啥!

除了把value设置为final,JDK作者还将String的class设置为final以免继承者改变类的逻辑,最终的保障就是小心翼翼写代码,不暴露任何可以修改value的方法。

itern方法

在JDK源代码里,intern就是这么一个简单的系统调用。如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

public native String intern();
public class Test {
	public static void main(String argv[])
	{

		String s2 = new String("HelloWorld");
		System.out.println(s2 == s2.intern());//输出false,因为s2在堆上,而s2.intern返回常量池中的对象
	}
}

使用这个方法主要目的是节省内存空间。

intern()方法在JDK1.6中的作用是:比如String s = new String(“SEU_Calvin”),再调用s.intern(),此时返回值还是字符串"SEU_Calvin",表面上看起来好像这个方法没什么用处。但实际上,在JDK1.6中它做了个小动作:检查字符串池里是否存在"SEU_Calvin"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"SEU_Calvin"添加到字符串池中,然后再返回它的引用。

目的

  • 不可变对象可以提高String Pool的效率和安全性。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个“ABC”的其他变量也不会造成影响。java的classloader机制需要使用String类型,所以,保证String的不能修改极为重要。

  • 不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。

String的性能问题

以前,String类一直被诟病存在拼接时巨大的性能问题。实际上,String的+是语法糖,内部是新建StringBuilder对象完成拼接后再转String。会导致新建和销毁大量对象。所有请避免频繁使用String进行字符串拼接。

String、StringBuffer和StringBuilder在本质上都是字符数组,不同的是,在进行连接操作时,String每次返回一个新的String实例,而StringBuffer和StringBuilder的append方法直接返回this,所以这就是为什么在进行大量字符串连接运算时,不推荐使用String,而推荐StringBuffer和StringBuilder。

在这里插入图片描述

StringBuilder的append直接使用了其父类的append的方法。

    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

而StringBuffer,则是升级直接搞成了synchronized修饰一下就完事了。

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

总说StringBuilder线程不安全。不安全在哪呢?你显然不能多线程的操作StringBuider对象。但是当大多数时候我们拼接一个字符串时,都是单线程堆栈的操作环境。所以没啥问题。

进一步深入

String的机制可以说是JAVA最恶心的地方之一。
JDK6,JDK7,JDK8的String类的行为都不相同。真是令人恐怖。

推荐下一篇
https://blog.youkuaiyun.com/define_us/article/details/82223291

Claude Code 使用 OpenAI Codex(GPT-5.3-Codex)完整配置教程 通过 LiteLLM 可以让 Claude Code 调用任何模型,包括:OpenAIDeepSeekGemini本地模型↓↓优点:不依赖 Anthropic API可自由切换模型支持统一 AI Gateway这种“LLM Gateway 架构”正在成为 AI 开发工具的主流实践。 阅读详情

相关推荐

告别轮询!手把手教你用S32K3的FlexCAN Enhanced FIFO+DMA实现高效CAN FD数据接收

本文详细介绍了如何利用S32K3芯片的FlexCAN Enhanced FIFO与DMA组合方案,实现高效CAN FD数据接收,彻底告别传统轮询和中断模式。通过深度缓冲、智能过滤和DMA联动技术,该方案在5Mbps高负载场景下将CPU占用率从42%降至3%以下,显著提升系统实时性和吞吐量。

weixin_30906185的博客 502

java中define_Java中的#define

评论空间太小,所以这里有一些关于static final的使用方面的更多信息。 正如我在对Andrzej的回答的评论中所说的,只有原始string和string以文字的forms直接编译到代码中。 为了演示这一点,请尝试以下操作:您可以通过创build三个类(在单独的文件中)来看到这一点:public class DisplayValue { private String value; publi...

weixin_29628637的博客 3418

基于STM32的RS485土壤氮磷钾与PH传感器数据采集与OLED显示实战(附完整代码)

本文详细介绍了基于STM32单片机通过RS485协议采集土壤氮磷钾与PH传感器数据的实战项目。涵盖硬件选型、连接方法、Modbus-RTU通信协议解析、STM32程序实现及OLED显示,提供完整代码和调试技巧,适用于农业物联网环境监测系统。

kotlin6android的博客 335

java的String类源码详解

java的String类源码详解 类的定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final c...

悦分享 8457

DeepSeek-V3本地Docker容器化部署

通过以上步骤,你可以在本地上成功通过容器化部署DeepSeek-V3。安装完成后,启动Docker Desktop。如果需要后台运行,可以加上。

u013302168的博客 2123

从零搭建智能视觉小车:OpenART图像处理+增强现实避坑指南

本文详细指导如何从零搭建智能视觉小车,重点介绍OpenART图像处理与增强现实技术在AprilTag识别中的应用。涵盖硬件选型、环境配置、算法优化及实战调试全流程,特别分享智能汽车竞赛中的避坑技巧和优化方案,帮助开发者构建稳定高效的视觉系统。

yhn456789的博客 1055

Java的String(字符串详解)

字符串1.字符串的常见构造方法主要有三种,一种是直接使用常量去构造,要么使用new String来构造,或者还可以使用字符数组的形式。String 类型本身并不存储数据,而是存储指向该字符串的引用,所以字符串类型是一个类,s1是一个引用,指向这个类。而这个类有两个成员变量,一个名称为value,这也是一个引用类型,指向一个字符数组,与C++类似,但是java中的字符数组是没有\0的。此外,字符串类型还有一个成员变量hash,这个暂时知道就行了。2.常见的String类的方法判断是不是空字符串。

baixian110的博客 7963

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

公司的历史项目在导出功能上引用的是poi-3.12版本,后续再做word模板导出功能时用到了poi-3.15版本,升级完后发现项目的很多导出功能都瘫痪了。用旧版本,新功能无法使用;用新版本,旧功能瘫痪,且整改的工作量比较大。使用maven-shade-plugin,将某个版本的依赖名称进行修改,重新引入即可。

S_White_Island的博客 1万+

Java中 String类的详解(非常全面细致)

一、String类的使用: String:字符串,使用一对“”引起来表示 String声明为final的,不可以被继承 String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小 String内部定义了final char[] value用于存储字符串数据 String代表不可变的字符序列,简称:不可变性 体现: ......

路宇的博客 2万+

SAP-MM-采购申请字段解析

采购申请抬头以及行项目字段解析

yanzibing99的博客 7305

AI Agent在智能广告投放中的应用

随着互联网的快速发展,广告投放市场变得越来越复杂和竞争激烈。传统的广告投放方式往往难以精准地触达目标受众,导致广告资源的浪费。AI Agent作为一种智能的自动化程序,能够在复杂的环境中自主学习、决策和执行任务。本文章的目的在于深入探讨AI Agent在智能广告投放中的应用,研究如何利用AI Agent提高广告投放的精准度、效率和效果,降低成本。范围涵盖了AI Agent的基本原理、相关算法、在广告投放中的具体应用场景以及实际案例分析等方面。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 617

java的String(详述)

String是一种不可变对象,字符串中的内容是不可变的,一旦初始化完成后就无法改变了,虽然可以使用“+=”进行字符串追加,但是并不是真正意义上的追加,“+=”实际上是new了几个新对象进行追加成为一个新的对象最后再返回变成String类型,本质意义上也不是在原字符串的基础上追加。String类的字符实际是保存在内部维护的value字符数组中,并且该数组也被final修饰,表示value本身的引用对象不可以修改,即不可以引用其他的字符数组,但是value引用的数组内容是可以修改的。

L326214的博客 5213

【Python_Zebra斑马打印机编程学习笔记(二)】基于BarTender将btw文件转换为zpl文件

本文介绍如何基于 BarTender 软件将 btw 格式的文件转换为 zpl 格式的文件,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 3375

String 在Java中的用法详解

认识String类 和 String的使用1、创建字符串:(1)常见的构造String的方式:(2)String的基本概念: 1、创建字符串: (1)常见的构造String的方式: ① 方式一: String str = "You are very cool!"; ② 方式二: String str = new String("You are very cool!"); ③ 方式三: char[] array = {'c','o','o','l'}; String str = new String(ar

小乔不掉发的博客 9180

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java中String是类_java中String是对象还是类?详解java中的String

有很多人搞不懂对象和类的定义。比如说java中String到底是对象还是类呢?有人说String既可以说是类,也可以说是对象。其实他这么说也没问题,类和对象其实都是一个抽象的概念。我们可以把一类东西归集在一起,起一个名字,什么类,专门做什么事的,但是我们也可以说它是一个对象……所以说String既可以说是类,也可以说是对象。但是如果你要深究,比如小编就饿深究了一下,我发现在java.lan...

weixin_28998775的博客 1407

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java7,8中的String pool

参考文献: http://blog.youkuaiyun.com/chen1280436393/article/details/51768609 http://java-performance.info/string-intern-in-java-6-7-8/ http://blog.youkuaiyun.com/heiyouhei123/article/details/51560166关于String poolwh

随心的专栏 2036

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java中String和new String还有对象中的String字符串在内存中的存储

参考自:http://blog.youkuaiyun.com/zhangjg_blog/article/details/18319521 的博客,很多知识和代码都来源此,感兴趣的同学可以去看看     一直以来,所有人都说,java中的String类型是不可变的,可是为什么不可变确很少有人说的透彻,String和new String的区别,对象中的String和直接定义一个String是否有区别,一

从零开始的程序员之路 4566

java中的String

我们先对String来简单介绍一下: 1.字符串,使用“”引起来表示 2.声明为final,不可被继承 3.实现了Serializable接口,字符串可以被序列化 4.实现了Comparanle接口,可以用来比较字符串的大小 5.一种不可变的字符序列-->不可变性 6.String是引用类型 不是基本数据类型 7.可通过字面量的方式或者String构造器的方式给字符串进行赋值 一、String两种实例化 /** * String 实例化 * 方式一:通过字面量定义的方式 *

weixin_53870975的博客 698

java的string args,Java中的String[] args

在每个java程序中都有一个方法,public static void main(String[] args)方法,这个参数看了好久没看懂,但是细细看来,还是挺简单的,所有的方法的参数都是一个道理,而这个main方法有所不同的是:它是所有方法中最先运行的一个,所以没有其他方法给它传递参数,所以需要靠运行时命令行输入参数,所以String args,接收的是命令行的输入,package Test_m...

weixin_42512719的博客 1550

【Java】Java中的String类详解

Java的String类详解

啊松同学的博客 1334

java中的string是什么意思_java中string什么意思

Java是面向对象的编程语言,它其中包含有各种各样的名词,都有着不同的意思。Java中的string是字符串的意思,当声明了一个字符串变量时,便可以在里面存储数据。String类想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:public final class Stringimplements java.io.Serializable, Comparable, ...

weixin_33958222的博客 841

关于java中的String类详解

Java String类在Java 8及之前使用char[]存储字符串,Java 9后改为byte[]+编码标志位,以节省内存空间。String对象存储在堆中,字符串常量池位于堆内存以实现字符串驻留。String类被声明为final以确保安全性、不可变性和性能优化。从char[]改为byte[]的优化主要针对Latin-1字符,可减少内存占用并提升缓存局部性,同时保持原有API不变。这一改动体现了Java团队对性能的精细优化。

weixin_44146398的博客 1186

Java中的String

String类    String类型是一种特殊的引用型变量,使用起来和值型变量一致。        "abc"; 其实就创建了一个String类型的对象。那么涉及到方法传参是就不难理解如下的情况:有方法如下                        void changeString(String s)                        {              

Richardkaola的专栏 737

java中的string类型_Java中的String类型

1、基本类型和引用类型在C语言里面,是有指针这么一个变量类型的,指针变量保存的就是所要指向内容的地址。在Java里面,没有了指针的这么个说法,而是换了一个词:引用类型变量。先说Java里面的基本类型,所谓基本类型,很简单,就是一个数字,一个字符或一个布尔值,数字里面包含整型、浮点型等,没有什么好说的。再说这个引用类型,他的概念就很像指针了。引用变量的值指向内存空间的引用,就是C中的地址,所在这个地...

weixin_39913141的博客 113

java中的String类

1.1 String 类概述 概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 “abc” )都可以被看作是实现此类的实 例。 类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻 译为大写或小写的所有字符的字符串的副本。 特点 字符串不变:字符串的值在创建后不能被更改。 String s1 =...

六五酥的博客 1337

Java中的String以及相关用法

搜索方向是。

nsjqj的博客 1139
上一篇: JAVA中的集合框架
下一篇: linux和磁盘(2):文件系统和磁盘管理
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值