文章目录
String类(字符串)和字符串常量池
一、String类的概述
什么是字符串
字符串是由多个字符组成的一串数据(字符序列)字符串可以看成是字符数组
JDK提供API可知:
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequenceString类表示字符串。
Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
字符串是不变的; 它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,所以可以共享它们。 例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
- 字符串字面值为“abc”可以看做为 字符数组或字符串对象
- 字符串为常量,一旦被创建不能被修改
常见的构造方法
public String():空构造
public String(byte[] bytes):把字节数组转成字符串
public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串(index:表示的是从第几个索引开始, length表示的是长度)
public String(char[] value):把字符数组转成字符串
public String(char[] value,int index,int count):把字符数组的一部分转成字符串
public String(String original):把字符串常量值转成字符串
常用的判断方法
String类的判断功能
public boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
public boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
public boolean contains(String str): 判断字符串中是否包含传递进来的字符串
public boolean startsWith(String str): 判断字符串是否以传递进来的字符串开头
public boolean endsWith(String str): 判断字符串是否以传递进来的字符串结尾
public boolean isEmpty(): 判断字符串的内容是否为空串""。
常见的获取功能
String类的获取功能
public int length(): 获取字符串的长度。
public char charAt(int index): 获取指定索引位置的字符
public int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引。
public int indexOf(String str): 返回指定字符串在此字符串中第一次出现处的索引。
public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
public int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
可以顺带提一下lastIndexOf系列
public String substring(int start): 从指定位置开始截取字符串,默认到末尾。
public String substring(int start,int end): 从指定位置开始到指定位置结束截取字符串。
常见的转换功能
String的转换功能:
public byte[] getBytes(): 把字符串转换为字节数组。
public char[] toCharArray(): 把字符串转换为字符数组。
public static String valueOf(char[] chs): 把字符数组转成字符串。
public static String valueOf(int i): 把int类型的数据转成字符串。
注意:String类的valueOf方法可以把任意类型的数据转成字符串。
public String toLowerCase(): 把字符串转成小写。
public String toUpperCase(): 把字符串转成大写。
public String concat(String str): 把字符串拼接。
常见的其他功能
String的替换功能
public String replace(char old,char new) 将指定字符进行互换
public String replace(String old,String new) 将指定字符串进行互换
B:String的去除字符串两空格及案例演示
public String trim() 去除两端空格
C:String的按字典顺序比较两个字符串及案例演示
public int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果
如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果
如果连个字符串一摸一样 返回的就是0
public int compareToIgnoreCase(String str) 跟上面一样 只是忽略大小写的比较
String 作为参数
String作为参数时通包装类Integer一样为值传递,不改变原值
public static void main(String[] args) {
String s= "123";
Integer i = 1;
a(i);
a(s);
System.out.println(s);
System.out.println(i);
}
private static void a(Integer i) {
i = 2;
}
private static void a(String s) {
s="abc";
}
二、字符串常量池
根据String的特性:
一旦被创建就不能改变,就是因为字符串的值是在堆内存的常量池中划分空间 分配地址值的。
String的两种赋值方式
第一种是通过“字面量”赋值。
String str = "hello" ;
当.java文件编译后得到.class文件,里面包含了类的信息,其中有一块叫做字符串常量池的区域,.class常量池和内存中的常量池并不是一个东西。
“hello”会在堆中创建一个对象,同时在字符串常量池中存放一个他的引用
当主线程开始创建str变量的,虚拟机会去字符串池中找是否有equals(“Hello”)的String,如果相等 就把在字符串池中“Hello”的引用复制给str。如果找不到相等的字符串,就会在堆中新建一个对象,同 时把引用驻留在字符串常量池,再把引用赋给str
当有多个字面量赋值,无论有多少个,只要字符串值相同那么就不会新创建,都指向字符串常量池引用的那个对象
第二种是通过new关键字创建新对象
String str = new String("Hello");
当利用new关键字去创建字符串时,前面加载的过程是一样的,只是在运行时无论字符串池中有没 有与当前值相等的对象引用,都会在堆中新开辟一块内存,创建一个对象。
当new的字符串值有时,新创建对象指向字符串常量池中的引用地址
总结
- 字面量创建字符串会先在字符串池中找,看是否有相等的对象,没有的话就在堆中创建,把地址驻留在字符串池;有的话则直接用池中的引用,避免重复创建对象。
- new关键字创建时,前面的操作和字面量创建一样,只不过最后在运行时会创建一个新对 象,变量所引用的都是这个新对象的地址。