String和stringBuffered的区别

String和stringBuffered的区别

在Java中一切都是对象,对象是类的实例。
字符串“aaaa"在java中属于对象,而Java中提供了String类来创建和操纵字符串。

先理解String str =”ssss",如果在常量池中没有“ssss” 则编译器会自动创建一个“ssss”对象,在栈中会创建一个String类的引用对象str来指向常量池中的”ssss"。

补充堆,栈,常量池 的知识点

常量池用来存储 字符串常量和基本类型常量,并且有个对象共享的概念
堆 所有new xxx()构造出来的对象都放入堆中存储
栈 的优势是,存取速度比堆要快,
int a = 3; 这里的a是一个指向int类型的引用,出于追求速度的原因,就存在于栈中。另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

```java
String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true
```
上图是str1与str2同时指向了同一个常量。
```java
String str1 = "abc"; 
String str2 = "abc"; 
str1 = "bcd"; 
System.out.println(str1 + "," + str2); //bcd, abc 
System.out.println(str1==str2); //false
```
上图是str1 在常量池中找不到“bcd”,又新建了一个“bcd"对象。
**事实上,String类被设计成为不可改变(immutable)的类。如果你要改变其值,可以,但JVM在运行时根据新值悄悄创建了一个新对象,然后将这个对象的地址返回给原来类的引用。**

```java
String str1 = "abc"; 
String str2 = "abc"; 
str1 = "bcd"; 
String str3 = str1; 
System.out.println(str3); //bcd 
String str4 = "bcd"; 
System.out.println(str1 == str4); //true
```
上图中 同理 String 的 引用对象指向的都是常量池中的值

```java
String str1 = new String("abc"); 
String str2 = "abc"; 
System.out.println(str1==str2); //false 
```
首先要理解str2 这种字面值的引用 都是存放在栈中,而所有new出来的对象都是存放在堆中。
其内部工作原理就是,new String()创建了一个指定对象将其指向常量值中的”abc",然后String类的引用str1指向的是堆中的指定对象。str2直接是指向的常量池中的对象。两者指向不同,所以用str1.equal(str2)返回ture。
**这也就是有道面试题:String s = new String(“abc”);产生几个对象?答:一个或两个,如果常量池中原来没有”abc”,就是两个。**

所以在java中为了能修改字符串,优先考虑stringBuffer,减少了新建对象,从而提高运行效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值