前面在举例时有出现过 String 的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实 String 类是 Java 中一个比较特殊的类,字符串即 String 类,它不是 Java 的基本数据类型之一,但可以像基本数据类型一样使用,声明与初始化等操作都是相同的,是程序经常处理的对象,所以学好 String 的用法很重要.
一,创建字符串
在 Java 中用 String 类的构造方法来创建字符串变量,常用构造方法如下:
1. 使用 String() 方法初始化一个新创建的 String 对象.
String s = new String();
2. 使用 String(char a[]) 方法创建 String 对象.
char a[] = {'h','e','l','l','o';
String s = new String(a);
上述代码等价于 String s = new String("hello");
3. 使用 String(char a[], int offset, int length) 方法创建对象.
char a[] = {'s','t','u','d','e','n','t';
String s = new String(a, 2, 4);
上述代码等价于 String s = new String("uden"); .offset 表示开始截取字符串的位置(从 0 开始),length 表示截取长度.所以此例表示从数组 a 中下标为 2 的元素'u'开始截取,截取长度为 4,所以截取出的字符串为 "uden".
一般情况下也可以直接声明: String s = "We are Students";
二,字符串操作
对于已经声明的字符串,可以对其进行相应的操作.
1. 字符串连接
当连接多个字符串时,在每两个连接的字符串之间用 "+" 相连,"+" 就是字符串的连接符,连接之后生成一个新的字符串.
String s1 = new String("hello");
String s2 = new String("world");
String s = s1 + " " + s2;
这种写法在之前的例子中也出现过很多次,将 s1,空格,s2 进行连接,运行结果就是 "hello world".
当字符串和其他数据类型连接时,同样使用 "+" 连接符,连接之后的返回值是字符串.
int year = 2018;
int month = 1;
int day = 24;
float time = 2.5f;
System.out.println("今天是"+year+"年"+month+"月"+day+"日"
+"这篇博客大概要写"+time+"个小时");
当一个字符串过长时,可以通过使用 "+" 在两行中写.
2. 获取字符串信息
对一个字符串进行操作,我们首先需要知道它的长度,使用 String 类的 length() 方法可以获取声明的字符串对象的长度.
String s = "We are students";
System.out.println("字符串的长度是 : " + s.length());
上述代码的运行结果是 15,很明显空格也计算在内了,这点需要注意.
我们需要获取的字符串信息除了长度,还有一个就是索引位置,当我们需要一个字符串的某一个字符时,需通过索引位置获取该字符.String 类中提供了 indexOf() 和 lastIndexOf() 方法来获取指定字符的索引位置.区别在于,前者返回的是搜索的字符首次出现的位置的索引,后者返回的是搜索的字符最后出现位置的索引.
String str = "We are students";
System.out.println(str.indexOf("s")); // s首次出现的位置索引
System.out.println(str.lastIndexOf("s")); // s最后一次出现的位置索引
运行结果是 7 和 14,str 的存储状态如下:
W | e | a | r | e | s | t | u | d | e | n | t | s | ||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
当然,我们还可以获取指定索引位置的字符,使用 String 类中的 charAt() 方法,返回字符的索引,示例如下:
String s = "hello world";
char a = s.charAt(6);
则字符 a 的值为 w.
3. 去除字符串中的空格
对于一个字符串,有时可能需要去掉内部的空格来完成某一些操作,去掉字符串空格有两种,一种是去除字符串的前导,尾部空格,另一种是去除字符串中的所有空格,可以用不同的方法来实现.
trim() 方法用于去掉字符串的前导,尾部空格,如下:
String s1 = " hello world ";
String s2 = s1.trim();
运行后,s2 变为 "hello world",此方法只去除了前导空格和尾部空格,而中间的空格没有去掉.
如果要去除所有的空格,可以使用 StringTokenizer() 和 replaceAll() 方法来实现.具体使用方法可查阅 Java API,这里不过多赘述了,两个方法的语法格式如下:
StringTokenizer(String str, String delim)
str.replaceAll(String regex, String replacement)
4. 字符串替换
字符串替换就是新字符串替换原字符串中指定位置的字符串,生成一个新的字符串,通过 replace() 和 replaceFirst() 等方法可以实现.
String s = "bad bad study";
String s1 = s.replace("bad","good");
String s2 = s.replaceFirst("bad","good");
上述代码 s1,s2 分别为使用 replace() 和 replaceFirst() 方法获得的新字符串,s1 的值为 "good good study",s2 的值为 "good bad study".从这里应该很容易发现它们的区别了,replace() 方法是将原字符串中所有的要被替换的字符串全部替换了,而 replaceFirst() 方法只替换第一个出现的要被替换的字符串.
5. 判断字符串
判断字符串是一个比较重要的知识点,因为我们经常需要判断两个字符串是否相等,并返回它的 boolean 值,这里最容易出现的问题就是用 "==" 来判断字符串是否相等,这种做法是错误的,因为比较运算符 "==" 比较的是内存位置,不适宜拿来比较字符串.那字符串应该用什么来进行比较呢?
判断字符串是否相等有 equals() 和 equalsIgnoreCase() 两种方法,区别在于前者严格区分大小写,而后者忽略大小写.我们可以举个例子试一下:
public class Opinion {
public static void main(String[] args) {
String s1 = new String("http://www.cnblogs.com/adamjwh/");
String s2 = new String("http://www.cnblogs.com/adamjwh/");
String s3 = new String("HTTP://WWW.CNBLOGS.COM/ADAMJWH/");
String s4 = s1;
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1 == s4 : " + (s1 == s4));
System.out.println("s1.equals(s2) : " + s1.equals(s2));
System.out.println("s1.equals(s3) : " + s1.equals(s3));
System.out.println("s1.equalsIgnoreCase(s2) : " + s1.equalsIgnoreCase(s2));
System.out.println("s1.equalsIgnoreCase(s3) : " + s1.equalsIgnoreCase(s3));
}
}
运行结果如下:
现在分析一下这个代码,首先定义了两个字符串类型的变量 s1,s2,并赋了两个一模一样的值(这里要注意,值是相同的),然后定义了一个 s3 为 s1 的大写形式,用于比较两个方法的区别,又定义了一个 s4 并将 s1 赋予它,说明此时 s1 与 s4 的值相同.首先用比较运算符 "==" 对 s1,s2 和 s1,s4 分别进行比较,获得的结果是 s1 不等于 s2 但等于 s4,这是为什么呢?因为上面说过了,比较运算符 "==" 比较的是内存位置,这跟 Java 的字符串存储机制有关,基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的 String 常量放在常量池中,String 对象放在堆中,所以得到了如上的结果,还不太懂的朋友可以搜索有关 Java 中字符串存储的信息.后面的 equals() 和 equalsIgnoreCase() 方法的比较就不多说了,结果很明显,二者的区别在于是否区分大小写.
String 类中还提供了 stratsWith() 和 endsWith() 方法分别用于判断字符串是否以指定的内容开始和结尾,返回值都为 boolean 类型,具体可查阅 API,这里就不多赘述了.
6. 字母的大小写转换
String 类还提供了字母的大小写转换的方法,即 toLowerCase() 和 toUpperCase() 方法,语法格式如下:
str.toLowerCase()
str.toUpperCase()
使用 toLowerCase() 和 toUpperCase() 方法进行大小写转换时,数字或非字符不受影响.
7. 字符串分割
split() 方法根据指定的分割符对字符串进行分割,并将分割后的结果存放在字符串数组中.它提供了两种重载形式,一种是完全分割,一种是限定分割的份数,示例如下:
String s = new String("abc,def,ghi,jkl");
String[] s1 = s.split(","); // 根据","拆分字符串
String[] s2 = s.split(",", 2); // 根据","拆分字符串,拆分份数为2份
s1,s2 为分别用两种拆分方式拆分字符串所获得的数组.其中 s1 数组中的元素为 "abc","def","ghi","jkl";s2 因为拆分分数为两份,所以 s2 数组中的元素为 "abc","def,ghi,jkl".如果想定义多个分隔符,可使用 "|".
三,格式化字符串
格式化字符串是程序中经常用到的,主要包括日期格式化,时间格式化,日期 / 时间组合的格式化和常规类型格式化.
主要使用的是 format() 方法,此部分内容不过多赘述了,在程序中使用时只需查阅 API 进行调用即可,不需要过多的记忆.
四,正则表达式
对于正则表达式想必很多朋友应该都听说过,或者有写过脚本语言的朋友们也应该学习过正则表达式的使用.那么什么是正则表达式呢?
在程序设计中,经常需要对输入的数据进行检查,这时就会用到这则表达式,匹配正则表达式则数据格式正确,否则格式错误.
正则表达式的内容对于初学 Java 语言的朋友来说也不是很重要的内容,一般很少有用 Java 的正则表达式进行一下处理,大部分出现正则表达式的情况实在 Java 后端开发时,前端需要对输入的数据进行判断处理,可能会用 JavaScript 编写正则表达式,或者在 html 中直接嵌入正则表达式等等.网上关于正则表达式的资料也有很多,真要写的话一时半会儿也写不完,所以这里就不过多赘述了,有兴趣的朋友或者有需要的朋友可以了解一下,这里放条链接可供参考:http://www.runoob.com/java/java-regular-expressions.html.
五,字符串生成器
字符串生成器也即 StringBuilder 类,是字符串的一个重要的常用类.新创建的 StringBuilder 对象初始容量是 16 个字符,可以自行指定初始长度,也可以动态地执行添加,删除和插入等字符串的编辑操作,大大提高了频繁增加字符串的效率.
1. StringBuilder 类
说到 StringBuilder 就不得不说到 StringBuffer 了.StringBuilder 类是一个可变的字符序列,提供一个与 StringBuffer 类兼容的 API,但是并不保证与之同步,该类是 StringBuffer 类的一个简易替换,在字符串缓存被单个线程使用时要比 StringBuffer 类快,但是将 StrinBuilder 的实例用于多个线程是不安全的这时就要使用 StringBuffer 类来实现.简单来说,就是 StringBuilder 的效率要比 StringBuffer 的效率高,但在多线程中 StringBuilder 是不安全的,而 StringBuffer 是安全的,但二者的效率都比 String 要高.
2. StringBuilder 类的常用方法
StringBuilder 类的构造方法有很多,有 append,insert,delete 等.构造方法如下:
builder.append(String str);
builder.append(StringBuffer sb);
builder.insert(int offset, String str);
builder.delete(int start, int end);
append 方法是将参数指定的字符串 / 字符串缓存追加到字符串生成器中;insert 方法是将参数指定的字符串 str 添加到指定的位置 offset;delete 方法是从指定的 start 开始,到指定的 end 为止,移除字符串生成器中该位置的子字符串.
String 类还有一种常用的方法 toString(),这个方法在字符串生成器中经常使用,用于将字符串生成器转换为字符串,转换后字符串生成器的值不变.
这里只列举了部分常用的方法,更多请查询 java.lang.StringBuilder 的 API 文档.
以上就是本篇关于 Java 中字符串的内容,这部分内容有许多 Java 提供的方法需要在 API 中查询,相比之下知识点就不是很多,需要掌握的就是 String 类的应用,至于方法可在编程时查阅 API 来调用相应的方法,但至少要掌握几种常用的方法,比如 equals(),length(),toString() 方法等等.
来源: https://www.cnblogs.com/adamjwh/p/8342708.html