String
String类实现了三个接口,分别是序列化 Serializable ,自然顺序 Comparable<String>,和字符序列 CharSequence。
String类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。
因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
字符串的本质是字符数组。查看源码可以看到String类有一个char类型的数组作为成员变量,用final修饰代表字符串不可变。
在JDK9中,源码已经变为byte数组
字符串常量池
String s1 = new String(“abc”); //这句话创建了两个对象,一个是new String,一个是对象”abc”,而new String保存的就是对象”abc”的内存地址。
(new String(“abc”)调用的是String类的有参构造方法,参数是String类型的对象,此对象在字符串常量池中先创建出来,new String的时候拷贝一份到堆中,所以是两个对象)
String s2 =“abc”; //创建字符串的时候,JVM会先寻找字符串常量池中是否有这个对象,若有,则直接将变量指向这个内存地址,故s2指向了字符串常量池中已有的”abc”字符串。
堆里有一个小区域叫常量池,用来存储常量,字符串存储在字符串常量池中。
(常量池分为静态常量池和运行时常量池,静态常量池就是class文件中的,运行时常量池是JVM将class文件加载到方法区后,在方法区又开辟了一部分内存空间。在jdk8中,移除了方法区,转而用Metaspace区域替代)
String类常用方法
int length();//获取字符串长度
isEmpty();//判断字符串的内容是否为空,当且仅当length()为0时返回true
char charAt(int index) //返回字符串指定位置的字符
String trim() //去除字符串两端空格,中间的不会去除,返回一个新字符串
String toUpperCase() //将字符串转为大写
String toLowerCase() //将字符串转为小写
boolean contains(CharSequence s);//字符串中是否包含另一个字符串。如果s为null,抛出NullPointerException;如果s为空字符串,则返回true
//截取字符串
String substring(int beginIndex,int endIndex);//截取索引范围为[beginIndex,endIndex)的字符串。当beginIndex和 endIndex相同时,返回空字符串。
String substring(int beginIndex);//截取字符串,从beginIndex开始(包含beginIndex)直到末尾
//判断字符串是否以指定字符串开头或结尾
boolean startsWith(String prefix);
boolean endsWith(String suffix);
//indexOf 字符串查找方法,如果未出现指定字符或字符串,则返回-1
public int indexOf(String str);//返回指定子字符串在此字符串中第一次出现处的索引
public int indexOf(int ch);//返回指定字符第一次出现的字符串内的索引。 (ASCII转换)
public int indexOf(int ch,int fromIndex);//返回指定字符在此字符串中第一次出现处的索引,从指定的索引开始搜索
public int indexOf(String str,int fromIndex);//返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始搜索
//将字符串转成一个字符数组或字节数组
byte[] getBytes();
char[] toCharArray();
//判断两个字符串中的内容是否相同
boolean equals(Object anObject);//将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的String对象时,结果才为true。
boolean equalsIgnoreCase(String anotherString);//将此String与另一个String比较,不考虑大小写。
//字符串替换方法
String replace(char oldChar,char newChar) //替换指定字符
String replace(CharSequence target,CharSequence replacemnet) //替换指定字符串