(java) String 字符串
前言:
本篇内容不多,单独介绍java中的字符串String,介绍了字符串的存储原理(辅助理解),以及其主要使用的方法,同时也介绍了StringBuilder可变字符序列
1. String 字符串
字符串一旦创建,就不可改变—引出常量池。
常量池概念:字符串的存储是在堆中的常量池中,当java创建一个字符串时,先到常量池寻找有没有相同的字符串,如果有,就会直接使用字符串的地址,如果没有,就在常量池中创造一个字符串。
对于常量池的理解:下面例子中的str1和str2
如果是出现了开辟新空间的情况:下面例子中的str3和str2
案例:
此处如果对使用==比较字符串有疑问,本篇最后补充了一道面试小题来解释这一点
//根据输出结果,解释原理
String str1 = "123";
String str2 = "123";
System.out.println(str2 == str1);//true 常量池
String str3 = new String("123");
System.out.println(str2 == str3);//false 新开辟空间后,使用常量池中字符串存储到新地址
String str4 = "1";
String str5 = str4 + "23";
System.out.println(str5 == str1);//false 只要使用了+连接符,就可以认为是new了一个新的字符串
String str6 = "1"+"23";//编译器ideal帮助我们合并了字符串
System.out.println(str6 == str1);//true
//经典小案例:根据常量池解释
String str2 = "aaa";
String str3 = "bbb";
str2 = str3;
str3 = "ccc";
System.out.println(str2);//bbb
//对于字符串定义时,其构造器的重载,可以输入空字符串、字符串、byte数组、char数组
String str = new String();//空字符串
String str1 = new String("hello");//hello
char[] str9 = {'A','B','C'};
String str8 = new String(str9);
System.out.println(str8);//ABC
byte[] str6 = {97,98,99};
String str7 = new String(str6);
System.out.println(str7);//abc
String提供的常用方法
String str1 = "abcdefg";
System.out.println(str1.length());//arr.length()返回字符串长度
String str1 = "拓跋焘";
System.out.println(str1.charAt(0));//arr.charAt(index)输出索引位置字符
String str1 = "abcd";//确定相等,返回布尔值,包含不区分大小写的比较
System.out.println(str1.equals("ABCD"));//false
System.out.println(str1.equalsIgnoreCase("ABCD"));//true
//补充 str.toLowerCase();转小写 str.toUpperCase();转大写
String str1 = "012345";
System.out.println(str1.substring(3));//345
System.out.println(str1.substring(3,4));//3 此处需要注意其表示意思在后索引位置之前停止(包前不包后)
//此处补充 indexOf 和lastIndexOf 找出某一部分在字符串中出现的索引位置,可能配合substring进行切割
String str1 = "11111tmd1245";
System.out.println(str1.replace("tmd","***"));//repalce替换部分字符串
String str1 = "11111tmd1245";
System.out.println(str1.contains("tmd"));//comtains确认是否包含字符串
String str1 = "张三";
System.out.println(str1.startsWith("张"));//startWith判断是否以此开头 也有endWith方法
String str1 = "今+天+天+气+真+好";
String[] str = str1.split("\\+");
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}//此处小心,因为arr.split(正则表达式)所以,对于点或者加号等有特殊含义的,可以选择先替换,或者使用转义符
2. StringBuider 可变字符序列
2.1 String/StringBuilder区别(经典面试题)
可变性:String对象创建之后即不可改变,而StringBuilder对象是可变字符序列。
StringBuilder是直接对对象本身进行操作,并没有生成新的对象,所以针对频繁改变内容的字符串,可以使用StringBuilder。
补充:曾经还出现过StringBuffer 就是StringBuilder的线程安全版本
2.2 StringBuilder常用方法
- length() 获取序列长度
- append() 追加内容
- insert() 指定位置插入内容
- delete 指位置删除字符
- replace() 指定位置删除字符
- reverse() 反转序列
- toString() 将 StringBuilder 转换为 String。
补充:经典面试小题:== 与 equals 的区别
-
对于 == 来说,其对于普通数据类型,直接比较内容,而对于引用数据类型,比较的是地址。
-
对于equals来说,其适用于引用数据类型,比较的是内容,也就是说,如果我们自定义类需要使用equals方法,自己重写equals方法,如果一定要比较普通数据类型,也要将其装箱为其所对应的引用数据类型。
补充面试题目的就是为了解释为什么前面解释String存储原理时,使用==来进行判断,而不用我们平时对字符串比较时使用equals