String 类概述
java.lang.String 类代表字符串. Java 程序中所有的字符串文字 (例如 "abc" ) 都可以被看作是实现此类的实例. 类 String 中包括用于检查各个字符串的方法, 比如用于比较字符串, 搜索字符串, 提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本.
字符串的特点:
字符串不变: 字符串的值在创建后不能被更改.
因为 String 对象是不可变的, 所以它们可以被共享.
字符串效果上相当于 char[]字符数组, 例如:"abc" 等效于 char[] data={ 'a' , 'b' , 'c' } . 但是底层原理是 byte[]数组.
查看构造方法(创建字符串对象的方式)
public String() : 初始化新创建的 String 对象, 以使其表示空字符序列.
public String(char[] value) : 通过当前参数中的字符数组来构造新的 String.
public String(byte[] bytes) : 通过使用平台的默认字符集解码当前参数中的字节数组来构造新的 String.
创建字符串对象: 直接写上字符串也是字符串实例, 例如: String s = "adc";
代码举例
- package demo01;
- /*
- java.lang.String 类代表字符串.
- API 当中说: Java 程序中的所有字符串字面值 (如 "abc" ) 都作为此类的实例实现.
- 其实就是说: 程序当中所有的双引号字符串, 都是 String 类的对象.(就算没有 new, 也照样是.)
- 字符串的特点:
- 1. 字符串的内容永不可变.[重点]
- 2. 正是因为字符串不可改变, 所以字符串是可以共享使用的.
- 3. 字符串效果上相当于是 char[]字符数组, 但是底层原理是 byte[]字节数组.
- 创建字符串的常见 3+1 种方式.
- 三种构造方法:
- public String(): 创建一个空白字符串, 不含有任何内容.
- public String(char[] array): 根据字符数组的内容, 来创建对应的字符串.
- public String(byte[] array): 根据字节数组的内容, 来创建对应的字符串.
- 一种直接创建:
- String str = "Hello"; // 右边直接用双引号
- 注意: 直接写上双引号, 就是字符串对象.
- */
- public class Demo01String {
- public static void main(String[] args) {
- // 使用空参构造
- String str1 = new String(); // 小括号留空, 说明字符串什么内容都没有.
- System.out.println("第 1 个字符串:" + str1);// 第 1 个字符串:
- // 根据字符数组创建字符串
- char[] charArray = {'A', 'B', 'C'};
- String str2 = new String(charArray);
- System.out.println("第 2 个字符串:" + str2);// 第 2 个字符串: ABC
- // 根据字节数组创建字符串
- byte[] byteArray = {97, 98, 99};
- String str3 = new String(byteArray);
- System.out.println("第 3 个字符串:" + str3);// 第 3 个字符串: abc
- // 直接创建
- String str4 = "Hello";
- System.out.println("第 4 个字符串:" + str4);// 第 4 个字符串: Hello
- }
- }
字符串常量池
双引号直接写的字符串会进入到常量池中, 通过 new 出来字符串对象不再池中. 当我们创建一个新的字符串的时候, 会首先进入常量池中进行寻找, 如果此对象存在, 则共享使用. 不在创建新的对象. 所以我们可以得出结论: 直接写的字符串可以共享使用, 而 new 一次就会创建一个新的字符串对象.
- package demo01;
- /*
- 字符串常量池: 程序当中直接写上的双引号字符串, 就在字符串常量池中.
- 对于基本类型来说,== 是进行数值的比较.
- 对于引用类型来说,== 是进行[地址值] 的比较.
- */
- public class Demo02StringPool {
- public static void main(String[] args) {
- String str1 = "abc";
- String str2 = "abc";
- char[] charArray = {'a', 'b', 'c'};
- String str3 = new String(charArray);
- System.out.println(str1 == str2); // true
- System.out.println(str1 == str3); // false
- System.out.println(str2 == str3); // false
- }
- }
字符串常用方法
判断功能的方法
public boolean equals (Object anObject) : 将此字符串与指定对象进行比较. 参数字符串与此字符串完全相同, 才会返回 true
public boolean equalsIgnoreCase (String anotherString) : 将此字符串与指定对象进行比较, 忽略大小写.
注意:
如果比较双方有常量参与, 建议常量写在前面. 例如: "a".equals(b)
参数为 Object 对象, 可以接收任何对象
- package demo02;
- /*
- == 是进行对象的地址值比较, 如果确实需要字符串的内容比较, 可以使用两个方法:
- public boolean equals(Object obj): 参数可以是任何对象, 只有参数是一个字符串并且内容相同的才会给 true; 否则返回 false.
- 注意事项:
- 1. 任何对象都能用 Object 进行接收.
- 2. equals 方法具有对称性, 也就是 a.equals(b)和 b.equals(a)效果一样.
- 3. 如果比较双方一个常量一个变量, 推荐把常量字符串写在前面.
- 推荐:"abc".equals(str) 不推荐: str.equals("abc")
- public boolean equalsIgnoreCase(String str): 忽略大小写, 进行内容比较.
- */
- public class Demo01StringEquals {
- public static void main(String[] args) {
- String str1 = "Hello";
- String str2 = "Hello";
- char[] charArray = {'H', 'e', 'l', 'l', 'o'};
- String str3 = new String(charArray);
- System.out.println(str1.equals(str2)); // true
- System.out.println(str2.equals(str3)); // true
- System.out.println(str3.equals("Hello")); // true
- System.out.println("Hello".equals(str1)); // true
- String str4 = "hello";
- System.out.println(str1.equals(str4)); // false
- String str5 = null;
- System.out.println("abc".equals(str5)); // 推荐: false
- // System.out.println(str5.equals("abc")); // 不推荐: 报错, 空指针异常 NullPointerException
- String strA = "Java";
- String strB = "java";
- System.out.println(strA.equals(strB)); // false, 严格区分大小写
- System.out.println(strA.equalsIgnoreCase(strB)); // true, 忽略大小写
- // 注意, 只有英文字母区分大小写, 其他都不区分大小写
- System.out.println("abc 一 123".equalsIgnoreCase("abc 壹 123")); // false
- }
- }
获取功能的方法:
public int length () : 返回此字符串的长度.
public String concat (String str) : 将指定的字符串连接到该字符串的末尾.
public char charAt (int index) : 返回指定索引处的 char 值.
public int indexOf (String str) : 返回指定子字符串第一次出现在该字符串内的索引.
- package demo02;
- /*
- String 当中与获取相关的常用方法有:
- public int length(): 获取字符串当中含有的字符个数, 拿到字符串长度.
- public String concat(String str): 将当前字符串和参数字符串拼接成为返回值新的字符串.
- public char charAt(int index): 获取指定索引位置的单个字符.(索引从 0 开始.)
- public int indexOf(String str): 查找参数字符串在本字符串当中首次出现的索引位置, 如果没有返回 - 1 值.
- */
- public class Demo02StringGet {
- public static void main(String[] args) {
- // 获取字符串的长度
- int length = "asdasfeutrvauevbueyvb".length();
- System.out.println("字符串的长度是:" + length);// 字符串的长度是: 21
- // 拼接字符串
- String str1 = "Hello";
- String str2 = "World";
- String str3 = str1.concat(str2);
- System.out.println(str1); // Hello
- System.out.println(str2); // World
- System.out.println(str3); // HelloWorld
- // 获取指定索引位置的单个字符
- char ch = "Hello".charAt(1);
- System.out.println("在 1 号索引位置的字符是:" + ch);// 在 1 号索引位置的字符是: e
- // 查找参数字符串在本来字符串当中出现的第一次索引位置
- // 如果根本没有, 返回 - 1 值
- String original = "HelloWorldHelloWorld";
- int index = original.indexOf("llo");
- System.out.println("第一次索引值是:" + index); // 第一次索引值是: 2
- System.out.println("HelloWorld".indexOf("abc")); // -1
- }
- }
截取功能的方法
public String substring (int beginIndex) : 返回一个子字符串, 从 beginIndex 开始截取字符串到字符串结尾.
public String substring (int beginIndex, int endIndex) : 返回一个子字符串, 从 beginIndex 到 endIndex 截取字符串. 含 beginIndex, 不含 endIndex.
- package demo02;
- /*
- 字符串的截取方法:
- public String substring(int index): 截取从参数位置一直到字符串末尾, 返回新字符串.
- public String substring(int begin, int end): 截取从 begin 开始, 一直到 end 结束, 中间的字符串.
- 备注:[begin,end), 包含左边, 不包含右边.
- */
- public class Demo03Substring {
- public static void main(String[] args) {
- String str1 = "HelloWorld";
- String str2 = str1.substring(5);
- System.out.println(str1); // HelloWorld
- System.out.println(str2); // World
- System.out.println("================");
- String str3 = str1.substring(4, 7);
- System.out.println(str3); // oWo
- System.out.println("================");
- // 下面这种写法, 字符串的内容仍然是没有改变的
- // 下面有两个字符串:"Hello","Java"
- // strA 当中保存的是地址值.
- // 本来地址值是 Hello 的 0x666,
- // 后来地址值变成了 Java 的 0x999
- String strA = "Hello";
- System.out.println(strA); // Hello
- strA = "Java";
- System.out.println(strA); // Java
- }
- }
转换功能的方法
public char[] toCharArray () : 将此字符串转换为新的字符数组.
public byte[] getBytes () : 使用平台的默认字符集将该 String 编码转换为新的字节数组.
public String replace (CharSequence target, CharSequence replacement) : 将与 target 匹配的字符串使用 replacement 字符串替换.
- package demo02;
- /*
- String 当中与转换相关的常用方法有:
- public char[] toCharArray(): 将当前字符串拆分成为字符数组作为返回值.
- public byte[] getBytes(): 获得当前字符串底层的字节数组.
- public String replace(CharSequence oldString, CharSequence newString):
- 将所有出现的老字符串替换成为新的字符串, 返回替换之后的结果新字符串.
- 备注: CharSequence 意思就是说可以接受字符串类型.
- */
- public class Demo04StringConvert {
- public static void main(String[] args) {
- // 转换成为字符数组
- char[] chars = "Hello".toCharArray();
- System.out.println(chars[0]); // H
- System.out.println(chars.length); // 5
- System.out.println("==============");
- // 转换成为字节数组
- byte[] bytes = "abc".getBytes();
- for (int i = 0; i < bytes.length; i++) {
- System.out.println(bytes[i]);
- }
- // 字符串的内容替换
- String str1 = "How do you do?";
- String str2 = str1.replace("o", "*");
- System.out.println(str1); // How do you do?
- System.out.println(str2); // H*w d* y*u d*?
- String lang1 = "会不会玩儿呀! 你大爷的! 你大爷的! 你大爷的!!!";
- String lang2 = lang1.replace("你大爷的", "****");
- System.out.println(lang2); // 会不会玩儿呀!****!****!****!!!
- }
- }
注意: CharSequence 是一个接口, 也是一种引用类型. 作为参数类型, 可以把 String 对象传递到方法中.
分割功能的方法
public String[] split(String regex) : 将此字符串按照给定的 regex(规则)拆分为字符串数组. 参数是一个正则表达式
- package demo02;
- /*
- 分割字符串的方法:
- public String[] split(String regex): 按照参数的规则, 将字符串切分成为若干部分.
- 注意事项:
- split 方法的参数其实是一个 "正则表达式", 今后学习.
- 今天要注意: 如果按照英文句点 "." 进行切分, 必须写 "\\."(两个反斜杠)
- */
- public class Demo05StringSplit {
- public static void main(String[] args) {
- String str1 = "aaa,bbb,ccc";
- String[] array1 = str1.split(",");
- for (int i = 0; i < array1.length; i++) {
- System.out.print(array1[i]);
- }
- System.out.println(" ");
- String str2 = "aaa bbb ccc";
- String[] array2 = str2.split(" ");
- for (int i = 0; i < array2.length; i++) {
- System.out.println(array2[i]);
- }
- String str3 = "XXX.YYY.ZZZ";
- String[] array3 = str3.split("\\.");
- System.out.println(array3.length);
- for (int i = 0; i < array3.length; i++) {
- System.out.println(array3[i]);
- }
- }
- }
来源: http://www.bubuko.com/infodetail-3093604.html