浅谈java中String的两种赋值方式的区别

类似普通对象,通过new创建字符串对象。String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。

直接赋值。如String str = "Hello"; 首先会去缓冲池中找有没有一个"Hello"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的"Hello"

解释

l 字符串的内容是存放在方法区的字符串常量池的,没有的时候就新建一个,已经存在的时候就直接指过去。

l String str1 = “AA”,这种是直接操作字符串常量池指过去;String str2 = new String(“AA”);这种是先在堆空间开辟这个类的对象,实际上在内部还是指到了字符串常量池;

package two.string.mushroom;
public class TestTwoString
{
	public static void main(String[] args)
		{
		String str1 = "AA";
		String str2 = "AA";
		String str3 = new String("AA");
		System.out.println("str1 == str2: " + (str1 == str2));
		//它们都指向字符串常量池中的 "AA",true
		System.out.println("str1 == str3: " + (str1 == str3));
		//它们本身指向不同,false
		//String类重写了equals方法,实际上比较的是字符串的内容是否相等,true
		System.out.println("str1.equals(str3): " + (str1.equals(str3)) );
		Animal p1 = new Animal("AA",10);
		Animal p2 = new Animal("AA",12);
		//因为构造器中的方式是直接指向字符串常量池的,所以也是true
		System.out.println("p1.name == p2.name: " + (p1.name == p2.name));
	}
}
class Animal
{
	String name;
	int age;
	Animal(String name,int age)
		{
		this.name = name;
		//构造器中的方式是直接指向字符串常量池的
		this.age = age;
	}
}

测试结果

str1 == str2: true
str1 == str3: false
str1.equals(str3): true
p1.name == p2.name: true 

总结

以上就是本文关于浅谈java中String的两种赋值方式的区别的全部内容,希望对大家有所帮助。

时间: 2017-11-15

java中String类型变量的赋值问题介绍

运行下面这段代码,其结果是什么? package com.test; public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str);

JAVA中String介绍及常见面试题小结

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 深刻认识String 1)String为字符串常量:即String对象一旦创建之后该对象是不可更改的.(源码如下) String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1 == st

Java中String、StringBuffer、StringBuilder的区别介绍

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在A

浅析java中String类型中“==”与“equal”的区别

一.前言 1.1.首先很多人都知道,String中用"=="比较的是地址,用equals比较的是内容,很多人对此用的是记忆法,通过记忆来加强此的引用,但是其真正的原理其实并不难,当我们真正明白其为什么的时候,用起来也会更加灵活,更加有底气(形容得不太好,朋友别见怪): 二相关知识的准备 类型常量池 运行时常量池 字符串常量池 我们今天讨论的主题是当然是字符串常量池: 为什么在这要把另外两个常量池拿出说一下呢,首先小生我在网上或者cnds上看到很多人在争论字符串常量池是存在与方法区还是堆

JAVA中string数据类型转换详解

在JAVA中string是final类,提供字符串不可以修改,string类型在项目中经常使用,下面给大家介绍比较常用的string数据类型转换: String数据类型转换成long.int.double.float.boolean.char等七种数据类型 复制代码 代码如下: * 数据类型转换 * @author Administrator * */ public class 数据类型转换 { public static void main(String[] args) { String c=

Java中string和int的互相转换问题

int -> String int i=12345; String s=""; 核心:s=i+""; String -> int s="12345"; int i; 核心:i=Integer.parseInt(s); package com.fry.util; public class Transfer { public void stringToInt(){ String id="20171091"; int n

浅析Java中String与StringBuffer拼接的区别

学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: StringBuffer能够拼接所有的类型的值. public class Test { public static void main(String[] args) { String str1="abc"; String str2="cba"; //使用Stirng的c

java 中String和StringBuffer与StringBuilder的区别及使用方法

java 中String和StringBuffer与StringBuilder的区别及使用方法 1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a"; //假设a指向地址0x0001 a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向

java中 String和StringBuffer的区别实例详解

java中 String和StringBuffer的区别实例详解 String: 是对象不是原始类型.            为不可变对象,一旦被创建,就不能修改它的值.            对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.            String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象            它只能通过构造函数来建立,