String字符串

C# 字符串(String) 上面的方法列表并不详尽,请访问 MSDN 库,查看完整的方法列表和 String 类构造函数。String 类有许多方法用于 string 对象的操作。在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用。关键字来声明一个字符串变量。string 关键字是。“消息在 {0:D} 的 {0:t} 发送”通过使用 string 构造函数。“找到序列 'test'。创建 String 对象。“昨晚我梦见了圣佩德罗”“在路上,夜晚是黑暗的”“阳光每天照耀在山顶上”字符串(String) 阅读详情

常量池

java中的常量池在我的理解中有三种,分别是calss常量池,运行时常量池和string 常量池

class文件常量池

class文件中的常量池是在硬盘上的,通过javap -verbose xxx.class可以看到:

Constant pool:
   #1 = Methodref          #7.#28         // java/lang/Object."<init>":()V
   #2 = String             #29            // 2
   #3 = Fieldref           #4.#30         // com/xx/Test.scount:Ljava/lang/String;
   #4 = Class              #31            // com/xx/Test
   #5 = Fieldref           #32.#33        // java/lang/System.out:Ljava/io/PrintStream;
   #6 = Methodref          #34.#35        // java/io/PrintStream.println:(Ljava/lang/Object;)V
   #7 = Class              #36            // java/lang/Object
   #8 = Utf8               scount
   #9 = Utf8               Ljava/lang/String;
  #10 = Utf8               ConstantValue

所以class文件中的常量池会为每个类生成一个Constant pool的常量池,里面包含了:
1.类和接口的全限定名;
2.字段的名称描述符;
3.方法的名称和描述符。

运行时常量池

运行时常量池在JVM中InstanceKlass中的的一个属性
ConstantPool* _constants; 在方法区中的元空间,我们用HSDB来证明
我们编写一个类T0813,运行,拿到进程号,用HSDB查看如下:
在这里插入图片描述

String常量池

StringTable ,底层是HashTable
字符串常量池是放在堆区中,在堆区中开辟的一块空间,用于存放字符串常量池,然后整个堆区中的字符串常亮池只存在一份
其实string对象在底层维护了一个char的数组,用来存放字符串。

字符数组的存储方式

我们看下以下程序:

public class T0813 {

    public static void main(String[] args) throws IOException {
        char [] c  = new char[]{1,2,4};
        System.in.read();
    }
}

通过jps拿到进程号6072,我们使用HSDB(jdk lib目录)来查看这个进程
java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
在这里插入图片描述
其实在jvm中就是一个TypeArrayKlass,也就是一个TypeArrayOopDesc
在这里插入图片描述
上图中的char[]aarr = new char[]{“2”,“3”};在jvm中的存在形式如上图
我们在虚拟机栈中有个s1的char数组对象,然后指向了堆区的typeArrayOopDesc对象,其实堆区的字符数是对s1的引用

不同方式创建字符串在JVM中的存在形式

String str1 =“1”;

public class Str1 {

    public static void main(String[] args) {
        String s1 = "11";
        System.out.println(s1);
    }
}

上述程序共创建了几个普通对象oop,几个string对象
其实 String s1 = “11”;创建了一个string对象,一个char数组对象;
在这里插入图片描述
如图:在堆区创建了一个string对象和char数组对象,而char数组对象是指向了常量池typeArrayOopDesc
流程如下:
1.首先在栈中创建一个sring对象s1,然后堆区先去常量池中找字符串11是否有,如果有直接返回;
2.如果没有,在常量池中创建一个字符串对象然后指向typeArrayOopdesc,所以这个表达式在堆区创建了两个对象,string和char数组对象,而图中的
在这里插入图片描述
是我们的value在c++中的存在形式
String str1 =“11”;
String str2 =“11”;
在这里插入图片描述
两个string对象,都指向了同一个字符串11;
第一次s1创建的时候是创建了一个string对象,一个char数组对象,
而第二次s2创建的时候发现常量池有,所以这个时候就不会创建char数组对象,所以这个表达式创建了2个string对象,一个char数组对象,也就是2个对象

new Strig

public class Str1 {

    public static void main(String[] args) {
        String s1 = new String("11");
        System.out.println(s1);
    }
}

在这里插入图片描述
首先String s1 = new String(“11”);会在堆区创建两个string对象,一个字符串char数组对象
因为表达式的左边是一个string对象,而表达式的右边经过new String出来的,也是一个string对象,而他们两个都同时指向了typeArrayOopdesc对象,也就是字符串11,这个字符串对象是在常量池的。

两个new String

public static void main(String[] args) {
    String s1 = new String("11");
    String s2 = new String("11");
    System.out.println(s1);
}

在这里插入图片描述
其实和一个new string的感念差不多,就是第一次s1创建过后,会有两个string对象,一个char数组对象,那么s2new的时候发现 常量池中已经有了字符串11,那么这个时候是指向了11的,所以这个时候只会创建一个string对象并且指向了typeArrayOopDesc,而typeArrayOopDesc是指向了常量池的11的。

字符串连接

public class Str1 {

    public static void main(String[] args) {
        String s1 = "1";
        String s2 = "1";
        String s = s1 + s2;
        System.out.println(s);
    }
}

字节码如下:

0: ldc           #2                  // String 1
         2: astore_1
         3: ldc           #2                  // String 1
         5: astore_2
         6: new           #3                  // class java/lang/StringBuilder
         9: dup
        10: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        13: aload_1
        14: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilde
r;
        17: aload_2
        18: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilde
r;
        21: invokevirtual #6                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        24: astore_3
        25: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;

可以看到字符串连接在底层就是用StrigBuilder进行的
这个程序创建了2个String,4个普通对象
4个普通对象:
2个char数组
2个string对象
为什么会创建2个string,2个char数组呢?我们来分析下:
首先,s1 和s2执行完毕过后,会创建一个string对象,一个char数组;
然后s = s1+s2进行字符串连接过后,这个时候会产生一个string,一个s1+s2的字符串数组,请注意,这个时候的s是没有放入常量池的,只是在堆区中产生的,所以我们的stirngtable不一定全部都在常量池里面,和intern有关。

再来看下以下程序:

public static void main(String[] args) {
    String s1 = "1";
    String s2 = "1";
    String s = s1 + s2;
    String ss = "11";
    System.out.println(s==ss);
}

上前面理解的知识我们可以得到上面的程序
创建了3个string对象,3个char数组对象
为甚呢?因为s1 ,s2,ss都是放在常量池的,而s是没有放入常量池,所以2,3行代码创建了一个string,一个char数组 ,而第四行代码创建了一个string,一个未放入常量池的char数组对象,所以是3个string,3个char数组,并且第6行代码时false,因为内存地址都不一样,直接==是false

我们修改下程序

public static void main(String[] args) {
    String s1 = "1";
    String s2 = "1";
    String s = s1 + s2;
    s.intern();
    String ss = "11";
    System.out.println(s==ss);
}

这个程序增加了intern方法,那么这个时候就创建了2个string,2个char数组,因为intern把s加入了常量池,而我们的第6行代码执行的时候,发现常量池里面有11,所以就不会创建,直接返回了,所以是2个 string,2个char数组,并且s==ss 是true,因为都在常量池里面,对比的就是真实的vlaue。
所以由上述可知,我们的intern就是把我们的字符串强制放入了常量池,这也就是为什么上面我说的stringTable为什么不一定全部在常量池里面,这和intern方法有关。

最后看下不同的构造方法

public static void main(String[] args) {
    String s1 = new String(new char[]{'1', '1'}, 0, 2);
    System.out.println(s1);
}

上述创建了一个string,一个char,所以是两个对象,这种做法是不会放入常量池的,所以只有一个stirng,一个char

Android16 RK3576 Bluetooth source和sink模式切换 摘要:本文介绍了在RK3576平台上实现蓝牙A2DP模式动态切换的修改方案。通过在device配置文件中添加A2DP Sink相关属性,修改Bluetooth模块代码实现:1)在Config.java中增加persist.bluetooth.rka2dpsink属性控制模式切换;2)修改A2dpSinkStreamHandler.java取消音频焦点限制;3)调整btif_a2dp_sink.cc默认授予音频焦点。最终通过设置persist.bluetooth.rka2dpsink属性为true/false 阅读详情

相关推荐

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

java中集合对象与string互转的几种方式

方式一 Gson类 ArrayList<UserInfo> userInfos = new ArrayList<>(); UserInfo user1 = new UserInfo(1L, "子", "1234"); UserInfo user2 = new UserInfo(2L, "非", "4567"); UserInfo user3 = new UserInfo(3L, "我", "6789");

qq_45752401的博客 6201

利用HFSS仿真优化圆极化微带天线的耦合馈电设计

本文深入探讨了利用HFSS仿真软件优化圆极化微带天线性能的关键方法。通过对比传统直接馈电与耦合馈电方式,详细阐述了耦合馈电在提升阻抗匹配、改善轴比带宽及增强设计鲁棒性方面的显著优势。文章结合FR4板材的实战案例,逐步演示了在HFSS中建立模型、进行参数扫描与圆极化性能优化的完整流程,为设计高性能、高纯度的圆极化天线提供了实用指南。

weixin_29233333的博客 547

String数组转List对象集合

T user(name,age) List<String> data = ['zhangsan',22,'lisi',23] List<T>=List<User> /** *List<String> data *Class<T> clazz **/ private <T> List<T> stringArray2...

孤海岛主 1万+

全球、中国各省市县等行政区划(含十段线)shape及geosjon数据免费下载

免费下载全球、中国各省市县等行政区划(含十段线)shape及geosjon数据

mhf403445651的博客 3461

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

那么,什么是AI Agent?简单来说,AI Agent是一种能够感知环境、做出决策并采取行动的自主系统。自主性:能够在没有人类直接干预的情况下运行,对自己的行为和内部状态有一定的控制权。反应性:能够感知环境的变化,并及时做出反应。主动性:不仅能够对环境变化做出反应,还能够主动地设定目标并采取行动实现这些目标。社会性:能够与其他Agent(包括人类和人工智能)进行交互、协作和竞争。它们可以全天候不间断地监控和处理海量信息,大大提升信息处理能力;

AI大模型应用之禅 193

常用类String

常用类String 由多个字符组成的一串数据,且一旦创建不可修改 此处一共有三个s对象,输出为最后一个s指向的字符串 //底层为final修饰的数组 //一旦修改,开辟新的空间来存储字符串 String s = "a"; s+="b"; s+="c"; System.out.println(s); 创建方式 //创建方式1 String s = "a"; //创建方式2 String s1 = new String("a"); 两种创建方式的区别 简单的创建方式会在字符串缓冲池中查找,当然第一次创建时肯

m0_51998128的博客 158

ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作

【代码】ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作。

十三阿哥的博客 1404

string(字符串)干货归纳+用法示例

5.string一.string简介1.简介:2.常用操作函数汇总:二.string常用实例1.字符串构造(初始化)2.char*(char[])、int与string的相互转换(c_str)3.字符串大小和容量(size、max_size、capacity):4.字符串比较(>,>=,<,<=,==,!=、compare):5.字符串切割、拼接(substr、append、+) :6.字符串等增、删(push_back、insert、erase) :7.字符串的查找(find) :

lzq8090的博客 5293

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6648

如何用IDEA查看jar包中代码

我们在使用Java进行开放时经常会需要下载些第三方的jar包进行相应的开发。有时候相关jar包的使用文档不足,满足不了我们的特定开发使用要求,这就需要我们查看jar包内的相关代码逻辑,本文将基于IDEA工具介绍如何查看相关jar包的代码逻辑

mystonelxj的博客 2283

String类以及字符串详解

String类以及字符串的详解

m0_68989458的博客 3931

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

走进Java:String字符串的基本使用

String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表示。在Java中,String像是一个很大的char数组,我们在定义字符串的时候,不需要再去像上方代码一样去定义,而是直接可以使用String去定义。String就像是很大的char数组,但相比于char数组而言,String可以做字符串拼接操作,而char数组并不能直接去做字符串的拼接,如下代码。

2201_76027234的博客 3717

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

string 与字符串转换

本文介绍了C++中字符串与各种类型间的转换方法。主要内容包括:C风格字符串与string对象的相互转换(使用构造函数、c_str()和data()方法)、数值与字符串的转换(to_string和sto*系列函数)、字符编码转换(C++11的codecvt),以及转换时的最佳实践。重点强调了转换后的指针生命周期管理、错误处理和优先使用string类等注意事项,为C++开发中的字符串处理提供了全面指导。

祯的博客 1220

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA关于String字符串

可以看作是一个容器,创建之后里面的内容是可以改变的作用:提高字符串的操作效率public StringBuilder append(任意类型) //添加数据,并返回对象本身public StringBuilder reverse()//反转容器中的内容从头到尾public int length() //返回长度(字符出现的个数)public String toString()//通过toString()就可以把StringBuilder转换成String。

Darling02zjh的博客 2229

字符串String类

认识String类创建字符串字符串中的 “==”equals()方法==和equals的区别字符串常量池字符串不可变不可变的好处 创建字符串 常见的构造String的方式 //方式一: String str = "Hello world!"; //方式二: String s = new String(Hello abc"); //方式三: char[ ] array = { 'a','b','c'}; String str = new String(array); 字符串中的 “==” 如果现在有两个in

m0_56793367的博客 701

【C++】String字符串

字符串在计算机科学中是指一串字符的序列,通常用来表示文本。通常用字符组成,使用双引号“”来表示。例:string name = "zhangsan"。在C++中string字符串从第一个非空字符(空格、换行等)开始,遇到空字符或换行符结束。C++是没有字符串结束标志的,而C语言字符串使用getline函数从stdin读取一行内容到变量中,遇到回车符直接返回。

大龄转码农民工 931

Java字符串String剖析

关于String的剖析

King_Rou的博客 1825

android string拼接字符串_Java基础之字符串及——String

Java基础之字符串操作——String字符串什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按照一定的顺序排列起来;而字符序列就是作为字符串的内容而存在的。所以可以把字符串理解为:把多个字符按照一定的顺序排列起来而构成的排列组合。如果还是不好理解,没有关系,我还有法宝。我们可以用烤串来比喻说明,可...

weixin_28916817的博客 990

Java中String字符串

Java中String字符串

北执南念的博客 665

String字符串详解

String、StringBuilder、StringJoiner的一些学习心得

qq_62694876的博客 1285

【C++】STL 容器 - string 字符串操作 ① ( string 字符串 简介 | string 字符串 与 char* 字符串 对比 | string 构造函数 )

一、string 字符串 简介 1、string 字符串 与 char* 字符串 对比 2、string 构造函数 3、代码示例 - string 构造函数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 514

C#的string字符串

在C#中string关键字指向的是.NET的基类System.String。与字符串相关类还包含System.Text,System.Text.RegularExpressions和System.StringBuilder。 System.String类 String类是最常用的字符串相关的类。 首先string声明的字符串是可以当做数组来索引字符的。如下: class Program { ...

weixin_40786497的博客 446
上一篇: JVM的内存模型
下一篇: 执行引擎、逃逸分析、JIT即时编译
Life  journey
博客等级 码龄17年 1万+粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值