String类
null与""
public static void main(String[] args) {
String str1 = "abcdef";
System.out.println(str1.length());
System.out.println(str1.isEmpty());//false
String str2 = null;
System.out.println(str2.length());
System.out.println(str2.isEmpty());//空指针异常
String str3 = "";
System.out.println(str3.length());//0
System.out.println(str3.isEmpty());//true
}
}
equals
- 判断字符串是否相同
public static void main(String[] args) {
String str1 = "abcdef";
String str4 = "Abcdef";
System.out.println(str1.equals(str4));//false
System.out.println(str1.equalsIgnoreCase(str4));//true 忽略大小写
}
}
==
public class test {
public static void main(String[] args) {
String str1 = "abcdef";
String str2 = "abcdef";
System.out.println(str1 == str2);//true
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str3 == str4);//false
}
}
- 规定:只要是双引号引起来的字符串,会存在一个字符串常量池当中
- 存储逻辑:先检查内存中(字符串常量池)是否存在这个字符串。如无,存进去。如无,直接取出现有的。
查找
public static void main(String[] args) {
String str1 = "abcd";
String str2 = "ABCD";
//比较字符串的大小
System.out.println(str1.compareToIgnoreCase(str2));
char ch = str1.charAt(1);
System.out.println(ch);
int index = str1.indexOf('a',2);
System.out.println(index);
int index2 = str1.indexOf("bc");
System.out.println(index2);
String str3 = "ababcabcd";
//指定位置 从后往前找 'a'
int index3 = str3.lastIndexOf('a',4);
System.out.println(index3);
}
}
转化
public static void main(String[] args) {
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
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+1);
System.out.println(data2+1);
String str2 = "ABCD";
String str3 = str2.toLowerCase();
System.out.println(str3);//转换小写
System.out.println(str2);//不改变原来的字符串
String str1 = "abcd";
System.out.println(str1.toUpperCase());//转换大写
char[] array = str1.toCharArray();//把字符串 转为数组
System.out.println(Arrays.toString(array));
String s = String.format("%d-%d-%d", 2019, 9,14);
System.out.println(s);//格式化输出 2019-9-14
}
替换
public static void main(String[] args) {
String str = "ababc";
//字符的整体替换
String ret = str.replace('a','l');
System.out.println(ret);
//字符串的整体替换
String ret2 = str.replace("ab","kkk");
System.out.println(ret2);
//替换字符串的第一个
String ret3 = str.replaceFirst("ab","kkkk");
System.out.println(ret3);
//字符串的整体替换
String ret4 = str.replaceAll("a","ppp");
System.out.println(ret4);
}
拆分
public static void main(String[] args) {
String str = "abc\\def\\hij";// abc\def\hij
//limit 最多分为几组
String[] strings = str.split("\\\\");// \
for(String s : strings) {
System.out.println(s);
}
System.out.println("===========");
String str2 = "abc&def=hij";
String[] strings2 = str2.split("&|=");
for(String s : strings2) {
System.out.println(s);
}
}
public static void main(String[] args) {
String str = "name=zhangsan&name=lisi";
String[] strings = str.split("&");
//strings2[0]: name=zhangsan strings2[1]: name=lisi
for(String s : strings) {
//System.out.println(s);
String[] ss = s.split("=");
for(String x : ss) {
System.out.println(x);
}//forEach循环
}
}
截取
public static void main(String[] args) {
String str1 = "abcdef";
//从指定下标 开始进行截取 截取到指定位置
String str2 = str1.substring(1,3);//[1,3)
System.out.println(str2);
}
其他
public static void main3(String[] args) {
String str1 = " abc d ef ";
System.out.println(str1);
String str2 = str1.trim();
System.out.println(str2);
}
字符串的不可变性
但是可以使用反射机制获取封装内容
StringBuilder&StringBuffer
- 直接在原字符串上拼接
public static void main6(String[] args) {
StringBuilder stringBuilder = new StringBuilder("abcd");
stringBuilder.append("opk");
StringBuffer stringBuffer = new StringBuffer("abcd");
stringBuffer.append("opk");
}
String类OJ
- 字符串第一个唯一字符
class Solution{
public int firstUniqueChar(String s){
int[] count = new int[26];
for(i = 0;i < s.length();i++){
char ch = s. charAt(i);
count[ch-'a'] ++;
}//创建一个count数组记录每个字符出现的次数
//已经准备好了,再次遍历字符串
for(int i = 0;i < s.length();i++){
char ch = s.charAt(i);
if(count[ch-'a']==1){
return i;//ASCII码值
}//再遍历原字符串顺序对应的count
}
return -1;//没找到
}
}
-
字符串最后一个单词的长度
-
方法1:直接调用分割方法
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
String[] ss = str.spilt(" ");
int len = ss[ss.length - 1].length();
System.out.println(len);
}
}
- 方法2:lastIndexof -> subString截取 再求这个字符串的长度
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
int index = str.lastIndexOf(" ");
String ret = str.substring(index+1);
System.out.println(ret.length());
}
}
- 验证回文串
public class test2 {
public boolean isPalindrome(String s){
s = s.toLowerCase();//转化为小写
int left = 0;
int right = s.length()-1;
while(left < right){
while (left < right && !isCharacterNum(s.charAt(left))){
left++;
}
while (left < right && !isCharacterNum(s.charAt(right))){
right--;
}//判断left是合法的字符,判断right是合法的字符
if(s.charAt(left) == s.charAct(right)){
left++;
right--;
}else{
return false;
}
}
return true;
}
private boolean isCharacterNum(char c){
if(Character.isDigit(ch)||Character.isLetter(ch)){
return true;
}//判断是否为合法的字符,是否为小写
return false;
}