Java中String对象的引用

涡旋
• 阅读 746


1、创建

通过字面量创建的String对象和new的String对象不同。字面量创建的对象在常量池中,new创建的对象在堆中。

    //String对象
    //直接用引号创建的String对象在pool中
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 == s2); // true  s2是从pool中直接取出"abc"对象的引用

    //new创建的String对象在heap中
    String s3 = new String("abc");
    String s4 = new String("abc");
    System.out.println(s3 == s4); // false  两个对象都在heap中,地址不同

    //heap中的对象和pool中的对象不是同一个
    System.out.println(s2 == s3); // false

2、intern()方法

官方解释:

民间解释:

当intern方法执行时,如果pool中已经存在一个和当前对象相同的字符串,就返回pool中的那个,否则,将当前对象添加到pool中并返回。

返回值:一个和当前对象相同的字符串,但保证取自具有唯一字符串的池。

    String s5 = "abc";
    String s6 = new String("abc");
    System.out.println(s6.intern() == s5); // true  s6.intern()取自pool

3、拼接

字符串直接拼接会放入常量池中,只创建一个拼接后对象。通过变量拼接,会调用StringBuilder的append方法进行拼接,返回对象为new String()。

    String s1 = "a";
    String s2 = "ab";
    String s3 = "a" + "b";
    String s4 = s1 + "b";
    System.out.println(s2 == s3); // true
    System.out.println(s2 == s4); // false
    System.out.println(s3 == s4); // false

4、问题:

下面的代码创建了几个对象:

String s = "a" + "b" + "c"; // 1个 在常量池中,编译时已经合并
String s = new String("abc"); // 2个,常量池中一个,堆中一个
<新手上路>

点赞
收藏
评论区
推荐文章
阿里最新面试必备项之Java的String类,持续更新中!
最新腾讯面试必备项之Java的String类,持续更新中!1.1String的特性String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。String是一个final类,代表不可变的字符序列。String字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改。String对象的找字符内容是存储在一个
Wesley13 Wesley13
3年前
java的内存机制
Java把内存划分成两种:一种是栈内存,另一种是堆内存。 Heap(堆)Stack(栈)JVM中的功能内存数据区内存指令区存储数据对象实例基本数据类型,指令代码,常量,对象的引用地址堆中存储数据堆内存用来存放由new创建的对象和数组。 保存对象实例,实际上是保存对象实例的属性值,属性的类型和
Wesley13 Wesley13
3年前
java中stringBuilder的用法
String对象是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循
九路 九路
4年前
2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢?程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢?一对象创建的步骤1遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用2如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过3如果没有加载过,则执行类加载过程
Easter79 Easter79
3年前
String 和 new String()的区别
String和newString()的区别ForExampleStringstr1"ABC"Stringstr2newString("ABC");Stringstr1"ABC";可能创建一个对象或者不创建对象。如果"ABC"这个字符串z在javaString池中不存在,会在javaString池中
Wesley13 Wesley13
3年前
Java中有趣的String、StringBuffer与StringBuilder
String介绍  String类属于java.lang包中,String类是不可变类,任何对String的改变都会引发新的String对象的生成。  创建String的两种方式:  1.通过构造器创建:StringstrnewString("Iamastring.");2.通过变量赋值:String
Wesley13 Wesley13
3年前
Java学习:字符串概述与特点
字符串概述与特点java.lang.String类代表字符串API当中说:Java程序中的所有字符串字面值(如“abc“)都作为此类的实例实现。其实就是说:程序当中所用的双引号字符串,都是String类的对象。(就算没有new,也照样是。)字符串的特点1.字符串的内容永远不可改变。【重点】
Wesley13 Wesley13
3年前
5.48 正则表达式的概述和基本使用
import java.util.Scanner;public class RegexDemo {public static void main(String args) {// 创建键盘录入对象Scanner sc  new Scanner(System.in);Sys
Stella981 Stella981
3年前
Clone
Java中对象的创建clone顾名思义就是复制,在Java语言中,clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1使用new操作符创建一个对象2使用clone方法复制一个对象那么这两种方
Wesley13 Wesley13
3年前
JS创建对象模式7种方法详解
创建对象的几种模式虽然Object构造函数或者字面量,都可以用来创建对象,但这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的代码,于是,工厂模式诞生了1工厂模式工厂模式是广为人知的设计模式,抽象了创建具体对象的过程。在ES6的Class创建类之前,是无法创建类的,开发人员就发明了一种函数,用函数来封
Wesley13 Wesley13
3年前
C++ 常用设计模式(学习笔记)
设计模式1、工厂模式在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。1.1、简单工厂模式主要特点是需要在工厂类中做判断,从而创造相应的产品,当
涡旋
涡旋
Lv1
万竹扫天青欲雨,一峰受月白成霜。
文章
4
粉丝
0
获赞
0