String类常用方法

1.创建字符串

// 方式一
String str = "Hello World";
// 方式二
String str2 = new String("Hello World");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 =new String(array);

2.字符串的比较

Java 中要想比较字符串的内容, 必须采用String类提供的equals方法.

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); 
// 执行结果
true

如果输入的字符串与特定字符串比较:

// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));

用方式二更好一些:一旦 str 是 null, 方式一的代码会抛出异常,而方式二不会

3.字符串常量池

采用直接赋值方式对对象进行实例化,例如(String str = “Hello”;),会自动将匿名对象“hello”自动放入对象池,如果下次继续使用直接赋值的方式声明String类对象,对象池之中若有指定内容,将直接引用
所以,直接赋值的String对象,如果利用相同的“Hello”,则String对象==返回true;

如果采用构造方法实例化对象,就有两个缺点:

  1. 如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间(字符串常量 “hello” 也是一个匿名对象, 用了一次之后就不再使用了, 就成为垃圾空间, 会被 JVM 自动回收掉)
  2. 字符串共享问题. 同一个字符串可能会被存储多次,浪费空间

只能采用intern()方法手动把String对象加入到字符串常量池中

// 该字符串常量并没有保存在对象池之中
String str1 = new String("hello") ; 
String str2 = "hello" ; 
System.out.println(str1 == str2); 
// 执行结果
false 
 
String str1 = new String("hello").intern() ; 
String str2 = "hello" ; 
System.out.println(str1 == str2); 
// 执行结果
true

总结:两种实例化方式的区别:

1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池不会产生垃圾

2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。

在开发的过程中不会采用构造方法进行字符串的实例化。

4.String常用方法

4.1字符与字符串转换

方法名描述
public String(char value[])将字符数组中所有内容变为字符串
public String(char value[],int offset,int count)将部分字符数组变为字符串
public char charAt(int index)取得指定索引位置的字符,索引从0开始
public char[] toCharArray()将字符串变为字符数组返回
String toLowerCase()把字符串转换为小写字符串
String toUpperCase()把字符串转换为大写字符串

4.2字符串比较

方法名描述
public boolean equals(Object another)区分大小写比较
public boolean equalsIgnoreCase(Object another)不区分大小写比较
public int compareTo(String another)比较两个字符串大小关系

compareTo() 方法返回int
相等返回0;小于返回小于0;大于返回大于0;

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1

4.3字符串获取

方法名描述
public int length()获取字符串长度
public char charAt(int index)获取指定索引处的字符
public int indexOf(String str)获取str在字符串对象中第一次出现的索引
public String substring(int start)从start开始截取字符串
String substring(int start,int end)从start开始,到end结束截取字符串。[start,end)

4.4字符串判断

方法名描述
boolean startsWith(String str)判断字符串对象是否以指定的str开头
boolean endsWith(String str)判断字符串对象是否以指定的str结尾
boolean isEmpty(String str)判空,长度为0返回true
boolean contains(子字符串序列)判断字符串是否包含指定序列

字符串替换和拆分

方法名描述
public String replaceAll(String regex,String replacement)替换所有指定内容
public String replaceFirst(String regex,String replacement替换首个内容
public Stirng[] split(String regex)将字符串按regex全部拆分

String类不可变的好处

可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。

我们的程序中大量使用了String字符串,有可能是出于安全性考虑。

大家都知道HashMap中key为String类型,如果可变将变的多么可怕。

StringBuffer和StringBuilder

任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已;因此为了方便字符串的修改,提供StringBuffer和StringBuilder类;

注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuffer:利用StringBuffer的构造方法或append()方法
  • StringBuffer变为String:调用toString()方法

代码示例:

append()

StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb);//helloworld

字符串反转

public synchronized StringBuffer reverse() 
StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.reverse()); 

删除指定范围的数据

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10)); 

String、StringBuffer、StringBuilder的区别:

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值