String类大总结

1 篇文章 0 订阅
String 这个类非常特殊,下面是它的一些特点:
1、Sring类是final类型的,不能被继承。
2、例如:String str = "abc";//这样的语句生成的也是一个字符串对象,而这里却没有用new语句。
3、字符串String是常量,它们的对象被创建之后就是不能被改变的。
例如:
String s1 = "hello";
String s2 = " world";
String s3 = s1 + s2;
s1和s2对象生成之后就不能再被修改了,修改之后的字符串实际上都是生成了一个新的对象。s3也是生成的一个新的字符串对象,是把s1和s2里面的内容拼接到一块。
4、字符串支持使用“+”来连接多个字符串。实际上是生成了一个新的字符串对象,而不是在原有字符串的基础上追加内容。
5、java会维护着一个字符串池(String Pool,[color=red]字符串池位于内存的栈中[/color])【下面讲解String两种赋值方式的实际执行流程】:
a)、String s = “aaa”;(采用字面值方式赋值)
1) 查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。
b)、String s = new String(“aaa”); (采用new方式创建对象)
1) 首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在Strng Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2) 如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s 引用,导致s指向了堆中所创建的这个”aaa“对象。


[color=red]重点:栈和堆是计算机内存的两大主要区域,java中所有new出来的对象都位于堆中。[/color]


熟悉完以上知识之后重点查看以下代码,以及打印出来的每个结果:
package com.spring;

public class ObjectTest {
public static void main(String[] args) {
Object object = new Object();
Object object2= new Object();
System.out.println(object == object2);//false
System.out.println("------------------------------");
System.out.println(object.equals(object2));//false【调用的是Object类内部的equals()方法】
System.out.println("-------------------------------");

String str = new String("aaa");
String str2 = new String("aaa");
System.out.println(str == str2);//false
System.out.println("-------------------------------");
System.out.println(str.equals(str2));//true【调用的是String类内部的equals()方法,这个方法是从父类Object里重写过来的】
System.out.println("-------------------------------");

String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3 == str4);//true
System.out.println("-------------------------------");
System.out.println(str3.equals(str4));//true【调用的是String类内部的equals()方法】
System.out.println("-------------------------------");

String str5 = new String("ccc");
String str6 = "ccc";
System.out.println(str5 == str6);//false
System.out.println("---------------------------------");

String s = "hello";
String s1 = "hel";
String s2 = "lo";
System.out.println(s == s1 + s2);//false
System.out.println("---------------------------------");
System.out.println(s == "hel" + "lo");//true
}
}



下面这些打印结果在找工作之前需要记忆

package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");//other表示如果有其他类或包下面类里面也有一个字符串常量
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");//两个常量进行拼接
System.out.print((hello == ("Hel"+lo)) + " ");//一个常量和一个变量进行拼接,就会生成一个新的字符串对象
System.out.println(hello == ("Hel"+lo).intern());//不管是常量还是变量拼接,只要调用inter()方法,一定返回的是池中的引用,而hello指向的也是字符串池中的对象,因此相等
}
}

打印结果:true true true true false true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值