目录
1.字符串的构造
2.字符串对象的比较
3.字符串的查找
4.字符串转化
1.数字《--》字符串
2.大小写转换
3.字符串和数组之间
5.字符串的替换
6.字符串的拆分
7.字符串的截取
8.字符串的不可变性
9.字符串的修改
10.StringBuffer和StringBuider
11.String类oj
11.1第一个只出现一次的字符
11.2字符串最后一个单词的长度
11.3验证回文串
1.字符串的构造
public class Main{public static void main(String[] args) {String str = "hello";//区别于C语言 java当中字符串 没有以\0结尾这样的说法!//一种精简的写法System.out.println(str);System.out.println(str.length());//length是方法int[] array2 = {1,2,3,4,5};System.out.println(array2.length);//length不是方法String str2 = new String("world");System.out.println(str2);char[] array = {'a','b','c'};//传字符数组变成字符串!!!!!String str3 = new String(array);System.out.println(str3);System.out.println("===================");//搞清两个空String str1 = "";System.out.println(str1.isEmpty());//判断字符串是不是空的String str4 = null;//str4这个引用不指向任何对象//System.out.println(str4.isEmpty()); 空指针异常//在Java中""引起来的也是String类型对象System.out.println("hello".length());}
}
2.字符串对象的比较
比较两个字符串
1.==
2.equals
3compareTo
4.compareToolgnoreCase
1.2.
public class Main{public static void main(String[] args) {String str1 = new String("abcde");String str2 = new String("abcde");System.out.println(str1 == str2);//falseSystem.out.println(str1.equals(str2));//trueString str3 = "abcde";String str4 = "abcde";System.out.println(str3 == str4);//字符串常量池 有哈希表的基础}
}
==比较是否引用同一个对象
任何情况下 只要等号两边是引用类型 一定注意看此时比较的是什么?
如果要比较两个引用 所指向的对象的内容是否一致
一定重写equals方法-》为什么重写???因为不重写就会默认调用object的equals方法
我们建议自定义类型一定要重写hashcode和equals方法
3.
public class Main{public static void main(String[] args) {String str1 = "hello";String str2 = "world";//str1大于str2那么返回正数 如果不大于 返回负数 如果相同 返回0System.out.println(str1.compareTo(str2));/** 比较逻辑:* 1.如果两个字符串的长度是一样的,那么第一个不一样的字符的大小就是整个字符串的大小* 2.如果两个字符串长度不一样,那么先比较两个长度的差值个(从前往后比)* e.g.比较abcd和abfcdh 先比较abcd和abfc* 3. 在这个差值范围内,有不一样的字符就能比较出来大小* 4.但是如果都是一样的,那么就看谁长谁大*/
4.
public class Main{public static void main(String[] args) {String str1 = "Abcd";String str2 = "abcd";//忽略大小写进行比较System.out.println(str1.compareToIgnoreCase(str2));}}
3.字符串的查找
public class Main {public static void main(String[] args) {String str1 = "abcdef";//获取指定位置的字符char ch = str1.charAt(2);System.out.println(ch);//KMP算法//返回ch第一次出现的位置int index = str1.indexOf('c');System.out.println(index);int index1 = str1.indexOf("de");int index2 = str1.indexOf('c',3);//默认从后往前找String str2 = "ababcdabcdef";int index3 = str2.lastIndexOf('a',5);System.out.println(index2);}
}
4.字符串转化
1.数字《--》字符串
class Student{}
public class Main {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());//对象转字符串System.out.println(s1);System.out.println(s2);System.out.println(s3);//字符串转化成数字int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);}
}
2.大小写转换
public class Main {public static void main(String[] args) {String str1 = "hello";String ret = str1.toUpperCase();System.out.println(ret);/*在Java当中String是不可变的* hello-》HELLO-》这个转换 不是在原来的字符串上面进行转换,他是生成了一个新的对象*/String str2 = "HEllo";String ret2 = str2.toLowerCase();System.out.println(ret2);}
}
3.字符串和数组之间
public class Main {public static void main(String[] args) {//字符串转数组String str1 = "hello";char[] array = str1.toCharArray();for(int i = 0;i< array.length;i++){System.out.println(array[i]+" ");}System.out.println();//格式化String s = String.format("%d-%d-%d",1999,9,14);System.out.println(s);}
}
5.字符串的替换
public class Main {public static void main(String[] args) {String str = "ababcabcabcde";//把所有的ab替换为oooo 这个替换也是一样 不是在原来字符串的基础上进行替换 他是产生了新的对象String ret = str.replace("ab","oooo");System.out.println(ret);System.out.println("=================");String ret2 = str.replace('b','z');System.out.println(ret2);//替换从前往后遇到的第一个String ret3 = str.replaceFirst("ab","kk");System.out.println(ret3);String ret4 = str.replaceAll("ab","kk");System.out.println(ret4);}
}
6.字符串的拆分
public class Main {public static void main(String[] args) {String str = "name=zhangsan&age=10";//分割之后的结果 要存储到数组当中String[] strings = str.split("&");for(int i = 0;i < strings.length;i++){System.out.println(strings[i]);}String str2= "hello world hello bit";//分割之后的结果 要存储到数组当中String[] strings2 = str2.split(" ",2);//不是均匀分 第一个一组 后三个一组for(int i = 0;i < strings2.length;i++){System.out.println(strings[i]);}//!!!!!特殊情况 .号必须经过转义//| * +都得加上转义字符,前面加上\\String str3 = "192.168.0.0.1";String[] strings3= str.split("\\.");for(int i = 0;i < strings.length;i++){System.out.println(strings[i]);}//如果是“\” 那么就得写成“\\\\”String str4 = "192\\168\\0\\0\\1";String[] strings4 = str.split("\\\\");for(int i = 0;i < strings.length;i++){System.out.println(strings[i]);}//以多个分割线进行分割String str5 = "name=zhangsan&age=10";String[] strings5 = str.split("&|=");for(int i = 0;i < strings.length;i++){System.out.println(strings[i]);}//多次分割String str6= "name=zhangsan&age=10";String[] strings6 = str.split("&");for(int i = 0;i < strings.length;i++){String[] strings1 = strings[i].split("=");for(int j = 0;j<strings1.length;j++){System.out.println(strings1[j]);}}}
}
7.字符串的截取
public class Main {public static void main(String[] args) {String s = "abcdef";//这里如果传入的是0下标 那么默认返回原来的对象 但是如果传入的是其他对象,此时返回新的对象String ret = s.substring(1);//(1,4)==【1,4)System.out.println(ret);//bcdef//去除左右两边空格String s2 = " abc def ";System.out.println(s2);String ret1 = s2.trim();System.out.println(ret1);}
}
8.字符串的不可变性
其一:String类被final修饰,不能被继承
其二:value被private final修饰
public class Main {public static void main(String[] args) {final int[] array = {1,2,3,4};array[0] = 10;//array = new int[3]; 错的 此时认为array的指向不能发生改变}
}
类比可知value的指向不能发生改变!!!但是内容可以修改value[0] = 'g';
但是为什么还是不可变呢?
因为private证明只能在当前类使用 !
9.字符串的修改
public class Main {public static void main(String[] args) {/*String s = "hello";s+="world";System.out.println(s);*///底层原理为:String s = "hello";StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(s);stringBuilder.append("world");s = stringBuilder.toString();System.out.println(s);}
}
例题:
1.
public class Example{String str = new String("good");char[ ] ch = { 'a' , 'b' , 'c' };public static void main(String args[]){Example ex = new Example();ex.change(ex.str,ex.ch);System.out.print(ex.str + " and ");System.out.print(ex.ch);}public void change(String str,char ch[ ]){str = "test ok";ch[0] = 'g';}
}
运行结果图解:
不是所有的传引用 都是改变原来的值。具体看代码是怎么做的 有可能只改变了指向
2.
public class SystemUtil{public static boolean isAdmin(String userId){return userId.toLowerCase()=="admin";//不一样 会产生新的对象}public static void main(String[] args){System.out.println(isAdmin("Admin"));}
}
10.StringBuffer和StringBuider
public class Main {public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("abcd");//不能直接赋值 (string变Builder)stringBuilder.append(1);stringBuilder.append("po");stringBuilder.append("abcd").append(12.5);//比➕的效率高
//String是不可变的对象 StringBuilder和StringBuffer是可变的stringBuilder.setCharAt(0,'k');System.out.println(stringBuilder);stringBuilder.insert(1,"0000000000000000000");//插入System.out.println(stringBuilder);stringBuilder.reverse();//反转System.out.println(stringBuilder);String str = stringBuilder.toString();//将所有字符按照String的方式返回(Builder变string)System.out.println(str);}
}
11.String类oj
11.1第一个只出现一次的字符
import java.util.Arrays;
public class Main {public int firstUniqChar(String s) {//这里其实是用来哈西的思想int[] count = new int[26];for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);count[ch - 'a']++;}for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if(count[ch-'a']==1){return i;}}return -1;}
}
11.2字符串最后一个单词的长度
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNextLine()){String s = in.nextLine();int k = s.lastIndexOf(' ');String ret = s.substring(k+1);System.out.println(ret.length());}}
}
11.3验证回文串
import java.util.Arrays;
import java.util.Scanner;public class Main {private boolean isLegal(char ch){if(ch >= 'a'&&ch <= 'z'|| ch >='0' && ch <='9'){return true;}return false;}public boolean isPalindrome(String s){s = s.toLowerCase();int left = 0;int right = s.length()-1;while(left < right){while(left<right &&!isLegal(s.charAt(left))){left++;}while(left<right &&!isLegal(s.charAt(right))){right--;}if(s.charAt(left)!=s.charAt(right)){return false;}else{left++;right--;}}return true;}
}