一、认识String类
1、创建字符串
//直接赋值法
String str = "Hello world!";
//通过new来创建字符串对象
String str = new String("Hello world!");
//通过char数组来创建字符串
char[] data = {'h','e','l','l','o'};
String str = new String(data);
注意:"hello world!"称为字符串字面量。字面量:直接写出来的值都被称为字面量。
2、 字符串的内存布局
String是一个引用数据类型,默认值为null。对象在堆上存储,引用在栈上存储。
String str = "hello";
String str1 = str;
3、字符串相等比较(重点)
字符串比较相等的值时使用equals方法,Java中每个类都有equals方法,它是Object自带的方法,所有类都继承Object类。equals的返回值是一个boolean值。
观察一下代码的输出:
int x = 10 ;
int y = 10 ;
System.out.println(x==y); //true
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false
为什么两个字符串内容相同,而使用 == 得到的结果不同呢?来看内存图分析:
可知:== 本身是进行数值比较的,若用于对象比较,则比较的是两个对象所保存的内存地址是否相等,而并没有比较对象的内容。若想要进行内容比较,则必须采用String类提供的equals方法:
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1.equals(str));
思考:假设现在str由用户输入。要判断str内容是否为"hello",用哪一种写法更优?
//1
Str.equals("hello");
//2
"hello".equals(str);
答:选②。equals方法是通过对象调用的,是成员方法,必须有对象才可以使用。用户输入可能为null,此时①会产生空指针异常。
4、字符串的常量池(高效)
JVM会对字符串创建一个常量池。当使用直接赋值创建字符串时,字面量是第一次出现的话,JVM会创建一个字符串对象扔入常量池中。当字面量多次出现使用时,并不会创建新的对象,而是复用已有对象。故使用字符串时,最好使用直接赋值法,避免产生垃圾空间。
5、理解字符串的不可变性(重点)
String str = "hello";
str = "world";
此时只是str的指向发生了变化,指向了新的字符串world,而对于原字符串hello没有影响。由此可见会形成大量的垃圾空间。因此我们应该尽量避免在代码中用循环对字符变量的引用不断赋值。
一下代码可以体现出字符串的不可变性:
import java.util.Arrays;
public class StringCode {
static String str = "hello";
static char[] data = {'a','b','c'};
public static void main(String[] args) {
change(str,data);
System.out.println(str);
System.out.println(Arrays.toString(data));
}
private static void change(String str, char[] data) {
str = "world";
data[0] = 'g';
}
}
6、StringBulider类
当需要大量修改字符串内容时,我们常用StringBuilder类。
StringBuilder sb = new StringBuilder("hello");
sb.append(" worle");
sb.append("!!!");
String ret = sb.toString();
System.out.println(ret);
StringBuilder具备一些String类不具备的方法(扩展)
reverse();//反转
delete(int start,int end);//删除 左闭右开
insert(int start,char[] c);//插入
7、关于字符串的一些常规操作
方法名称 | 描述 |
public boolean equals(Object anobject) | 区分大小写的比较 |
public boolean equalsIgnoreCase(String anotherString) | 不区分大小写的比较 |
public int compareTo(String anotherString) | 比较两个字符串大小关系 |
public boolean contains(CharSequence s) | 判断一个子字符串是否存在 |
public String replaceAll(String regex,String replacement) | 替换所有指定内容 |
public String replaceFirst(String regex,String replacement) | 替换首个内容 |
public String[] split(String regex) | 将字符串全部拆分 |
public String[] split(String regex,int limit) | 将字符串部分拆分,该数组长度就是limit极限 |
public String substring(int beginIndex) | 从指定索引截取到结尾 |
public String substring(int beginIndex,int endIndex) | 截取部分内容 |
public String trim() | 去掉字符串中的左右空格,保留中间空格 |
public String toUpperCase() | 字符串转大写 |
public String toLowerCase() | 字符串转小写 |
如有疑问欢迎留言~
(来自不会敲代码的卑微贝贝)