java基础内容二——String类

java基础内容

三.String类相关

1.实例化方式

String是一种特殊的类,它有两种实例化方式:

  1. 直接赋值
String a = "123";
  1. 使用构造方法
String a = new String(123);

2.字符串的相等比较

String类比较相等不能用“==”,因为用两种实例化方式产生的字符串虽然内容相同,但是由于new会新开辟堆空间,所以两个字符串的地址不一样,所以:
“123” != new String(“123”);
如果要判断字符串相等,要使用String类提供的内部方法:equals方式来判断
语法为:

boolean result = "123".equals(a);

要特别注意的是,equals是非静态一般方法,所以空对象不能调用,会产生空指针异常。在使用时要注意将一定不为空的对象放在前面。

3.String类的匿名对象

虽然String可以直接赋值,但不代表在java中它是常量。事实上,直接书写出的字符串就是String类的一个匿名对象而已。

4.两种实例化的区别

String a = "hello Word";
String b = "hello Word";
String c = "hello Word";

这种实例化方式,在堆内存中只会有一个“hello World”的内存空间,而三个变量的栈内存有三个,相等于三个栈内存指向了同一块堆内存。
这种设计模式被称为共享设计模式,jvm底层自动维护一个对象池,每次声明变量的时候将其加入到对象池中(入池),下次使用时直接使用池中的数据。

String a = new String("hello Word");
String b = new String("hello Word");
String c = new String("hello Word");

这种实例化方式会产生三个存放的相同内容的堆内存,导致产生垃圾空间,不仅如此,这样实例化的字符串并不会主动入池,破坏了java原来的共享设计模式,一般都不会这样实例化String类。当然为了迎合有一些特殊情况,String类中提供了一个可以手动入池的方法:intern();如果不得不使用这种实例化方式,建议调用一下intern()方法将字符串入池。

5.字符串长度不可变

String a = "hello" + "world";

字符串的本质其实就是字符数组,数组本身是不能动态扩充长度的。所以,字符串的相加操作其实是产生了一个新的对象。对以上代码进行内存分析,可以知道上述代码开辟了三块堆内存:hello一块,world一块,helloworld一块,不仅如此,由于全都是用a变量接受的,所有最后只有一个栈内存a指向了helloworld。hello和world变成了没有栈内存指向垃圾。字符串加的越多,产生的垃圾也就越多。所以,字符串不宜频繁改变,如果一定要改变,需要配合其他类去完成(例如StringBuilder等)

6.String类常用方法

比较compareTo()
comparaTo()方法是String中用于比较大小的方法,由于String类实现了Comparable接口,复写了Comparable的compareTo()方法。
拆分spit方法,替换replace方法,截取subString方法等看看api文档即可

String类里有相应的方法,可以让String和字符数组以及字节数组相互转换,在io中非常有用。
下一次我们来看看:this关键字和引用传递等相关内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值