Java学习笔记:字符、字符串、操纵字符串及比较字符串
程序员文章站
2024-03-22 09:45:46
...
字符、字符串、操纵字符串及比较字符串
- 学习参考网址:https://how2j.cn/p/6235
字符
- 保存一个字符的时候使用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"); } }
- 字符串转换为字符数组
- 通过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; } }
上一篇: JAVA学习笔记-04
下一篇: matlab m_map学习总结系列8