String 、StringBuffer和StringBuilder

  • String类
  • 空串与null串
  • 构造方法
  • 字符串的比较
  • String类常用的API
  • StringBuffer和StringBuilder


String类

String类表示字符串常量,是引用类型,它的底层实际上是一个char类型的不可变final数组,所以String的值一旦创建后,是不能被修改的,可以看看源码:

java中怎么判断StringBuilder有没有值_编程语言

字符串储存在字符串常量池中,可以想象将各种字符串存放在公共的存储池中。字符串变量 指向存储池中相应的位置。如果复制一个字符串变量, 原始字符串与复制的字符串共享相同 的字符。(后文介绍字符串的比较会对此有更深一步的认识)

空串与null串

空串 “” 是长度为 0 的字符串。

可以调用以下代码检查一个字符串是否为空:

if (str.lengthQ = 0)if (str.equals(""))空串是一个 Java 对象, 有自己的串长度( 0 ) 和内容(空)。

不过, String 变量还可以存 放一个特殊的值, 名为 null, 这表示目前没有任何对象与该变量关联,要检查一个字符串是否为 null, 要使用以下条件: if (str == null)

Java 有时要检查一个字符串既不是 null 也不为空串,这种情况下就需要使用以下条件:

if (str != null && str.lengthO != 0)首先要检查 str 不为 null。

构造方法

有两种构造方式:

String str = “hello”;//引用字符串常量池

String str = new String(“hello”);//在堆内存中创建对象

如果采用第一种Sring str = "hello";的方法,则会将匿名对象"hello"放入字符串常量池中,如果字符串常量池已经有"hello"对象则会直接引用池中原有的匿名对象。

如果是第二种new构造的对象,则在堆内创建一个值为"hello"的对象。

字符串的比较

比较字符串主要用equals方法,为什么不用==呢?

equals方法与==的区别

基本类型的比较只能用==,用equals无法通过编译,因为基本类型不是对象没有继承Object类。

在引用类型的比较中,==比较的只是对象的地址,而equals方法经过重写override后可以用于比较对象中包含的值,String类中已经重写了equals方法,可以用来比较String中的值,一般我们建议用equals来判断两个字符串是否相同

String的两种初始化的方式:

  1. 直接变量赋值:
public class Test {
    public static void main(String[] args) {
    String str1 = "Mike";
    String str2 = "Milk";
    }
}

在内存中如下:

java中怎么判断StringBuilder有没有值_java_02

给str1赋值时,Java在栈中开辟一个str1的空间,先在常量池中寻找是否已经有了“Mike”,若没有,开辟一个“Mike”空间,若有了“Mike”,则不开辟空间,str2也使用“Mike” 的地址

  1. 第二种方式是主动创建String类的对象
String str3 = new String("Mikey");	
    String str4 = new String("Mikey");

创建String类str3变量,在栈中开辟一个空间,创建一个String对象,在堆中新开辟一个空间

str4同理

java中怎么判断StringBuilder有没有值_java_03

==比较的是地址值

String s = "111";
String ss = "111";
String sss = "222";
String s1 = new String("333");
String s2 = new String("333");
String s3 = new String("444");
System.out.println(s==ss);//true
System.out.println(s==sss);//false
System.out.println(s1==s2);//false
System.out.println(s1==s3);//false

String类常用的API

char charAt(int index)
返回指定索引处的 char 值。

int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引。

char[] toCharArray()
将此字符串转换为一个新的字符数组。

String concat(String str)
将指定字符串连接到此字符串的结尾。

int length()
返回此字符串的长度。

String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。

boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true。

boolean isEmpty()
当且仅当 length() 为 0 时返回 true。

int compareTo(String anotherString)
按字典顺序比较两个字符串。
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。

StringBuffer和StringBuilder

在 JDK5.0 中引入 StringBuilder 类。 这个类的前身是 StringBuffer, 其效率稍有些 低, 但允许采用多线程的方式执行添加或删除字符的操作 。 如果所有字符串在一个单线 程中编辑 (通常都是这样,) , 则应该用 StringBuilder 替代它。

String类中字符串是一个常量,创建之后不可更改,每次要连接字符串,都会构建一个新的String对象,造成时间和空间上的浪费。因此我们引入StringBuilder这个对象来更加高效的执行字符串的连接操作

构造方法:

StringBuilder()
构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
StringBuilder(CharSequence seq)
构造一个字符串生成器,它包含与指定的 CharSequence 相同的字符。

用append方法来进行字符串的拼接

public static void main(String[] args) {
    StringBuilder str = new StringBuilder("hello");
    str.append(" w");
    str.append("o");
    str.append("r");
    str.append("l");
    str.append("d");
    System.out.println(str);
}
//执行结果:hello world

小结

  • 如果要操作少量的数据而且字符串拼接较少用 String;
  • 多线程操作字符串缓冲区下操作大量数据 StringBuffer;
  • 单线程操作字符串缓冲区下操作大量数据 StringBuilder