相关阅读
1. 概述
字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组。
在实际开发中,字符串的操作是最常见的操作,没有之一。而Java没有内置的字符串类型,所以,就在Java类库中提供了一个类String 供我们来使用。String 类代表字符串。
2. String类的特点
- 字符串是常量,它的值在创建之后不能更改
- Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
- 字符串如果是变量相加,先开空间,在拼接。
- 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
|
|
字符串在内存中1
字符串在内存中2
String s1 = new String(“hello”);
和String s2 = “hello”;
有什么区别?
前者创建了2个或1个对象,后者创建了1个或0个对象。
|
|
字符串如果是变量相加,先开空间,再拼接。
字符串如果是常量相加,是先加,然后到字符串常量池中找,如果有就直接返回,否则就创建。
3. 常见操作方法
3.1 构造方法
方法 | 说明 |
---|---|
String() | 创建一个内容为空的字符串 |
String(byte[]) | 根据指定的字节数组创建对象 |
String(byte[],int,int) | 根据字节数组的一部分创建对象 |
String(char[]) | 根据指定的字符数组创建对象 |
String(char[],int,int) | 根据字符数组的一部分创建对象 |
String(String) | 根据指定的字符串内容创建对象 |
String(byte[] bytes, Charset charset) | 使用指定的编码构造字符串对象 |
|
|
运行结果:
|
|
3.2 判断功能
方法 | 说明 |
---|---|
equals() | 比较字符串的内容是否相等,区分大小写 |
equalsIgnoreCase() | 比较字符串的内容是否相等,忽略大小写 |
contains(String str) | 判断大字符串中是否包含小字符串 |
startsWith() | 判断字符串是否以某个字符串开头 |
endsWith() | 判断字符串是否以某个字符串结尾 |
isEmpty() | 判断字符串是否为空 |
|
|
运行结果:
|
|
3.3 获取功能
方法 | 说明 |
---|---|
length() | 获取字符串长度 |
charAt(int index) | 获取指定位置的字符 |
indexOf(int ch) | 字符第一次出现的索引 |
indexOf(String str) | 字符串第一次出现的索引 |
indexOf(int ch,int fromIndex) | 字符从指定位置后第一次出现的索引 |
indexOf(String str,int from) | 字符串从指定位置后第一次出现的索引 |
lastIndexOf() | 字符串最后一次出现的索引 |
subString(int start) | 从指定位置开始截取字符串 |
subString(int start,int end) | 截取字符串,包左不包右 |
|
|
运行结果:
|
|
3.4 转换功能
方法 | 说明 |
---|---|
getBytes() | 把字符串转成字节数组 |
getCharArray() | 把字符串转成字符数组 |
valueOf(char[] chs) | 把字符数组转成字符串 |
valueOf(int i) | 把int类型的数据转成字符串 |
toLowerCase() | 把字符串转成小写 |
toUpperCase() | 把字符串转成大写 |
concat(String str) | 字符串拼接 |
|
|
运行结果:
|
|
3.5 其他功能
方法 | 说明 |
---|---|
replace(char old,char new) | 替换字符 |
replace(String old,String new) | 替换字符串 |
trim() | 去掉字符串两端空格 |
compareTo() | 按字典顺序比较字符串 |
compareToIngnoreCase() | 按字典顺序比较字符串,忽略大小写 |
format() | 格式化字符串 |
|
|
更多关于字符串格式化的内容,请看 Java字符串格式化String.format()的使用
运行结果:
|
|
4. String类练习
4.1 把数组中的数据按照指定个格式拼接成一个字符串
|
|
4.2 字符串反转
|
|
4.3 统计大串中小串出现的次数
|
|
5. StringBuffer
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题
- StringBuffer是线程安全的可变字符序列。
- StringBuffer和String的区别?
前者长度和内容可变,后者不可变。如果使用前者做字符串的拼接,不会浪费太多的资源。
6. 常见操作方法
6.1 构造方法和获取方法
|
|
6.2 添加功能
|
|
运行结果:
|
|
6.3 删除功能
|
|
运行结果:
|
|
6.4 替换功能
|
|
运行结果:
|
|
6.5 反转功能
|
|
运行结果:
|
|
6.6 截取功能
|
|
运行结果:
|
|
7. StringBuffer类练习
7.1 String和StringBuffer的相互转换
|
|
运行结果:
|
|
7.2 把数组拼接成一个字符串
|
|
运行结果:
|
|
7.3 把字符串反转
|
|
运行结果:
|
|
7.4 判断一个字符串是否是对称字符串
|
|
运行结果:
|
|
8. String常见问题
8.1 Strings = new String(“xyz”);创建了几个String Object?二者之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。new String()每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过”xyz”,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
8.2 String和StringBuffer的区别?
String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串,而StringBuffer类表示内容可以被修改的字符串。String重写了equals()方法和hashCode()方法,而StringBuffer没有重写equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。StringBuffer更加高效。
8.3 StringBuffer与StringBuilder的区别?
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
8.4 如何把一段逗号分割的字符串转换成一个数组?
用正则表达式:String [ ] result = Str.split(“, ”) ;
8.5 Strings="a"+"b"+"c"+"d";
一共创建了多少个对象?
一个,相当于直接定义了一个”abcd”的字符串。Javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
8.6 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
8.7 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数
思路:取出字符串的每一个字符到HashMap中去找,如果不存在,则把该字符和1分别作为键和值添加到集合中,如果存在,则把该字符和值加1作为键和值添加到集合中。最后遍历集合即可得到字符的个数
8.8 如果一串字符如”aaaabbc中国1512”要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
|
|
8.9 把数组拼接成指定格式的字符串
8.10 把字符串中的字符进行排序