前言
package com.kjxy.st;public class TestString1 {public static void main(String[] args) {String s1 = "hello";String s2 = "hello";String s3 = new String("hello");String s4 = new String("hello");System.out.println(s1 == s2);System.out.println(s1.equals(s2));System.out.println(s3 == s4);System.out.println(s3.equals(s4));}
}
运行发现
这时候我们得通过画图来了解一下
可以发现字符串生成的是放在字符串池里面的,而new出来的是放在堆里面的,都是一个个独立的对象
所以来判断两个字符串是不是一样的,不能简单的用==来进行判断,而是应该用equals进行判断
package com.kjxy.st;public class TestString2 {public static void main(String[] args) {String s = "hello";s = "world";}
}
为什么string类通常不能改变?
因为string类是final修饰的
String类常用方法
length() 返回当前字符串的长度
charAt(int index) 返回当前字符串中第index位置的字符
toUpperCase() 返回当前字符串的大写形式
toLowerCase() 返回当前字符串的小写形式
equalslgnoreCase(String str) 忽略大小写,比较两个字符串是否相同
startsWidth(String str) 判断当前字符串是否以str开头
endsWidth(String str) 判断当前字符串是否以str结尾
indexOf(String str) 返回str在当前字符串中第一次出现的位置,如果str没有在当前字符串中出现,那么返回-1
lastIndexOf(String str) 返回str在当前字符串中最后一次出现的位置,如果str没有在当前字符串中出现,那么返回-1
substring(int start) 从第start位开始截取字符串,一直截到最后
substring(int start,int end) 从第start位开始截取字符串,一直截到第end位,但不包含第end位
valueOf(参数) 可以把各种数据类型的参数转换成字符串并返回
split(String str) 该方法会返回一个String[],数组中的元素是根据str拆分得来的
1.length() 返回当前字符串的长度
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.length());}
}
2.charAt(int index) 返回当前字符串中第index位置的字符
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.length());System.out.println(s1.charAt(0));}
}
用数组循环遍历
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";for (int i = 0; i < s1.length(); i++) {System.out.println(s1.charAt(i));}}
}
3.toUpperCase() 返回当前字符串的大写形式
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.toUpperCase());}
}
4.toLowerCase() 返回当前字符串的小写形式
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s2.toLowerCase());}
}
5.equalslgnoreCase(String str) 忽略大小写,比较两个字符串是否相同
实际利用场景 (验证码大小写不敏感)
String varifyCode="er45";
String myCode ="er45";
varifyCode.toLowerCase().equals(myCode.toLowerCase());
然后判断他是否为true,如果true则是正常的,否则不正常
String varifyCode="er45";
String myCode ="er45";
System.out.println(varifyCode.equalsIgnoreCase(myCode));
可以发现是true
6.startsWidth(String str) 判断当前字符串是否以str开头
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.startsWith("how"));}
}
7.endsWidth(String str) 判断当前字符串是否以str结尾
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.endsWith("?"));}
}
8.indexOf(String str) 返回str在当前字符串中第一次出现的位置,如果str没有在当前字符串中出现,那么返回-1
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.indexOf("o"));}
}
发现应该返回的是第一次的o,结果应该是1
如果没有出现则是-1
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.indexOf("z"));}
}
9.lastIndexOf(String str) 返回str在当前字符串中最后一次出现的位置,如果str没有在当前字符串中出现,那么返回-1
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.lastIndexOf("o"));}
}
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.lastIndexOf("z"));}
}
10.substring(int start) 从第start位开始截取字符串,一直截到最后
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.substring(4));}
}
11.substring(int start,int end) 从第start位开始截取字符串,一直截到第end位,但不包含第end位
package com.kjxy.st;public class TestString3 {public static void main(String[] args) {String s1 = "how hava you been?";String s2 = "HOW HAVA YOU BEEN?";System.out.println(s1.substring(4, 10));}
}
实际运用场景
//png jpg bmp
String myFileName = "123.zip";
此时就可以用字符串截取函数进行判断,但是这里从安全的角度看还是不安全的,因为能够后缀拓展名进行绕过
String myFileName = "abc.PNG";
String extName = myFileName.substring(myFileName.lastIndexOf(".")+1);
if (extName.equalsIgnoreCase("jpg")||extName.equalsIgnoreCase("png")||extName.equalsIgnoreCase("bmp")){System.out.println("上传文件正确");
}else {System.out.println("上传文件有误,请重新上传!");
}
}
}
12.valueOf(参数) 可以把各种数据类型的参数转换成字符串并返回
Person类
package com.kjxy.st;public class Person {private String name;private int age;;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(int age, String name) {this.age = age;this.name = name;}
}
主函数类
package com.kjxy.st;public class TestString4 {public static void main(String[] args) {int i =5;double d =3.14;String s1 = String.valueOf(i);String s2 = String.valueOf(d);Person p = new Person(20,"张飞");String s3 =String.valueOf(p);System.out.println(s1);System.out.println(s2);System.out.println(s3);}
}
然后运行发现其实是调用了toString方法
为了验证我们的正确性,我们开始可以查看其api文档,发现它确实调用了toString方法
tips
//正则表达式// [0-8][a-z]@[^0-9][a-z].[a-z*]
13.split(String str) 该方法会返回一个String[],数组中的元素是根据str拆分得来的
package com.kjxy.st;public class TestString5 {public static void main(String[] args) {String s = "wer-234g-hhj8-12cc";String []arr =s.split("-");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
实际运用场景
//张三-25-老师
//李四-20-清洁工
//中国-哪吒-666
然后就可以进行 拆分了