Java中创建String的两种方式差异

我们知道创建一个String类型的变量一般有以下两种方法:

String str1 = "abcd";
String str2 = new String("abcd");

那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别?

方法1:

String a = "abcd";
String b = "abcd";

System.out.println(a == b);      // true
System.out.println(a.equals(b)); // true

解析:
用""创建的a,b两个字符串,==和equals比较返回都为true,这是因为a,b都指向了方法区的同一个字符串。所以,当同样的一个字符串用""重复创建时只在方法区创建一次。

方法2:

String c = new String("abcd");
String d = new String("abcd");

System.out.println(c == d);      // false
System.out.println(c.equals(d)); // true

解析:
用new创建的c,d两个字符串,equals为true很简单因为equals永远比较的是值,而==为false说明两个字符串的引用不一样。用new创建的字符串每次都会在JVM堆中创建,所以c,d都对应堆中的两个不同的字符串。
关于这两道题中的""和new创建的字符串在内存中的表现形式可以看下图就明白了。

原文地址:https://www.cnblogs.com/rinack/p/9735520.html

时间: 2024-10-10 00:56:52

Java中创建String的两种方式差异的相关文章

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

Java中创建线程的两种方式

1.定义实现Runnable接口的线程类,步骤如下: (1)创建实现了Runnable接口的线程类Runner: (2)重写Runnable接口的run()方法,用于定义线程的运行体:(Runnable接口只有这一个方法) (3)实例化线程类Runner: (4)创建线程实例,并将线程类Runner的实例传递给它作为构造函数的参数: (5)启动线程: 代码如下所示: 1 public class TestThread { 2 public static void main(String args

java中设置代理的两种方式

1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式.直接上代码. 2 采用设置系统属性 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import jav

【java并发】传统线程技术中创建线程的两种方式

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉. 1. 揭秘Thread中run()方法 上面我们看到这两种方式都跟run()方法有关,所以我们来看一下Thread的源码中run()方法到底都干了什么: @Override public void run()

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,

Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

Java中HashMap遍历的两种方式

第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); } 效率高,以后一定要使用此种方式! 第二种: Map map = new HashMap();

Java中线程实现的两种方式例程

1. 继承Thread package com.sunplusedu; public class JavaTest {    public static void main(String args[]){        new MyThread().start();        int i = 10;        for(i = 10; i > 0; i--){            System.out.println("in the main "+i);         

js中创建数组的两种方式

第一种方式:var  array1=new Array(); 第二种方式:var array2=[元素1,元素2,元素3...]; 解析:当只传入一个元素并且是unmber时,这个元素代表的是数组长度. 说明:在JS中有空间在未使用之前,这个空间的类型是不确定的:导致什么类型的数据都可以给其中存放.