欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习笔记:字符、字符串、操纵字符串及比较字符串

程序员文章站 2024-03-22 09:45:46
...

字符、字符串、操纵字符串及比较字符串


字符

  • 保存一个字符的时候使用char
package character;
 
public class TestChar {
 
    public static void main(String[] args) {
        char c1 = 'a';
        char c2 = '1';//字符1,而非数字1
        char c3 = '中';//汉字字符
        char c4 = 'ab'; //只能放一个字符
         
    }
}

  • char对应的封装类
    • char对应的封装类是Character 
package character;
 
public class TestChar {
 
    public static void main(String[] args) {
        char c1 = 'a';
        Character c = c1; //自动装箱
        c1 = c;//自动拆箱
         
    }
}

  • Character常见方法
package character;
 
public class TestChar {
 
    public static void main(String[] args) {
         
        System.out.println(Character.isLetter('a'));//判断是否为字母
        System.out.println(Character.isDigit('a')); //判断是否为数字
        System.out.println(Character.isWhitespace(' ')); //是否是空白
        System.out.println(Character.isUpperCase('a')); //是否是大写
        System.out.println(Character.isLowerCase('a')); //是否是小写
         
        System.out.println(Character.toUpperCase('a')); //转换为大写
        System.out.println(Character.toLowerCase('A')); //转换为小写
 
        String a = 'a'; //不能够直接把一个字符转换成字符串
        String a2 = Character.toString('a'); //转换为字符串
         
    }
}

  • 常见转义
package character;
  
public class TestChar {
  
    public static void main(String[] args) {
        System.out.println("使用空格无法达到对齐的效果");
        System.out.println("abc def");
        System.out.println("ab def");
        System.out.println("a def");
          
        System.out.println("使用\\t制表符可以达到对齐的效果");
        System.out.println("abc\tdef");
        System.out.println("ab\tdef");
        System.out.println("a\tdef");
         
        System.out.println("一个\\t制表符长度是8");
        System.out.println("12345678def");
          
        System.out.println("换行符 \\n");
        System.out.println("abc\ndef");
 
        System.out.println("单引号 \\'");
        System.out.println("abc\'def");
        System.out.println("双引号 \\\"");
        System.out.println("abc\"def");
        System.out.println("反斜杠本身 \\");
        System.out.println("abc\\def");
    }
}

Java学习笔记:字符、字符串、操纵字符串及比较字符串


  • 字符串转换为字符数组
    • 通过Scanner从控制台读取字符串,然后把字符串转换为字符数组
    • 参考的转换方式:
String str = "abc123";
char[] cs = str.toCharArray(); 
  • 转换为字符数组后,筛选出控制台读取到的字符串中的大写字母和数字,并打印出来
package character;
 
import java.util.Scanner;
 
public class TestChar {
  
    public static void main(String[] args) {
        Scanner  s = new Scanner(System.in);
        String str = s.nextLine();
        char[] cs = str.toCharArray();
         
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            if(Character.isUpperCase(c) || Character.isDigit(c))
                System.out.print(c);
        }
        
    }
}

 

字符串String详解

  • 创建字符串
    • 字符串即字符的组合,在Java中,字符串是一个类,所以我们见到的字符串都是对象 
    • 常见创建字符串手段: 
      • 1. 每当有一个字面值出现的时候,虚拟机就会创建一个字符串 
      • 2. 调用String的构造方法创建一个字符串对象 
      • 3. 通过+加号进行字符串拼接也会创建新的字符串对象 
package character;
 
public class TestString {
 
    public static void main(String[] args) {
        String garen ="盖伦"; //字面值,虚拟机碰到字面值就会创建一个字符串对象
         
        String teemo = new String("提莫"); //创建了两个字符串对象
         
        char[] cs = new char[]{'崔','斯','特'};
         
        String hero = new String(cs);//  通过字符数组创建一个字符串对象
         
        String hero3 = garen + teemo;//  通过+加号进行字符串拼接
    }
}

  • final
    • String 被修饰为final,所以是不能被继承的
package character;
 
public class TestString {
 
    public static void main(String[] args) {
        MyString str = new MyString();
         
    }
     
        /*这里会报错,因为String不能被继承*/
    static class MyString extends String{
         
    }
     
}

  • immutable
    • mmutable 是指不可改变的
    • 比如创建了一个字符串对象
    • String garen ="盖伦";
    • 不可改变的具体含义是指:
      • 不能增加长度
      • 不能减少长度
      • 不能插入字符
      • 不能删除字符
      • 不能修改字符
    • 一旦创建好这个字符串,里面的内容 永远 不能改变
    • String 的表现就像是一个常量
package character;
  
public  class TestString {
  
    public static void main(String[] args) {
        String garen ="盖伦";
         
    }
}

  • 字符串格式化
    • 如果不使用字符串格式化,就需要进行字符串连接,如果变量比较多,拼接就会显得繁琐 
    • 使用字符串格式化,就可以简洁明了 
package character;
   
public class TestString {
   
    public static void main(String[] args) {
  
        String name ="盖伦";
        int kill = 8;
        String title="超神";
          
        //直接使用+进行字符串连接,编码感觉会比较繁琐,并且维护性差,易读性差
        String sentence = name+ " 在进行了连续 " + kill + " 次击杀后,获得了 " + title +" 的称号";
          
        System.out.println(sentence);
         
        //格式化字符串
        //%s表示字符串,%d表示数字,%n表示换行
        String sentenceFormat ="%s 在进行了连续 %d 次击杀后,获得了 %s 的称号%n";
         
        String sentence2 = String.format(sentenceFormat, name,kill,title);
         
        System.out.println(sentence2);
         
    }
}

  • 字符串长度
    • length方法返回当前字符串的长度
    • 可以有长度为0的字符串,即空字符串
package character;
   
public class TestString {
   
    public static void main(String[] args) {
  
        String name ="盖伦";
         
        System.out.println(name.length());
         
        String unknowHero = "";
         
        //可以有长度为0的字符串,即空字符串
        System.out.println(unknowHero.length());
          
    }
}

  • 字符串数组排序
创建一个长度是8的字符串数组
使用8个长度是5的随机字符串初始化这个数组
对这个数组进行排序,按照每个字符串的首字母排序(无视大小写)

注1: 不能使用Arrays.sort() 要自己写
注2: 无视大小写,即 Axxxx 和 axxxxx 没有先后顺序
  • 比较逻辑是每个字符串的第一个字符,并且都转换为小写,从而达到无视大小写的效果
package character;
 
import java.util.Arrays;
 
public class TestString {
 
    public static void main(String[] args) {
 
        String[] ss = new String[8];
        for (int i = 0; i < ss.length; i++) {
            String randomString = randomString(5);
            ss[i] = randomString;
        }
        System.out.println("未排序前的字符串数组:");
        System.out.println(Arrays.toString(ss));
 
        for (int j = 0; j < ss.length; j++) {
            for (int i = 0; i < ss.length - j - 1; i++) {
                char firstChar1 = ss[i].charAt(0);
                char firstChar2 = ss[i + 1].charAt(0);
                firstChar1 = Character.toLowerCase(firstChar1);
                firstChar2 = Character.toLowerCase(firstChar2);
 
                if (firstChar1 > firstChar2) {
                    String temp = ss[i];
                    ss[i] = ss[i + 1];
                    ss[i + 1] = temp;
                }
            }
        }
 
        System.out.println("排序后的字符串数组:");
        System.out.println(Arrays.toString(ss));
 
    }
 
    private static String randomString(int length) {
        String pool = "";
        for (short i = '0'; i <= '9'; i++) {
            pool += (char) i;
        }
        for (short i = 'a'; i <= 'z'; i++) {
            pool += (char) i;
        }
        for (short i = 'A'; i <= 'Z'; i++) {
            pool += (char) i;
        }
        char cs[] = new char[length];
        for (int i = 0; i < cs.length; i++) {
            int index = (int) (Math.random() * pool.length());
            cs[i] = pool.charAt(index);
        }
        String result = new String(cs);
        return result;
    }
}

 

操纵字符串

  • 获取字符
    • charAt(int index)获取指定位置的字符
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号";
         
        char c = sentence.charAt(0);
         
        System.out.println(c);
           
    }
}

  • 获取对应的字符数组
    • toCharArray()获取对应的字符数组
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号";
 
        char[] cs = sentence.toCharArray(); //获取对应的字符数组
         
        System.out.println(sentence.length() == cs.length);
         
    }
}

  • 截取子字符串
    • subString 截取子字符串
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号";
         
        //截取从第3个开始的字符串 (基0)
        String subString1 = sentence.substring(3);
         
        System.out.println(subString1);
         
        //截取从第3个开始的字符串 (基0)
        //到5-1的位置的字符串
        //左闭右开
        String subString2 = sentence.substring(3,5);
         
        System.out.println(subString2);
         
    }
}

  • 分隔
    • split 根据分隔符进行分隔
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "盖伦,在进行了连续8次击杀后,获得了 超神 的称号";
         
        //根据,进行分割,得到3个子字符串
        String subSentences[] = sentence.split(",");
        for (String sub : subSentences) {
            System.out.println(sub);
        }
           
    }
}

  • 去掉首尾空格
    • trim 去掉首尾空格
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "        盖伦,在进行了连续8次击杀后,获得了 超神 的称号      ";
         
        System.out.println(sentence);
        //去掉首尾空格
        System.out.println(sentence.trim());
    }
}

  • 大小写
    • toLowerCase 全部变成小写 ,toUpperCase 全部变成大写
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "Garen";
         
        //全部变成小写
        System.out.println(sentence.toLowerCase());
        //全部变成大写
        System.out.println(sentence.toUpperCase());
         
    }
}

  • 定位
    • indexOf 判断字符或者子字符串出现的位置
    • contains 是否包含子字符串
package character;
     
public class TestString {
     
    public static void main(String[] args) {
    
        String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号";
  
        System.out.println(sentence.indexOf('8')); //字符第一次出现的位置
          
        System.out.println(sentence.indexOf("超神")); //字符串第一次出现的位置
          
        System.out.println(sentence.lastIndexOf("了")); //字符串最后出现的位置
          
        System.out.println(sentence.indexOf(',',5)); //从位置5开始,出现的第一次,的位置
          
        System.out.println(sentence.contains("击杀")); //是否包含字符串"击杀"
          
    }
}

  • 替换
    • replaceAll 替换所有的 
    • replaceFirst 只替换第一个
package character;
    
public class TestString {
    
    public static void main(String[] args) {
   
        String sentence = "盖伦,在进行了连续8次击杀后,获得了超神 的称号";
 
        String temp = sentence.replaceAll("击杀", "被击杀"); //替换所有的
         
        temp = temp.replaceAll("超神", "超鬼");
         
        System.out.println(temp);
         
        temp = sentence.replaceFirst(",","");//只替换第一个
         
        System.out.println(temp);
         
    }
}

  • 每个单词的首字母都转换为大写
package character;
 
public class TestString {
      
    public static void main(String[] args) {
//      给出一句英文句子: "let there be light"
//      得到一个新的字符串,每个单词的首字母都转换为大写
        String s = "let there be light";
        System.out.println(s);
        String[] words = s.split(" ");
        for (int i = 0; i < words.length; i++) {
            String word = words[i];
            char upperCaseFirstWord =Character.toUpperCase(word.charAt(0));
            String rest = word.substring(1);
            String capitalizedWord = upperCaseFirstWord + rest;
            words[i]  = capitalizedWord;
        }
        String result = "";
        for (String word : words) {
            result+= word + " ";
        }
        result= result.trim();
        System.out.println(result);
    }
}

  • 把最后一个two单词首字母大写
package character;
 
public class TestString {
 
    public static void main(String[] args) {
        // 把最后一个two单词首字母大写
        String s = "Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak";
        int index = s.lastIndexOf(" two ");
         
        char[] cs = s.toCharArray();
        cs[index +1] = Character.toUpperCase(cs[index+1]);
        String result = new String(cs);
        System.out.printf(result);
 
    }
}

 

比较字符串

  • 是否是同一个对象
    • str1和str2的内容一定是一样的! 
    • 但是,并不是同一个字符串对象
package character;
 
public class TestString {
 
    public static void main(String[] args) {
 
        String str1 = "the light";
         
        String str2 = new String(str1);
         
        //==用于判断是否是同一个字符串对象
        System.out.println( str1  ==  str2);
         
    }
 
}

  • 是否是同一个对象-特例
str1 = "the light";
str3 = "the light";
  • 一般说来,编译器每碰到一个字符串的字面值,就会创建一个新的对象
  • 所以在第6行会创建了一个新的字符串"the light"
  • 但是在第7行,编译器发现已经存在现成的"the light",那么就直接拿来使用,而没有进行重复创建
package character;
 
public class TestString {
 
    public static void main(String[] args) {
        String str1 = "the light";
        String str3 = "the light";
        System.out.println( str1  ==  str3);
    }
 
}

  • 内容是否相同
    • 使用equals进行字符串内容的比较,必须大小写一致 
    • equalsIgnoreCase忽略大小写判断内容是否一致
package character;
  
public class TestString {
  
    public static void main(String[] args) {
  
        String str1 = "the light";
          
        String str2 = new String(str1);
         
        String str3 = str1.toUpperCase();
 
        //==用于判断是否是同一个字符串对象
        System.out.println( str1  ==  str2);
         
        System.out.println(str1.equals(str2));//完全一样返回true
         
        System.out.println(str1.equals(str3));//大小写不一样,返回false
        System.out.println(str1.equalsIgnoreCase(str3));//忽略大小写的比较,返回true
         
    }
  
}

  • 是否以子字符串开始或者结束
    • startsWith  //以...开始
    • endsWith   //以...结束
package character;
  
public class TestString {
  
    public static void main(String[] args) {
        String str1 = "the light";
         
        String start = "the";
        String end = "Ight";
         
        System.out.println(str1.startsWith(start));//以...开始
        System.out.println(str1.endsWith(end));//以...结束
          
    }
  
}

  • 案例演示:
创建一个长度是100的字符串数组
使用长度是2的随机字符填充该字符串数组
统计这个字符串数组里重复的字符串有多少种
package character;
 
public class TestString {
 
    public static void main(String[] args) {
 
        String[] ss = new String[100];
        // 初始化
        for (int i = 0; i < ss.length; i++) {
            ss[i] = randomString(2);
        }
        // 打印
        for (int i = 0; i < ss.length; i++) {
            System.out.print(ss[i] + " ");
            if (19 == i % 20)
                System.out.println();
        }
 
        for (String s1 : ss) {
            int repeat = 0;
            for (String s2 : ss) {
                if (s1.equalsIgnoreCase(s2)) {
                    repeat++;
                    if (2 == repeat) {
                        // 当repeat==2的时候,就找打了一个非己的重复字符串
 
                        putIntoDuplicatedArray(s1);
                        break;
                    }
                }
            }
        }
 
        System.out.printf("总共有 %d种重复的字符串%n", pos);
        if (pos != 0) {
            System.out.println("分别是:");
            for (int i = 0; i < pos; i++) {
                System.out.print(foundDuplicated[i] + " ");
            }
        }
    }
 
    static String[] foundDuplicated = new String[100];
    static int pos;
 
    private static void putIntoDuplicatedArray(String s) {
        for (int i = 0; i < pos; i++){
            if (foundDuplicated[i].equalsIgnoreCase(s))
                return;
        }
 
        foundDuplicated[pos++] = s;
    }
 
    private static String randomString(int length) {
        String pool = "";
        for (short i = '0'; i <= '9'; i++) {
            pool += (char) i;
        }
        for (short i = 'a'; i <= 'z'; i++) {
            pool += (char) i;
        }
        for (short i = 'A'; i <= 'Z'; i++) {
            pool += (char) i;
        }
        char cs[] = new char[length];
        for (int i = 0; i < cs.length; i++) {
            int index = (int) (Math.random() * pool.length());
            cs[i] = pool.charAt(index);
        }
        String result = new String(cs);
        return result;
    }
 
}