1.字符串的构造
public static void main(String[] args) {
String s1=new String("abcd");
String s2=new String("abcd");
System.out.println(s1==s2);
}
\\输出false
虽然看起来s1和s2中储存的字符串是一样的,但是他们两个并不相等。
因为字符串的构造的方式和其他的方式不用,String是引用类型,内部储存的不是字符串本身:
2. String对象的比较
2.1 ==的比较
public static void main(String[] args) {
//在基本类型的变量中==比较的是储存的值
int a=10;
int b=10;
System.out.println(a==b);
//在引用类型的变量中==比较的是引用的是否为同一个对象
String s1=new String("abcd");
String s2=new String("abcd");
System.out.println(s1==s2);
}
- String用==并不能比较其中的字符串,也可以理解为比较的是地址
2.2 是否相等:equals方法
equals是Object中的方法,而在String中重写了父类Object的equals,返回值是boolean。
public static void main(String[] args) {
String s1=new String("abcd");
String s2=new String("abcd");
//输出false
System.out.println(s1==s2);
//输出true
System.out.println(s1.equals(s2));
}
2.3 比较大小:compareTo
-
compareTo方法
public static void main(String[] args) { String s1=new String("abcd"); String s2=new String("Abcd"); String s3=new String("abcd"); String s4=new String("abcdefg"); //挨个比较,遇到不同的字符,输出字符差,输出32 System.out.println(s1.compareTo(s2)); //全部相同的,输出0 System.out.println(s1.compareTo(s3)); //把一个字符串比较完全部相同的话,输出长度差,输出-3 System.out.println(s1.compareTo(s4)); }
-
compareToIgnoreCase 方法
和上面的compareTo的方法唯一不同的就是忽略大小
public static void main(String[] args) { String s1=new String("abcd"); String s2=new String("Abcd"); String s3=new String("abcd"); String s4=new String("abcdefg"); //挨个比较,遇到不同的字符,输出字符差, //忽略大小,输出0 System.out.println(s1.compareTo(s2)); //全部相同的,输出0 System.out.println(s1.compareTo(s3)); //把一个字符串比较完全部相同的话,输出长度差,输出-3 System.out.println(s1.compareTo(s4)); }
-
2.4 字符串的查找
-
返回字符串一个位置的字符:charAt
//返回类型 方法名称 参数 //char charAt(int i) //返回在i位置的字符 public static void main(String[] args) { String s=new String("abcdefg"); //输出c System.out.println(s.charAt(2)); }
- 如果越界抛出异常
-
查找出现的位置:indexOf
//返回类型 方法名称 参数 //int indexOf( ) public static void main(String[] args) { String s=new String("abcdefg"); //1.int indexOf(int ch) //查找ch第一次出现的位置,没有的话,返回-1 int ret1=s.indexOf('c'); System.out.println(ret1);//输出2 //2.int indexOf(int ch,int fromIndex) //从fromIndex位置查找,第一次出现ch的位置 int ret2=s.indexOf('c',1); System.out.println(ret2);//输出2 //3.int indexOf(String str) //返回str第一次出现的位置,没有返回-1 String str="cde"; int ret3=s.indexOf(str); System.out.println(ret3);//输出2 //4.int indexOf(String str, intfromIndex) //从fromIndex位置查找,第一次出现字符串str的位置 String str1="cde"; int ret4=s.indexOf(str1,1); System.out.println(ret4);//输出2 }
【注意】:lastIndexOf和indexOf区别是:方向相反,是从后边开始查找,参数和indexOf一样。
2.5 大小转化
变大写:toUpperCase()
变小写:toLowerCase()
//返回类型 变量.方法名称
//String str.toLowerCase()
public static void main(String[] args) {
String str="asdfADS";
//大写转小写
System.out.println(str.toLowerCase());
//小写转大写
System.out.println(str.toUpperCase());
}
2.6 字符串转数组:toCharArray
//返回类型 变量.方法名称
//String str.toCharArray
public static void main(String[] args) {
String str="sadsa";
char []chars=str.toCharArray();
System.out.println(Arrays.toString(chars));
//输出[s, a, d, s, a]
}
2.7 字符串替换:replace
-
替换所有的:replaceAll
-
替换一个:replaceFirst
//返回类型 方法名称 参数 //String replaceAll(char old,char new) //String replaceFirst(char old,char new) public static void main(String[] args) { String str="dsafsadsaf"; String str1=str.replaceAll("a","c"); String str2=str.replaceFirst("a","z"); System.out.println(str1); //输出dscfscdscf System.out.println(str2); //输出dszfsadsaf }
2.8 拆分字符串:spilt
//返回类型 方法名称 参数
//String[] split(String str )
public static void main(String[] args) {
String str="dsa dsa dsa dsa";
//以空格来区分
String []strings =str.split(" ");
System.out.println(Arrays.toString(strings));
//输出[dsa, dsa, dsa, dsa]
}
2.9 字符串的截取: substring
//返回类型 方法名称 参数
//String substring(int begin)
//String substring(int begin,int end)
public static void main(String[] args) {
String str="dsa dsa dsa dsa";
String str1=str.substring(4);
String str2=str.substring(4,6);
System.out.println(str1);
//输出dsa dsa dsa
System.out.println(str2);
//输出ds
}
【注意】第二种截取中,采取左闭右开的方式
3. 字符串常量池
3.1 发现字符串常量池
public static void main(String[] args) {
String s1 = "asd";
String s2 = "asd";
String s3 = new String("asd");
String s4 = new String("asd");
System.out.println(s1 == s2);
//输出:ture
System.out.println(s1 == s3);
//输出:false
System.out.println(s3 == s4);
//输出:false
}
在以上代码中发现储存的值一样,但是有些相等有些不等
3.2 String对象的创建
-
直接使用字符串赋值的变量是相等的(上面的s1和s2)
所以也变相的说明两个字符串储存的位置是一样的,在字符串常量池中,不存在新的字符串,就在常量池创建一个,而接下来创建新的相同的字符串,会直接使用常量池中赋值。
-
通过new创建String类对象(上面的s1和s3、s3和s4)
new创建的对象都是新开辟了一段空间,存储数据,不储存在字符串常量池中,所以new的对象是唯一的,
-
intern方法
intern方法将创建的String对象添加到常量池中
public static void main(String[] args) { char[] chars={'a','b','c'}; String string1=new String(chars); string1.intern(); String string2="abc"; System.out.println(string2 == string1); //输出true }
4. StringBuilder和StringBuffer
4.1 为什么有StringBuilder和StringBuffer
在String字符串上述的操作中,都会new一个新的对象,在进行多次这样的操作,效率就会特别的低,所以就有修改的
4.2 StringBuilder和StringBuffer修改是在原有的基础上修改的
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("abc");
sb.replace(0,2,"x");
//String string =sb;
//返回类型是StringBuffer
String string= sb.toString();
System.out.println(sb);
//输出xc
}