Java字符串
1. String 和StringBuilder
1.1 String
1.1.1 如何创建String对象
-方式一: String s1 = "HelloWorld"; //使用字符串常量创建字符串对象
-方式二: String s2 = new String(); //创建空字符串对象
-方式三: String s3 = new String("HelloWorld");
1.1.2 String对象的常用方法
1.1.3 ==和equals方法的区别
在Object类型中,equals()相当于==,比较的是地址,是否为同一对象。 String类对equals方法进行了重写,比较的是所指向的对象的内容是否相等。
1.1.4 String方法应用
- length()
String str="JAVA Hello World"; //打印输出字符串的长度 System.out.println("字符串的长度是:"+str.length());
- charAt(int index)
String str="JAVA Hello World"; //打印输出字符串中第7个字符 System.out.println(str.charAt(6));
提醒:charAt方法的参数最大值是字符串str的长度-1,超过长度范围会发生运行时异常。 3. substring(int beginIndex)
String str="JAVA Hello World";
//打印输出字符串,从第6个字符开始
System.out.println(str.substring(5));
- substring(int beginIndex,int endIndex)
String str="JAVA Hello World"; //打印输出字符串,从第6个字符开始到第7个字符【第一个参数与第二个参数是左闭右开区间】 System.out.println(str.substring(5,7));
- indexOf()
String str="JAVA Hello World Hello"; //查找字符'A'在字符串中第一次出现的位置 System.out.println("字符'A'在字符串中第一次出现的位置"+str.indexOf('A')) //查找子串"Hello"在字符串中第一次出现的位置 System.out.println("子串\"Hello\"在字符串中第一次出现的位置"+str.indexOf("Hello")); //在字符串index值为8的位置开始,查找子串"Hello"第一次出现的位置 System.out.println("在字符串index值为8的位置开始,子串\"Hello\"在字符串中第一次出现的位置"+str.indexOf("Hello",8));
- lastIndexOf()
String str="JAVA Hello World Hello"; //查找字符'A'在字符串中最后一次出现的位置 System.out.println("字符'A'在字符串中最后一次出现的位置"+str.lastIndexOf('A')); //查找子串"Hello"在字符串中最后一次出现的位置 System.out.println("子串\"Hello\"在字符串中最后一次出现的位置"+str.lastIndexOf("Hello")); //在字符串index值为8的位置开始,查找子串"Hello"最后一次出现的位置 System.out.println("在字符串index值为8的位置开始,查找子串\"Hello\"最后一次出现的位置"+str.lastIndexOf("Hello",8));
【我觉得这个 lastIndexOf(String str, int fromIndex)方法充满了恶意,我以前理解是在0到设定的下标区间里找子串,不完整的就是没有,但是看了源码才发现当遇到首字母H时,则就会自动向后搜索,查看是否是Hello,如果是,则会返回下标。】
1.1.5 Stirng的不可变性
- String对象一旦被创建,则不能修改,是不可变的。
- 所谓的修改其实是创建了新的对象,所指向的内存空间不变。给字符串的对象名指向一个新的字符串,只是指向的地址变了,原本的字符串没有修改。
1.2 StringBuilder
String与StringBuilder区别在于String具有不可变性,而StringBuilder不具备。1.2.1 StringBuilder构造
- StringBuilder()不带参数,默认生成一个空字符串,同时内存中给他开辟一个可以容纳16个字符的空间;
- StringBuilder(CharSequence seq) 提供一个接口,这个接口可以等同String类去使用;
- StringBuilder(int capacity)可以指定容量的参数 ;
- StringBuilder(String str)使用频率最高。构造一个初始化为指定字符串内容的字符串构建器;
1.2.2 StringBuilder成员方法
- 许多append方法,是指在字符串末尾增加新的内容,属于一种重载方法;
- charAt方法:找某个位置字符;
- delete方法:删除字符;
- indexOf():字符或者子串第一次出现的位置;
- insert方法:在指定位置处插入一些内容,与append相似,但是可以选择位置;
- length()返回字符串的长度;
- replace()替换方法,把字符串中某个位置处字符或者子串用新的替换;
- substring()求子串方法;
- toString()方法:将StringBuilder对象转换为String类型对象;
1.2.3 StringBuilder应用场景
public class Demo { public static void main(String[] args) { //StringBuilder()不带参数,默认生成一个空字符串,同时内存中给他开辟一个可以容纳16个字符的空间; StringBuilder str1 = new StringBuilder(); //StringBuilder(String str)使用频率最高。构造一个初始化为指定字符串内容的字符串构建器; StringBuilder str2 = new StringBuilder("World"); System.out.println(str2); StringBuilder str3 = new StringBuilder("hello"); //在字符串末尾增加新的内容 str3.append(" XSC"); System.out.println(str3); //返回字符串的长度; System.out.println("字符串长度:" + str3.length()); //在指定位置处插入一些内容 str3.insert(8,"@"); //将StringBuilder对象转换为String类型对象 String str4 = str3.toString(); System.out.println(str4); // 创建一个空的StringBuilder对象 StringBuilder str5 = new StringBuilder(); // 追加字符串 str5.append("jaewkjldfxmopzdm"); // 从后往前每隔三位插入逗号 for(int i = str5.length()-3; i>0; i=i-3){ str5.insert(i,','); } // 将StringBuilder对象转换为String对象并输出 System.out.println(str5.toString()); //使用replace放法直接替换 System.out.println(str5.replace(4, 8, "ZQQ")); //使用delete直接删除 System.out.println(str5.delete(9,10)); } }
### 1.3 关于StringBuilder面试的问题
- **String 和StringBuffer的区别?**
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
- **下面语句创建了几个String Object? String s = new String("xyz")**
两个。一个对象的值是"xyz",一个对象new String("xyz")。
- **是否可以继承String类?**
String类是final类故不可以继承。
- **String 是最基本的数据类型吗?**
不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。