谈Java的String和char数组的关系
继承关系
1 2
| java.lang.Object java.lang.String
|
原型声明
public final class String extends Object implements Serializable, Comparable<String>, charSequence
构造方法\
1 2 3 4 5 6 7 8 9
| Stirng()
String(byte[] bytes, int ofset, int length, String charSetName)
String(byte[] bytes)
Stirng(char[] value)
String(StringBuilder builder)
|
在以上的构造方法中,我们强调String(char[] value)
\
它说明我们可以通过一个char数组来构造一个新的String字符串\
1
| String str = new String(new char[]{'a,', 'b', 'c'})
|
在Java中char数组转换为String类型的方法有二\
1)String.valueOf(char[] arr)
\
2)new String(char[] arr)
\
注意,不能直接把char数组调用toString()
方法来完成转换\
1 2 3
| char[] arr = new char[]{'a', 'e', 'i', 'o', 'u'}; String str = arr.toString(); System.out.println(str); // [C@1ee0005
|
而要把一个String类实例转换为char数组则要(只能)调用str.toCharArray()
方法(因为char数组没有所谓的构造方法,所以不能通过把String类型参数传递给char构造方法来构造一个新的char数组,但是String是一个类,所以可以)\
1
| public char[] toCharArray()
|
该方法返回一个新分配的字符数组,该数组的长度是此字符串的长度,其内容被初始化为包含这个字符串所表示的字符序列\
1 2 3 4 5
| String str = "aeiou"; char[] arr = str.toCharArray();
System.out.println(arr); System.out.println(arr.toString());
|
Java Character 类
https://www.runoob.com/java/java-character.html
Character 类用于对单个字符进行操作。
Character 类在对象中包装一个基本类型 char 的值
1 2 3 4 5 6 7
| char ch = 'a';
char uniChar = '\u039A';
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' };
|
然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情况。为了解决这个问题,Java语言为内置数据类型char提供了包装类Character类。
Character类提供了一系列方法来操纵字符。你可以使用Character的构造方法创建一个Character类对象,例如:
1
| Character ch = new Character('a');
|
在某些情况下,Java编译器会自动创建一个Character对象。
例如,将一个char类型的参数传递给需要一个Character类型参数的方法时,那么编译器会自动地将char类型参数转换为Character对象。 这种特征称为装箱,反过来称为拆箱。
1 2 3 4 5 6
| Character ch = 'a';
char c = test('x');
|
Character类的方法:
Character 构造函数自版本 9 以来被弃用。
翻译:它很少被适当的使用这个构造函数。静态工厂Character.valueOf(char)通常是一个更好的选择,因为它可能会产生更好的空间和时间性能
1 2
| Character ch = new Character('a'); Character ch = Character.valueOf('a');
|
Java String 类
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串
创建字符串最简单的方式如下:
String greeting = "菜鸟教程";
在代码中遇到字符串常量时,这里的值是 “菜鸟教程“”,编译器会使用该值创建一个 String 对象。
和其它对象一样,可以使用关键字和构造方法来创建 String 对象。
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
这里可以根据 jdk 的源码来分析。
字符串实际上就是一个 char 数组,并且内部就是封装了一个 char 数组。
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
SN(序号) |
方法描述 |
1 |
char charAt(int index) 返回指定索引处的 char 值。 |
2 |
int compareTo(Object o) 把这个字符串和另一个对象比较。 |
3 |
int compareTo(String anotherString) 按字典顺序比较两个字符串。 |
4 |
int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 |
5 |
String concat(String str) 将指定字符串连接到此字符串的结尾。 |
6 |
boolean contentEquals(StringBuffer sb) 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。 |
7 |
static String copyValueOf(char[] data) 返回指定数组中表示该字符序列的 String。 |
8 |
static String copyValueOf(char[] data, int offset, int count) 返回指定数组中表示该字符序列的 String。 |
9 |
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 |
10 |
boolean equals(Object anObject) 将此字符串与指定的对象比较。 |
11 |
boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 |
12 |
byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
13 |
byte[] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
14 |
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此字符串复制到目标字符数组。 |
15 |
int hashCode() 返回此字符串的哈希码。 |
16 |
int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 |
17 |
int indexOf(int ch, int fromIndex) 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 |
18 |
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。 |
19 |
int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。 |
20 |
String intern() 返回字符串对象的规范化表示形式。 |
21 |
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
22 |
int lastIndexOf(int ch, int fromIndex) 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 |
23 |
int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。 |
24 |
int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 |
25 |
int length() 返回此字符串的长度。 |
26 |
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。 |
27 |
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
28 |
boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。 |
29 |
String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
30 |
String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
31 |
String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
32 |
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
33 |
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
34 |
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 |
35 |
boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。 |
36 |
CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。 |
37 |
String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 |
38 |
String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 |
39 |
char[] toCharArray() 将此字符串转换为一个新的字符数组。 |
40 |
String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
41 |
String toLowerCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。 |
42 |
String toString() 返回此对象本身(它已经是一个字符串!)。 |
43 |
String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
44 |
String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。 |
45 |
String trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
46 |
static String valueOf(primitive data type x) 返回给定data type类型x参数的字符串表示形式。 |
length() 方法,length 属性和 size() 方法的区别:
- 1、length() 方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
- 2、length 属性是针对 Java 中的数组来说的,要求数组的长度可以用其 length 属性;
- 3、Java 中的 size() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!
这个例子来演示这两个方法和一个属性的用法:
String str1 = “hello world”; 和 String str3 = “hello world”; 都在编译期间生成了字面常量和符号引用,运行期间字面常量 “hello world” 被存储在运行时常量池(当然只保存了一份)。通过这种方式来将 String 对象跟引用绑定的话,JVM 执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
众所周知,通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过 new 来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。
数组
Arrays 类
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,按升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。