JAVA第十学:认识String类 - 教程

常用方法
所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。
1.字符串构造
String类提供的构造方式非常多,常用的就以下三种:

2.String对象的比较(字符串内存存储)
字符串的比较是常见操作之一
2.1 == 比较是否引用同一个对象
对于基本类型变量,== 比较两个变量中存储的值是否相同;对于引用类型变量,== 比较两个引用变量引用的是否为同一个对象。
(内置类型中包含基本类型)
Java 中的引用类型主要包括:
类类型(内置类【String 类、包装类、系统类】、自定义类)、接口类型、数组类型、枚举类型、注解类型。
所有引用类型的共同特点是:变量存储的是对象的内存地址,而不是对象本身的值。这是理解 Java 面向对象编程和内存管理的关键。





2.2 比较大小


3.字符串查找


String类提供的常用查找的方法:


注意:上述方法都是实例方法。
4.转化
4.1 数值和字符串转化

4.2 大小写转换

4.3 字符串转数组(重要)
字符串转字符数组

字符串转字节数组

查看字符编码(UTF-8)
4.4 格式化

5.字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据
replace 用单引号是替换字符,双引号替换。

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串。
6.字符串拆分
将一个完整的字符串按照指定的分隔符划分为若干个子字符串。



有些特殊字符作为分割符可能无法正确切分,需要加上转义。


7.字符串截取
从一个完整的字符串之中截取出部分内容。

String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
注意事项:
1. 索引从0开始
2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
8.其他操作方法




9.intern方法
手动把字符串常量添加到常量池中


10.字符串的不可变性
String是一种不可变对象,字符串中的内容不可改变,字符串不可被修改。

原因如下:
(1)所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。
(2)String类在设计时就是不可改变的,String类实现描述中已经说明了
以下来自JDK1.8中String类的部分实现:

String类中的字符实际保存在内部维护的value字符数组中
String类被final修饰,表明该类不能被继承;value被final修饰,表明value自身的值不能改变,即不能引用其它字符数组(该引用变量不能指向其他对象),但是其引用空间中 的内容可以修改。
【纠正】网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
那如果想要修改字符串中内容,该如何操作?
//Java中提供的 "不可变字符串"
public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s); // 输出:hello world
}
(1)先通过 s 和 world 拼接成一个新的字符串,再将s的引用指向新字符串。这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。
(2)使用 StringBuffer(旧版本) 或者 StringBuilder(新版本)

String和StringBuilder最大的区别在于,String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况优先考虑使用StringBuilder。
11.StringBuilder和StringBuffer(字符串修改)
为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类,这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它需要用到了大家可参阅 StringBuilder在线文档。
https://docs.oracle.com/javase/8/docs/api/
https://docs.oracle.com/javase/8/docs/api/


12.oj

(1)第一个只出现一次的字符
先统计每个字符(本质是数字)出现的次数,再遍历每个字符,判断出现的次数是否是1次。



class Solution {
public int firstUniqChar(String s) {
int[] count = new int[256];
// 统计每个字符出现的次数
for(int i = 0; i < s.length(); ++i){
count[s.charAt(i)]++;
}
// 找第一个只出现一次的字符
for(int i = 0; i < s.length(); ++i){
if(1 == count[s.charAt(i)]){
return i;
}
}
return -1;
}
}
(2)最后一个单词的长度


也可以用另一种方法

(3)检测字符串是否为回文
https://leetcode.cn/problems/valid-palindrome/
https://leetcode.cn/problems/valid-palindrome/
class Solution {
public static boolean isValidChar(char ch){
if((ch >= 'a' && ch <= 'z') ||
(ch >= '0' && ch <= '9')){
return true;
}
return false;
}
public boolean isPalindrome(String s) {
// 将大小写统一起来
s = s.toLowerCase();
int left = 0, right = s.length()-1;
while(left < right){
// 1. 从左侧找到一个有效的字符
while(left < right && !isValidChar(s.charAt(left))){
left++;
}
// 2. 从右侧找一个有效的字符
while(left < right && !isValidChar(s.charAt(right))){
right--;
}
if(s.charAt(left) != s.charAt(right)){
return false;
}else{
left++;
right--;
}
}
return true;
}
}


浙公网安备 33010602011771号