你对String字符串了解多少

  1. String str1 = "ABC";

    最多创建一个对象,最少不创建对象
    常量池已经存在"ABC",那么str1直接引用,不创建对象
    否则,先在常量池中创建"ABC"内存空间,再引用

  2. String str2 = new String("ABC");

    最多创建2个对象,最少创建一个对象
    new关键字肯定会在堆中创建内存区域,所以至少会创建一个String对象。
    如果常量池中存在"ABC"则不再创建,直接引用。否则需要创建后再引用。

  • 常量池:专门存储常量的地方,都指的是方法区中

  • 编译常量池:把字节码加载进JVM的时候,存储的是字节码的相关信息。

  • 运行常量池:存储常量数据

String对象的空值

  1. 表示引用为空(null): String str = null;没有初始化,没有分配内存空间
  2. 内容为空字符串: String str2 = "";已经初始化,分配内存空间,不过没有数据。

判断字符串非空

  1. 引用不能为空null
  2. 字符内容不能为空字符串

字符串的比较操作

  1. 使用"=="号,只能比较引用的内存地址是否相同
  2. 使用equals方法:在object类中和"=="相同,建议子类覆盖equals方法。

String类覆盖equals方法,比较的是字符串的内容。

String对象比较:

  1. 单独使用==引号创建的字符串都是直接量,编译期就已经确定存储到常量池中。

  2. 使用new String创建的对象会存储在堆内存中,是运行期才创建的

  3. 使用只包含直接量的字符串连接符如”aa”+”bb”创建的也是直接量,编译期就能确定,已经确定存储在常量池中

  4. 使用包含String直接量(无final修饰)的字符串表达式,如”aa”+s1,创建的对象是运行期才创建的,存储在堆中。

  5. 通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作,性能不高。

String常用方法

1:String的创建和转换

  • byte[] getBytes() 把字符串转换为byte数组
  • char[] toCharArray() 把字符串转换为char数组
  • String (byte[] bytes) 把byte数组转换为字符串
  • String (char[] value) 把char数组转换为字符串

2:获取字符串信息

  • int length() 返回此字符串长度
  • char charAt(int index) 返回指定索引处的char值
  • int indexOf(String str) 返回指定子字符串中第一次出现处索引
  • int lastIndexOf(String str) 返回指定字符串在此字符串中最右边出现的索引

3:字符串的比较判断

  • boolean equals(Object anObject)将此字符串与指定的对象比较
  • boolean equalsIgnoreCase(String anotherString)将此String与另一个String比较,忽略大小写
  • boolean contentEquals(CharSequence cs) 将此字符串与指定的CharSequence比较。

4:字符串大小写转换

  • String toUpperCase()
  • String toLowerCase()

String,StringBuilder和StringBuffer的区别?

String做字符串拼接更耗时,原因是String内容每次修改时都会创建新的对象,StringBuilder性能最高。
StringBuilderStringBuffer都表示可变的字符串,功能和方法都是相同的。
唯一的区别:
StringBuffer:StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全。
StringBuilder:StringBuilder中的方法没有使用synchronized修饰符,不安全,但性能较高。

String不可变

String被声明为final,因此它不可被继承。
在java8中,String内部使用char数组存储数据

public final class String
  implements java.io.Serializable, Comparable<String>, CharSequence {
  /** The value is used for character storage. */
  private final char value[];
}

不可变的好处

1.可以缓存hash值
因为String的hash值经常被使用,例如String用做HashMap中的key。不可变的特性使得hash值也不可变,因此只需要进行一次计算。

2.String Pool的需要
如果一个String对象已经被创建过了,那么就会从String Pool中取得引用,只有String是不可变的,才可能使用String Pool。

3.安全性
String经常作为参数,String不可变性保证参数不可变。例如在作为网络连接的情况下如果String是可变的,那么在网络连接过程中,String被改变,改变String对象的那一方以为现在连接的是其他主机,而实际情况却不一定是。

4.线程安全
String不可变性天生具备线程安全,可以在多个线程中安全地使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值