目录
2 . 构造方法:String s = new String("hello");
一 . 字符串的基本定义
字符串是由多个字符组成的有序序列,在Java中字符串是对象,属于引用数据类型。Java中的字符串是不可变的(immutable),一旦创建就不能修改。
在Java中,字符串主要通过两种形式存在:
-
字符串字面量:如"Hello"
-
String类对象:通过new关键字创建
String s1 = "hello";
String s2 = new String("hello");
(博哥有话说:第一种常用,第二种多用于字符的拼接)
二 . 字符串的比较
(博哥有话说:“==” 和 “equals” 在面试题里面常见,仔细学习哦)
Java中字符串比较需要注意:
-
==比较的是引用地址 -
equals()比较的是内容 -
compareTo()按字典顺序比较
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
三 . 字符串常量
字符串常量是双引号括起来的字符序列,如"Java"。Java会为字符串常量在字符串常量池中分配内存,如果已存在相同内容的字符串,则直接引用已有的对象。
四 . String类对象实例化方式比较
1 . 直接赋值:String s = "hello";
先在常量池查找,有则引用,无则创建
(博哥有话说:前文说过的第一种常用在这也有体现,可以节约内存,而不是每次都在堆里面创建)
2 . 构造方法:String s = new String("hello");
每次都会在堆中创建新对象
String s1 = "hello";
String s2 = new String("hello");
五 . 字符串常量池
字符串常量池(String Pool)是Java堆内存中的特殊存储区域,用于存储字符串字面量。特点:
-
减少内存开销
-
提高性能
-
可通过
intern()方法将字符串手动加入池中
六 . 字符串修改分析
字符串不可变意味着:
-
任何修改操作(拼接、替换等)都会创建新对象
-
频繁修改会导致大量临时对象,影响性能
-
对于频繁修改的场景,应使用StringBuilder或StringBuffer
(博哥有话说:在项目中如果要对字符串进行大量的修改操作,最好使用动态字符串)
七 . 主方法组成分析
public static void main(String[] args) {
// 程序入口
}
-
public: 访问修饰符
-
static: 静态方法
-
void: 无返回值
-
main: 方法名
-
String[] args: 命令行参数数组
八 . 字符串常用方法
(博哥有话说:以下用于测试的字符串为bogeyouhuashuo)
1 . 字符串与字符
-
charAt(int index): 返回指定索引处的字符 -
toCharArray(): 将字符串转换为字符数组 -
length(): 返回字符串长度
public static void Test1(String s) {
System.out.println(s.length()); // 14
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i) + " ");
}
// b o g e y o u h u a s h u o
char[] c = s.toCharArray();
for (char value : c) {
System.out.print(value + " ");
}
// b o g e y o u h u a s h u o
}
2 . 字符串与字节
-
getBytes(): 使用平台默认字符集将字符串编码为字节序列 -
getBytes(String charsetName): 使用指定字符集编码
public static void Test2(String s) {
byte[] b1 = s.getBytes();
byte[] b2 = s.getBytes(StandardCharsets.UTF_8);
}
3 . 字符串比较
-
equals(Object anObject): 内容比较 -
equalsIgnoreCase(String anotherString): 忽略大小写比较 -
compareTo(String anotherString): 字典顺序比较 -
compareToIgnoreCase(String str): 忽略大小写的字典顺序比较
public static void Test3(String s) {
String ss = "BOGEYOUHUAHSUO";
System.out.println(s.equals(ss)); // false
System.out.println(s.equalsIgnoreCase(ss)); // true
System.out.println(s.compareTo(ss)); // 32
System.out.println(s.compareToIgnoreCase(ss)); // 0
}
4 . 字符串查找
-
indexOf(int ch): 返回字符第一次出现的索引 -
lastIndexOf(int ch): 返回字符最后一次出现的索引 -
contains(CharSequence s): 是否包含指定字符序列 -
startsWith(String prefix): 是否以指定前缀开始 -
endsWith(String suffix): 是否以指定后缀结束
public static void Test4(String s) {
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i) + " ");
}
System.out.println(s.lastIndexOf('e'));// 3
System.out.println(s.contains("boge"));// true
System.out.println(s.startsWith("boge"));// true
System.out.println(s.endsWith("boge"));// false
}
5 . 字符串替换
-
replace(char oldChar, char newChar): 字符替换 -
replace(CharSequence target, CharSequence replacement): 字符序列替换 -
replaceAll(String regex, String replacement): 正则替换 -
replaceFirst(String regex, String replacement): 替换第一个匹配项
public static void Test5(String s) {
String regex = "\\w{4}";
String ss = "----";
System.out.println(s.replace('e','E'));// bogEyouhuashuo
System.out.println(s.replace("boge","BOGE"));// BOGEyouhuashuo
System.out.println(s.replaceAll(regex,ss));// ---- ---- ---- uo
System.out.println(s.replaceFirst(regex,ss));// ---- youhuashuo
}
6 . 字符串拆分
-
split(String regex): 按正则表达式拆分 -
split(String regex, int limit): 限制拆分次数
public static void Test6(String s) {
String regex = "\\s+";
System.out.println(Arrays.toString(s.split(regex)));// [boge, youhua, shuo]
System.out.println(Arrays.toString(s.split(regex, 1)));// [boge youhua shuo]
}
7 . 字符串截取
-
substring(int beginIndex): 从指定索引截取到末尾 -
substring(int beginIndex, int endIndex): 截取指定范围
public static void Test7(String s) {
System.out.println(s.substring(4)); // youhuashuo
System.out.println(s.substring(4,6)); // yo
}
8 . 字符串格式化
-
format(String format, Object... args): 格式化字符串 -
String.format(): 静态格式化方法

被折叠的 条评论
为什么被折叠?



