引言
个人主页:努力学编程'-CSDN博客
学习领域:C语言进阶,javase基础语法
每日鸡汤:爱意随风起,人生不言弃
字符串的定义:
public static void main(String[] args) {
// 使用常量串构造
String s1 = "hello bit";
System.out.println(s1);
// 直接newString对象
String s2 = new String("hello bit");
System.out.println(s1);
// 使用字符数组进行构造
char[] array = {'h','e','l','l','o','b','i','t'};
String s3 = new String(array);
System.out.println(s1);
}
String对象的比较
这里介绍四种字符串的比较方式,这四种不同的方式,有着各自不同的比较方式,这里希望大家可以把这四种都牢记下来。
1.==字符串的比较
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
// 对于基本类型变量,==比较两个变量中存储的值是否相同
System.out.println(a == b); // false
System.out.println(a == c); // true
// 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // false
System.out.println(s1 == s4); // true
}
总的来说就是==比较的是否是同一种对象的引用 ,当你new一个字符串时在堆里创建一个新的地址,所以即使两个字符串存放的内容是一致的,但是他们属于不同的地址,所以==会输出false
2.equals
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // false
}
equals在String类中,是用来比较两个字符串的内容是否相同,即只是比较字符串的内容,不管字符串的地址。
3.compareTo
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("abc");
String s4 = new String("abcdef");
System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
System.out.println(s1.compareTo(s3)); // 相同输出 0
System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}
此字符串是用来比较字符串的大小的方法,当运行结果>0时,s1>s2,当结果<0时,s1<s2.
有点类似于C语言中的strcmp字符串比较方法,可以对比记忆。
4.compareToIgnoreCase
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("ABc");
String s4 = new String("abcdef");
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}
和compareTo很像,区别是compareToIgnoreCase()比较时会忽略字母的大小写格式,只比较字符是否相等。
字符串的查找
public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); // 'b'
System.out.println(s.indexOf('c')); // 6
System.out.println(s.indexOf('c', 10)); // 15
System.out.println(s.indexOf("bbb")); // 3
System.out.println(s.indexOf("bbb", 10)); // 12
System.out.println(s.lastIndexOf('c')); // 17
System.out.println(s.lastIndexOf('c', 10)); // 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3
字符串的转化
1.数字和字符串的转化
public static void main(String[] args) {
// 数字转字符串
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("Hanmeimei", 18));
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println("=================================");
// 字符串转数字
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);
}
字符串转数字,和数字转字符是非常重要的String类方法在我们后面学习数据结构时可能会经常用到。
2.大小写转化
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
}
3.字符串转数组
public static void main(String[] args) {
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
System.out.println();
// 数组转字符串
String s2 = new String(ch);
System.out.println(s2);
}
我们经常把数组转字符串,将数组以字符串的形式打印。
字符串的替换
1.replaceAll(String regex, String replacement)
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));//这里是把字符串中的'l'全部替换为'-'
System.out.println(str.replaceFirst("l", "_"));//这里是只替换第一次出现'l',改为'-'
字符串拆分
1.split()
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}//这里就会产生四个字符串数组然后用for-each打印出来
字符串截取
1.substring(int beginIndex)
String str = "helloworld" ;
System.out.println(str.substring(5));//从索引5开始截取直到最后
System.out.println(str.substring(0, 5));//这个是左开右闭截取字符串
其他字符串操作
1.trim()
去掉字符串中的左右空格 , 保留中间空格
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");
//这里输出的是hello world
字符串的不可变性
字符串其实不能直接进行修改,当我们直接对字符串进行修改时,内存里会创建一个新的字符串,并没有在原字符串的基础上进行修改
public static void main(String[] args) {
String str=new String(abcd);
for(int i=0;i<1000;i++){
str+=i;
System.out.println(str);
//你可以思考一下,这个str会在内存里面创建多少个字符串
StringBuilder和StringBuffer
为了解决上面的问题我们使用与String相似的两个类StringBuilder和StringBuffer进行字符串的操作。这两个类来修改字符串会直接在源字符串上进行修改。
public static void main5(String[] args) {
String str="hello";
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append(str);
stringBuilder.append("world");
stringBuilder.append(1);
System.out.println(stringBuilder);
// 当然你字符串都可以在后面加int形数
String str2="hello";
StringBuilder stringBuilder1=new StringBuilder();
stringBuilder1.append(str2);
for(int i=0;i<1000;i++){
System.out.println(stringBuilder1.append(i));
// StringBuilder可以直接对字符串进行操作它的效率就要高得多
}
}