String 类的定义方式
// 方式一
String str1 = "hhh";
// 方式二
String str2 = new String("hhh");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array)
在内存中的存储方式(在jdk1.7之后常量池放在了堆中):
由于 String 是引用类型, 所以对于下面的代码,str1和str2指向的都是常量池中的"hhh".
String str1 = "hhh";
String str2 = str1;
str1 = ""hahaha";//此操作是将str1的引用重新指向"hahaha",不会改变str2。
字符串比较相等
那么字符串如何比较相等呢,先来看几段代码:
public static void main(String[] args) {
String str1 = "hhh";
String str2 = "hhh";
System.out.println(str1 == str2);//true
String str3 = new String("hhh");
System.out.println(str1 == str3);//false
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
}
运行结果分别为ture,false.
"==":比较地址
str1和str2在内存中的存储方式如上图,因为它们同时指向同一个对象,即结果为true。
str1和str3在内存中的存储方式如第一张图(字符串定义处的图),str3保存的是new String的地址,而str1保存的是"hhh"的地址,所以结果为false。
"equal":比较内容
str1,str2,str3中存放的都是"hhh",所以结果都为true。
再来放一段代码感受一下:
public static void main(String[] args) {
String str1 = "abcdef";
String str2 = new String("abcdef");
System.out.println(str1 == str2);//false
String str3 = new String("abcdef");
System.out.println(str2 == str3);//false
String str4 = "ab"+"cdef";//字符串在编译期间已经被处理为两个字符串拼接的结果。
System.out.println(str1 == str4);//true
String str5 = "ab" + new String("cdef");
System.out.println(str1 == str5);//false
System.out.println(str1.equals(str5));//true
String str6 = "ab";
String str7 = "cdef";
String str8 = str6+str7;
System.out.println(str1 == str8);// false
System.out.println(str1.equals(str8));//true
String str9 = str6+"cdef";
System.out.println(str1 == str9);//false
String str10 = "hello" + 10;//"hello10"
String str11 = "hello10";
System.out.println(str10 == str11);//true
}
从内存上分析使用String str2 = new String(“hhh”),需要引用两次,即需要开辟两块内存,而使用intern()方法手动入池,只需要开辟一块内存,在内存中的存储方式如下图:
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2); //true
字符串查找
序号 | 方法 | 描述 |
---|---|---|
1 | public boolean contains(CharSequence s) | 判断一个字符串是否存在 |
2 | public int indexOf(String str) | 从开始位置查找字符串,找到返回下标位置,找不到返回-1 |
3 | public int indexOf(String str, int fromIndex) | 从指定位置开始查找字符串,找到返回下标位置,找不到返回-1 |
4 | public int lastIndexOf(String str) | 从后往前查找字符串,找到返回下标位置,找不到返回-1 |
5 | public int lastIndexOf(String str, int fromIndex) | 从指定位置往前查找字符串,找到返回下标位置,找不到返回-1 |
6 | public boolean startsWith(String prefix) | 判断是否以字符串开头 |
7 | public boolean startsWith(String prefix, int toffset) | 判断指定位置是不是以字符串开头 |
8 | public boolean endsWith(String suffix) | 判断是否以指定字符串结尾 |
使用方式如下代码:
public static void main(String[] args) {
String str1 = "hello,world";
System.out.println(str1.contains("w"));//true contains底层调用indexOf方法。
int tmp = str1.indexOf("s");//找不到返回-1
int ret = str1.indexOf("w",2);//从2号下标开始查找
System.out.println(tmp);//-1
System.out.println(ret);//6
int tmp1 = str1.lastIndexOf("w");
int ret1 = str1.lastIndexOf("w",5);
System.out.println(tmp1);//6 从后往前查找
System.out.println(ret1);//-1 从指定位置往前查找
boolean ret3 = str1.startsWith("w");
boolean ret4 = str1.startsWith("w",6);
System.out.println(ret3);//false,判断字符串是否以“w”开头。
System.out.println(ret4);//true,判断字符串从指定位置是不是以“w”开头。
System.out.println(str1.endsWith("o"));//false,判断字符串是否以“o”结尾。
}
字符串替换
序号 | 方法 | 描述 |
---|---|---|
1 | public String replace(CharSequence target, CharSequence replacement) | 用指定字符替换原字符串中的所有字符 |
2 | public String replaceAll(String regex, String replacement) | 用指定字符串替换原字符串中的所有字符 |
3 | public String replaceFirst(String regex, String replacement) | 用指定字符串替换原字符串中第一个出现字符 |
使用方法如下:
public static void main(String[] args){
String str1 = "hello,world";
String ret = str1.replace("l","y");//用“y”替换字符串中的所有“l”
System.out.println(ret);//heyyo,woryd
String ret1 = str1.replaceAll("o","sy");//替换所有内容
System.out.println(ret1);//hellsy,wsyrld
String ret2 = str1.replaceFirst("l","s");//用“s”替换第一个出现的“l”
System.out.println(ret2);//heslo,world
}
字符串拆分
序列 | 方法 | 描述 |
---|---|---|
1 | public String[] split(String regex) | 将字符串全部拆分 |
2 | public String[] split(String regex, int limit) | 将字符串部分拆分,最大拆分为limit |
使用方法:
public static void main(String[] args){
String str1 = "hello,wor,ld";
String[] ret = str1.split(",");
for(String s: ret) {
System.out.println(s);
}
String[] ret1 = str1.split(",",2);
for(String s: ret1) {
System.out.println(s);
}
}
字符串截取
方法名称 | 描述 |
---|---|
public String substring(int beginIndex) | 从指定位置截取到结尾 |
public String substring(int beginIndex, int endIndex) | 从指定区间进行截取 |
使用方法:
public static void main(String[] args){
String str1 = "hello,world";
String ret = str1.substring(4);
System.out.println(ret);//o,world
String ret1 = str1.substring(2,6);//截取区间[2,6)
System.out.println(ret1);//llo,
}
其他用法:
public static void main(String[] args){
String str1 = " hello world ";
String ret = str1.trim();//去掉字符串左右空格,保留中间空格
System.out.println(ret);
String ret1 = ret.toUpperCase();//将字符串全部转为大写
System.out.println(ret1);
String ret2 = ret1.toLowerCase();//将字符串全部转为小写
System.out.println(ret2);
String str = ret1.concat(str1);//将字符串拼接(将str1拼接到ret1后面)
System.out.println(str);// HELLO WORLD hello world
String s = "";
boolean tmp = s.isEmpty();//判断字符串是否为空,但是不是null。
System.out.println(tmp);//true
}