一.Java基础
1.字符串和其他类型的转化
①其他类型–>字符串类型:String.valueof()
注:不要使用toString(),若是空object的话会有NullPointException
A.可以是任何类型,包括char类型数组,但要指定起始位置和长度
String.valueof(char data[],int offset,int count)
B.对于Object=null时,返回的是”null“,而不是null
②字符串类型–>其他类型
String–>double:Double.parseDouble(String s)
String–>array: char arr[]=str.toCharArray();
2.==和equals的区别
https://blog.csdn.net/weixin_45097458/article/details/98943014
3.str == null和str.length() == 0的区别
①str==null:引用是否指向任何对象
②str.length()==0:引用不为空,引用指向的对象是否为空串,既长度是否为0
③使用 str.length() == 0若是引用为空的话,会报NullPointException ,所以要str == null||str.length()结合使用来判断是否为空串
4.反转字符串算法
String string = "hello world";
String reverse = new StringBuffer(string).reverse().toString();
二.常见算法
1.kmp
A.应用:子串是否出现的某字符串中
B.难点和常考点https://blog.csdn.net/weixin_45097458/article/details/96827500
C.Template.kmp.java
2.Trie树
A.查找以“xxxx”为前缀的字符串有多少个
B.查找某个字符串是否存在/某个字符串出现了多少次
C.字符放在边上,而不放在节点上。说白了字符是决定走那个方向。体现在tireNode 并没有value,而是使用index进行判断
D.Template.TiredTree.java
3.字符串哈希–acwing841
三.字符串常量池
public static void main(String args[])
{
String s1="abc";
String s2="abc";
char arr[]= {'a','b','c'};
String s3=new String(arr);
System.out.print(s1==s2);//true
System.out.print(s1==s3);//false
System.out.print(s2==s3);//false
}
内存解析:
注意事项:
1.双引号的字符串在常量池中,new出来的字符串在heap中
2.基础数据类型的“ == ”是值的比较,引用数据类型的“ == ”是地址的比较
区分运行期和编译期的区别
在下面S1和S2都是在运行期生成的,所以并不会放到常量池中,所以二者的内存地址是不相等的
String s = "123";
String s1 = s + "abc";
String s2 = s + "abc";
System.out.println(s6==s2);//false
四.String、StringBuffer、StringBuilder的区别
1.String 是不可变的,每次对字符串的操作都产生新的String
2.StringBuilder仅仅占用一块内存,从下面代码可以看出append之后值发生变化,但内存地址没有发生变化
StringBuilder s=new StringBuilder("abc");
System.out.println(s.hashCode());//929338653
System.out.println(s);//abc
s.append("def");
System.out.println(s.hashCode());//929338653
System.out.println(s);//abcdef
A.遵循链式法则,可以append任何东西
B.StringBuilder–>String:toString,不能用String.valueOf
C.String–>StringBuilder:StringBuilder strB = new StringBuilder(s);
3.StringBuffer 相比于StringBuilder可以保证线程安全,但是速度较慢
五.String常用方法
1.字符串的遍历
for(int i=0;i<s.length();i++)
System.out.print(s.charAt(i)+" ");
2.数组的长度.length,字符串长度.length(),容器的大小.size()
3.String.substring(begin,end)<=>[begin,end)
4.split
A.对于正则表达式中的字符要进行转义,如’'要转译成“// \”
B.
A.当字符串只包含分隔符时,返回数组没有元素;
B.当字符串不包含分隔符时,返回数组只包含一个元素(该字符串本身);
C.字符串最尾部出现的分隔符可以看成不存在,不影响字符串的分隔;
D.字符串最前端出现的分隔符将分隔出一个空字符串以及剩下的部分的正常分隔;
5.大小写转换
c^32
6.判断是否是字母
return c<='a'&&c>='z' || c>='A' && 'c'<='Z';
7.寻找首次出现的下标
String str = "thinking in java";
int index = str.indexOf("in");
System.out.println(index);
//重载方法允许我们从指定位置开始查找第一次出现的位置
index = str.indexOf("in",3);
System.out.println(index);
//查找最后一次出现给定字符串的位置
index = str.lastIndexOf("in");
System.out.println(index);
8.判断是否以XX开头和以XX结尾
String str = "http://www.baidu.com";
boolean start = str.startsWith("http://");
System.out.println(start);
boolean end = str.endsWith(".com");
System.out.println(end);
9.去掉空格、回车、换行等
A.去掉首尾空格:
String.trim();
B.去掉所有空格:
String.replaceAll(" ","");
C.去掉所有的空格、回车、换行
String.replaceAll("\\s*","");