Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于String的问题

关于String的问题

作者头像
用户1148394
发布于 2018-01-09 09:25:00
发布于 2018-01-09 09:25:00
1.4K00
代码可运行
举报
文章被收录于专栏:余林丰余林丰
运行总次数:0
代码可运行

String是在代码中非常常见的一种数据类型.它能直接像基本类型一样直接赋值(String str = "test"),也能像引用类型一样创建一个实例(String str = new String("test")),当然毫无疑问String是引用类型.

(1)Sring str = "test";  //此种方式会在字符串常量池中创建一个"test'"常量,当有一个新的变量同样也赋值为"test"时,这个新的变量也指向了这个"test"常量.

(2)String str = new String("test");  //此种方式会在堆内存中new一个"test"对象实例,详细分析见下文.

(1)只有使用引号包含文本的方式创建的String对象之间使用"+"连接产生的新对象才会被加入到字符串池中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = "hello" + "world";        //这才会在字符串池中创建一个"helloworld"字符串,而不是去堆中创建一个String对象。

(2)对于所有包含new方式创建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = "hello";
String str2 = "world";
String str = str1 + str2;    //此时str产生的"helloworld"并不会在字符串池中,而是在堆中创建一个String对象。

综上.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tring str1 = "hello";
String str2 = "world";
String str3 = "hello" + "world";
String str4 = str1 + str2;
//str3 == str4 ->false,原因见上。str4是在堆中创建的String对象,str3是在字符串池中创建的的"helloworld"

但是!以上的情况是一般情况!

special1.这个例子实际仔细一分析也很好理解,STR1和STR2都是final常量,它们在类编译时就已经确定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Demo {
    public static final String STR1 = "hello";
    public static final String STR2 = "world";
    
    public static void main(String[] args) {
        String str3 = "hello" + "world";
        String str4 = STR1 + STR2;
        System.out.println(str3 == str4);    //true
    }
}

special2.这个例子和上个例子不同在于final常量被声明的时候,并没有马上给它赋值。在str4被赋值前STR1+STR2是何值都还不确定,STR1和STR2在赋值前实际上就是一个变量而不是一个常量,那么str4就不能在编译期被确定,而只能在运行时被创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Demo {
    public static final String STR1 ;
    public static final String STR2 ;
    static {
        STR1 = "hello";
        STR2 = "world";
    }
    
    public static void main(String[] args) {
        String str3 = "hello" + "world";
        String str4 = STR1 + STR2;
        System.out.println(str3 == str4);    //false
    }
}

回到开始提到的问题:

String str = new String("test"); //创建了几个对象?

2个。在类加载时会创建一个"xyz"对象放到字符串常量池中,在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给s1持有。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【面试专题】讲透必考点String,带配套视频
String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实只是了解到皮毛,并没有真正掌握,而 String 又是面试的高频考点,所以我们有必要将 String 这个类深入研究,彻底搞定,本节课就为大家详细讲解 String 的核心机制以及实际使用。
南风
2019/09/09
3720
【面试专题】讲透必考点String,带配套视频
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6490
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
String字符串在我们日常开发中最常用的,当然还有他的两个兄弟StringBuilder和StringBuilder。他三个的区别也是面试中经常问到的,大家如果不知道,就要先去看看了哈!最近也是看周志明老师的深入JVM一书中写到关于intern()方法的介绍,小编也是以前没在开发中用到。但是面试题还是很多的,所以特意研究了一天,写下来记录一下自己的收获,希望也可以帮助到大家!!
掉发的小王
2022/07/11
6390
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
【图文详解系列】String,StringBuffer与StringBuilder的区别
字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
一个会写诗的程序员
2020/05/26
6.4K0
Java-String那些事
Java-String那些事 String对于广大程序员来说,并不陌生,是我们在编写程序中经常使用到的对象。但是,你真的对String了解吗,使用的方式对吗? 接下来,笔者就对String来进行全面的解析,让你对String有更深入的了解! 更重要的是,面试的时候,虐虐面试官! String源码(截取) public final class String implements java.io.Serializable, Comparable<String>, CharSequence { pri
贾博岩
2018/05/11
5930
备战“金九银十”10道String高频面试题解析
String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实只是了解到皮毛,并没有真正掌握,而 String 又是面试的高频考点,所以我们有必要将 String 这个类深入研究,彻底搞定,本节课就为大家详细讲解 String 的核心机制以及实际使用。
程序员追风
2019/09/05
3770
备战“金九银十”10道String高频面试题解析
字符串常量池_字符串常量池溢出
我们知道字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串我们使用的非常多。JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。
全栈程序员站长
2022/09/19
6780
字符串常量池_字符串常量池溢出
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
还记得String、StringBuilder、StringBuffer区别、String底层原理、实例化、拼接、比较吗?如果忘记可以到这里重温复习String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
寻求出路的程序媛
2024/04/21
5130
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
String是Java中的一个内置类,Immutable不可变,即一旦创建String对象,它的值就不能被更改。对String对象的replace、subString、toLowerCase等操作都会返回一个新String对象,故每次操作String时 性能较低、浪费内存空间
寻求出路的程序媛
2024/04/21
3330
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
面试常备,字符串三剑客 String、StringBuffer、StringBuilder
字符串操作毫无疑问是计算机程序设计中最常见的行为之一,在 Java 大展拳脚的 Web 系统中更是如此。
飞天小牛肉
2021/02/26
4521
面试常备,字符串三剑客 String、StringBuffer、StringBuilder
String类为什么被设计为不可变的?
String类的值是保存在value数组中的,并且是被private final修饰的
Java识堂
2020/06/30
5800
一个高频面试题,考考大家对 Java String 常量池的理解。
作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池:
纯洁的微笑
2018/09/30
8890
一个高频面试题,考考大家对 Java String 常量池的理解。
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
因为,比较 String 字符串的值是否相等,可以使用 equals() 方法。String 中的 equals 方法是被重写过的。Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是字符串的值是否相等。
Java技术江湖
2021/09/10
6230
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
每天都在用String,你真的了解吗?
transient用于指定哪些字段不会被默认序列化,两者同时使用时,transient会被忽略。
说故事的五公子
2020/08/19
5970
每天都在用String,你真的了解吗?
你并不了解 String
PS : 之前好像忘记说了,整个 走进 JDK 专栏都是基于 java 1.8 源码进行分析的。关于其他版本的差异,可能会提到,但是不会细说。所有添加注释的代码都上传到我的 Github 了,传送门
路遥TM
2021/08/31
4580
JDK1.8源码(三)——java.lang.String 类
  String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类。
全栈程序员站长
2022/09/07
3690
JDK1.8源码(三)——java.lang.String 类
String类和常量池内存分析例子以及8种基本类型
       如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则直接返回常量池中该字符串的引用;如果没有, 那么
砖业洋__
2023/05/06
2100
深入理解字符串常量池
在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存就被称为字符串常量池。
烟雨星空
2020/06/16
1.3K0
字符串常量池理解「建议收藏」
在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存就被称为字符串常量池。
全栈程序员站长
2022/09/19
6920
字符串常量池理解「建议收藏」
彻底弄懂字符串常量池等相关问题
  在平时我们使用字符串一般就是拿来直接搞起,很少有深入的去想过这方面的知识,导致别人在考我们的时候,会问 String str = new String("123"); 这个一行代码执行创建了几个对象, String str1= str + new String("456");这行代码中str1存储在内存的哪个位置,堆or 字符串常量区(方法区)? 会把我们问的哑口无言了;哈哈哈哈,其实也不是水平问题,是我们平时可以仔细的去总结该类问题,下面就详细的对这类问题进行总结;
小勇DW3
2018/08/30
6930
相关推荐
【面试专题】讲透必考点String,带配套视频
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验