MENU

String类特点分析

• November 14, 2020 • 面向对象编程

String类特点分析

String 是开发中至关重要的类

字符串比较

  1. ==
  2. equals()

先来看结果

public class Main {
    public static void main(String[] args) {
        String string1 = new String("Hello java");
        String string2 = new String("Hello java");
        System.out.println("string1 == string2 ?   " + (string1 == string2));
        System.out.println("string1.equals(string2) ?   " + (string1.equals(string2)));
    }
}

运行结果:

因为:

“==”号:比较的是地址是否相同
“equals”:单纯的比较俩字符串是不是长得一样【我们大多数情况用的是这个】


字符串常量是String类的匿名对象

程序中没有字符串常量这种基本数据类型,实质上是String类的匿名对象
使用equals方法时,字符串常量一般写在前面,可避免空指针异常


字符串常量一般写在前面

equals()方法里面提供有一个避免null方法,只要将字符串常量放在前面,任何情况下都不会出现空指针异常,因为字符串常量(匿名对象)都是开辟好了堆内存的实际对象

两种实例化方式

  • 直接赋值的实例化模式

String str = "JAVA";
如果之前没有相同的常量,就直接开辟一块堆内存和一块栈内存,同时有利于进行数据共享

String strA = "JAVA";
String strB = "JAVA";
String strC = "JAVA";

开辟了一块堆内存空间,strA、strB、strC指向同一块内存地址,他们引用的是同一个对象,实现了对象共享

  • 构造方法实例化

String str = new String("JAVA");
直接申请一块新的地址,不管之前有没有常量,不利于数据共享

String strA = new String("JAVA");
String strB = new String("JAVA");
String strC = new String("JAVA");
会开辟三块堆内存空间,StrA、StrB、StrC指向不同的地址

intern()方法:
String strA = "JAVA";
String strB = new String("JAVA").intern();

只开辟了一块空间,strA和strB都是指向同一块堆内存空间

一道面试题

String类两种对象实例化方式的区别?

  1. 直接赋值:只会产生一个实例化对象,并且可以自动保存到对象池中,以方便实现字符串实例对象的共享
  2. 构造方法赋值:会产生多个实例化对象,无法实现对象的共享,使用intern可以使其指向对象池中的堆内存

String常量池

  • 静态常量池:指的是程序在加载的时候会自动将此程序之中保存的字符串、普通的常量、类和方法信息等等,全部进行分配;
  • 运行时常量:当一个程序加载之后,里面可能有一些变量

静态池常量

String strA = "www.mldn.cn";
String strB = "www."+"mldn."+"cn";
这两个变量实际上指向的是同一块堆内存

运行时常量:

String info = "mldn";
String strA = "www.mldn.cn";
String strB = "www."+info+"cn";
此时strA和strB指向的不是同一块堆内存,info是一个变量


字符串内容不可修改

在开发中,不要频繁修改字符串内容,会产生较多垃圾,导致性能较差

Archives QR Code Tip
QR Code for this page
Tipping QR Code