String类有多少你不知道的事

 

String类是我们再熟悉不过的了,但是如果不深入分析,熟悉的也不过是表面的变量的定义,方法的调用,而且好多东西只是记忆不是理解。

下面小弟来初步分析分析,如果有不对的或者不全面的希望各位大神指出来,3Q

 

在这之前,我先简单的分析一下内存分配:

内存总体分为了4个部分,堆,栈,常量池和方法区

如:Student stu = new Student();

定义了一个stu引用,这个引用存在栈内存中new出来的学生对象是存放在堆内存中的,最后用这个stu引用指向堆中的学生对象。在方法中定义的局部变量也是存放在栈中

再如:public final int temp = 10;

这里的定义了一个常量temp,这个temp就存在常量池中

方法则是存放在方法区中,多个对象共享这个方法区。

 

首先String类是final修饰的,所以是不能被继承的,而String类的本质是字符数组char[],所以值是不能改变的,如果是要改变,那么提供了StringBuffer和Stringbuilder类。

 

要创建字符串,大概有4中形式:

1.String str = new String("abcd");

2.String str = "abcd";

3.String str = "ab"+"cd";

4.String str1 = "ab";

String str2 = str1+"cd";

其内存分配如下:

第一种,就是最常规的用new来创建字符串对象,为其在堆中分配内存空间。

第二种,首先在常量池中找有没有"abcd"对象,如果有那么就用引用str指向这个对象,如果没有那么先在常量池中创建这个对象,然后再用引用指向这个对象。常量池中的对象是不重复的,相同的对象只创建了一次。

第三种,编译的时候直接拼接成"abcd"放入常量池中。

第四种,是字符串和对象的拼接,分配的是堆内存。

在常量池中创建对象分配内存时在编译的时候进行的。

 

另外就是String类中方法的使用,这个查API基本都会用,这里不做分析。

 

还有几点需要注意的:

1.String str;和String str = "null";第一句只是创建了一个引用,没有创建对象,它指向null(没有对象让它指),如果调用方法则会报NullPointerException(空指针异常),而第二句是创建了一个字符串对象"null",存在常量池中,引用str指向这个对象。

2.equals方法和==。如:String str1 = new String("student");String str2 = new String("student"); str1.equals(str2);返回true,因为比较的是str1和str2的内容,都为"student",而str1==str2;返回false,比较的是内存地址,显然创建了两个对象,内存地址不一样。

3.String实例一旦生成就不能改变, 如:String str = "abc"; String str = "xyz"; 这里不是把对象"abc"变成了"xyz",而是引用指向了对象"xyz",如果不再有引用指向"abc",那么对象"abc"就会被垃圾回收器回收掉,释放其内存空间。

4.String不是常用的数据类型,虽然我们经常这样写,int temp = 10; System.out.println("临时变量为:"+temp);这里一样会输出"临时变量为:10",当字符串和非字符串实例拼接的时候,非字符串实例会继承并调用Object类中的toString()方法将其转换成字符串类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值