关于java的String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java的String相关的知识,希望对你有一定的参考价值。

String a = "aaa";
String a = new String("aaa");
有什么区别? "aaa"是一个字符串常量,而new String("aaa")是一个String对象

一个是文字常量的引用,一个是字符串对象,如果
public static final String a = new String("aaa");
那么"aaa"的作用与常量a的作用是相同的,只不过"aaa"指向的字符串对象在常量存储区,而a引用在常量存储区,它所指向的对象在堆中。

"aaa"是一个文字常量的引用,
它所指向的字符串对象存储在常量存储区而且只有一个,验证方法:
如果令
String a = "aaa";
String b = "aaa";
则a == b为true,也就是a和b这两个引用指向的是同一个地址。

new String("aaa")就是一个字符串对象,
存储在堆中,可以有多个,验证方法:
如果令
String a = new String("aaa");
String b = new String("aaa");
则a == b为false,也就是说虽然两个都是new String("aaa"),但他们是两个对象,地址是不一样的,而且如果没有任何引用指向他们,他们还会被垃圾回收。
一般的字符串变量初始化最好用常量(比如"aaa"),而不是new String("aaa"),不然会增加系统的开销。
还有字符串比较的时候一定要用equals()方法,它比较的是字符串对象的内容,而非地址。
参考技术A 都是字符串,且值相同..

区别是
"aaa"是字符串常量,是放在常量池中的.

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

对于像"aaa"这样的字符串常量,java会保证在运行时,该字符串常量中只会存在一个拷贝..即
String a = "aaa";
String b = "aaa";

则a==b为true本回答被提问者采纳
参考技术B 基本没区别,只是2种不同的初始化方法而已

java所谓一切皆对象,就是把字符串也看做对象

而String a = "aaa";是为了习惯大多数程序员的一种写法
参考技术C 3楼正解

我在补充一点

基本数据类型(像int,double之类的)是放在常量池里的

String 是引用数据类型的 特殊的一种

a是放在栈里面的

new的 是放在堆里面的

a是一个引用 指向aaa的
参考技术D String a = "aaa";//创建了2个对象
String a = new String("aaa");//创建了三个对象
其它的没什么区别。

关于java中string的内存位置

java运行时内存分五部分:

  线程共享:堆内存、方法区(包括常量池)

  线程私有:栈内存、本地方法栈、程序计数器

 

string不是基本数据类型,那么一个string的内存位置是什么呢?一共有两种情况:

  1、string直接赋值:

    String s = "haha";

    s的引用存在栈内存中,引用指向的haha存在方法区的常量池中(先判断常量池中是否有一个haha,存在则直接指向)

  2、string对象new创建

    String s = new String("haha");

    s的引用存在于栈内存中,引用指向的haha对象,存在堆内存中(每new一次,在堆中创建一个新的haha对象)

 

总结:

  1、string类型的引用,都是存在栈内存中的;

  2、string引用指向,直接赋值存在栈内存,new出来的存在栈内存。

以上是关于关于java的String的主要内容,如果未能解决你的问题,请参考以下文章

关于java中String类!!!!

JAVA关于map的运用

java里关于String的编码与解码

Java—— 一点关于String的转换

关于java中string的内存位置

关于java中String的一点理解