ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 概述 1. Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现 . 2. String类的实例是引用类型 . 3. 字符串是常量,一旦创建,不能改变. 4. 字符串本质是一个char数组 . 5. 因为String类重写了toString所以打印字符串对象的时候,显示的不是内存地址而是一个char数组 . ### 详解 ~~~ String str1 = new String("abc"); String str2 = "abc"; //虚拟机会寻找内存中是否已经存在该字符串,存在即不建立新的对象了 . System.out.println(str1 == str2); //false , 这里比较的是内存地址 System.out.println(str1.equals(str2)); //true, 这里比较的是字符串的值 . ~~~ 为什么结果不相同呢 ? ~~~ String str = new String("abc") //在这里实际上创建了两个对象,一个是String类本身对象, 还有一个就是"abc"这个对象 ,"abc"在内存中是以数组的形式存在的 . ~~~ ### String构造方法 #### byte[] 构造器 ,只有字节数组才查询编码表 ~~~ public static void main(String[] args) { byte[] bytes = {97,98,99,100}; String str = new String(bytes); System.out.println(str); } ~~~ 结果 ~~~ abcd ~~~ 如果是正数就走ascii编码表, 如果是负数,就走GBK,汉字的编码就是负数,汉字是两个字节存储的,两个字节拼出一个汉字, 如果是一个字节就是"?"号 . ### char[] 构造器 ~~~ public static void main(String[] args) { char[] ch = {'a','b','c','d'}; String str = new String(ch); System.out.println(str); } ~~~ 结果 ~~~ abcd ~~~ ### 常用方法 ~~~ length() //返回字符串长度 ~~~ ~~~ substring(起始索引,结束索引) //结束索引可以不写,返回新的字符串截取一部分,因为字符串是常量,不能改动原有的字符串 ~~~ ~~~ startsWith("xxx") //是否为指定字符串前缀开始,可以为多个 ~~~ ~~~ endsWith("xxx") //是否为指定字符串后缀结束,可以为多个 ~~~ ~~~ contains("xxx") //是否包含指定字符串 ~~~ ~~~ indexOf('x') //查找字符在字符串中第一次出现的索引, 没有返回-1 ~~~ ~~~ getBytes() //将字符串转成字节数组 ~~~ ~~~ toCharArray() //将字符串转成字符数组 ~~~ ~~~ equals("xxx") //判断字符串是否完全相等 ~~~ ~~~ equalsIgnoreCase("xxx") //判断两个字符串是否完全相等,忽略大小写 ~~~ ~~~ charAt() //根据索引拿到字符,返回的类型是char ~~~ ~~~ toUpperCase() //将字符串转成大写 ~~~ ~~~ toLowerCase() //将字符串转成小写 ~~~ ### 判断大小写和数字 这里利用了编码表 ~~~ public static void count(String str) { int upper = 0; int lower = 0; int digit = 0; for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); if(c >= 64 && c <= 90) { upper++; }else if(c >= 97 && c <=122){ lower++; }else if(c >=48 && c <= 57){ digit++; } } System.out.println("大写:"+upper+",小写:"+lower+",数字:"+digit); } ~~~