1.第一字符串
java
package com.qcby;
import java.util.Arrays;
public class moxie {
public static void main(String[] args) {
String a="123";
String astring=new String("123456");
}
}
a:是定义在常量池中
astring是在堆当中开辟一个存储空间存储
2."=="和.equals()方法

"==":虚拟机先判断字符串常量池中查找该字符串是否已经存在,如果存在则返回引用; 如果不存在则会在字符串常量池当中创建该字符串对象。

关于==和equals()的区别详解
==运算符
基本数据类型的比较
-
比较的是变量存储的实际值是否相等
-
适用于:byte、short、int、long、float、double、char、boolean
-
示例:
javaint a = 5; int b = 5; System.out.println(a == b); // 输出true double x = 3.14; double y = 3.140; System.out.println(x == y); // 输出true
引用类型的比较
-
比较的是对象在内存中的地址(即是否指向同一个对象)
-
适用于所有对象类型(String、自定义类等)
-
示例:
javaString str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // 输出false,因为是不同对象 Object obj1 = new Object(); Object obj2 = obj1; System.out.println(obj1 == obj2); // 输出true,引用同一对象
equals()方法
默认实现
-
在Object类中定义,默认行为与==相同
-
比较的是对象的内存地址
-
示例:
javaclass Person {} Person p1 = new Person(); Person p2 = new Person(); System.out.println(p1.equals(p2)); // 输出false,默认比较地址
String类的重写实现
-
先比较对象地址,相同则返回true
-
若地址不同,则比较字符串内容是否一致
-
示例:
javaString s1 = "hello"; String s2 = new String("hello"); String s3 = "world"; System.out.println(s1.equals(s2)); // 输出true,内容相同 System.out.println(s1.equals(s3)); // 输出false,内容不同
实际应用场景
- 字符串比较:总是使用equals()比较字符串内容
- 枚举比较:可以使用==,因为枚举值是单例的
- 对象集合操作:在HashSet、HashMap等集合中使用equals()判断元素是否相同
- 缓存对象比较:当确定是同一对象时,可以使用==提高性能
***equals()方法
java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
-
首先检查两个对象是否为同一引用(this == anObject),若是则直接返回true。
若对象是String类型实例,则将其转型为String(anotherString)。
接着比较两字符串长度(value.length与anotherString.value.length),长度不同则直接判定不相等;若长度相同,则逐个字符比对(v1[i]与v2[i]),任一字符不匹配即返回false,全部字符一致则返回true。
若非String类型对象,则直接返回false。
3."+"和"append方法"
java
public class AUtil {
public static void main(String[] args) {
String a = "123";
String b = "456";
String c = a + b;
String d = "123456";
System.out.println(c == d);
}
}

返回false
总结:
-
在 Java 中,"+"运算符实际上会调用 StringBuilder 的 append() 方法来实现字符串拼接。
-
StringBuilder 在堆内存中分配新的存储空间来完成数组拼接操作(无法直接在原数组上进行拼接)。拼接完成后会调用其 toString() 方法,该方法内部实现是 new String(value)。这样就会在堆内存中创建新的字符串对象,指向字符串常量池中对应的字符串值。因此,"c"和"d"虽然内容相同,但会指向不同的内存地址。
4."+"和"append方法"的时间比
java
package com.qcby.ndspringbootwebsocket.util;
public class AUtil {
public static void main(String[] args) {
long startTime=System.nanoTime(); //获取开始时间
String a = "123";
for (int i = 0;i<100;i++){
a += "4";
}
long endTime=System.nanoTime(); //获取结束时间
System.out.println(endTime-startTime);
long startTime1=System.nanoTime(); //获取开始时间
StringBuilder ab = new StringBuilder("123"); //StringBuilder会申请一个非常大的内存空间
for (int i = 0;i<100;i++){
ab.append(4);
}
long endTime1=System.nanoTime(); //获取结束时间
System.out.println(endTime1 - startTime1);
}
}

"+"和"append方法"存在一个数量级的时间差
5.字符串操作函数
| 方法 | 功能 | 示例解读 |
|---|---|---|
length() |
获取字符串长度 | 对" Hello World "调用该方法,可得到包含两端空格的字符串长度 |
charAt(int index) |
获取指定索引位置的字符 | 示例中获取索引 2 处的字符,即'l'(索引从 0 开始) |
equals(Object obj) |
比较字符串内容是否相等 | 示例中cstring和bstring内容均为"123456",故返回true |
substring(int beginIndex)``substring(int beginIndex, int endIndex) |
截取子字符串 | 前者从索引 3 开始截取到末尾,得到"lo World ";后者截取索引 3(含)到 6(不含)的子串,得到"lo " |
toLowerCase() |
将字符串转换为小写 | 示例中" Hello World "转换后为" hello world " |
toUpperCase() |
将字符串转换为大写 | 示例中转换后为" HELLO WORLD " |
trim() |
去除字符串两端的空格 | 示例中去除两端空格后得到"Hello World" |
replace(CharSequence target, CharSequence replacement) |
替换字符串中的目标字符 / 子串 | 示例中先将"l"替换为"L",再将"o"替换为"0",实现字符替换 |
indexOf(String str) |
从开头查找子串的索引 | 示例中查找"l",返回其首次出现的索引 2 |
lastIndexOf(String str) |
从末尾查找子串的索引 | 示例中查找"l",返回其最后一次出现的索引 9 |
concat(String str) |
连接字符串 | 示例中将"Hello"与原字符串连接,得到" Hello World Hello" |
contains(CharSequence s) |
判断是否包含目标子串 | 示例中判断是否包含"ll",返回true |
java
package com.qcby;
import java.util.Locale;
public class Demo {
public static void main(String[] args) {
String aString = " Hello World ";
int length=aString.length();//length()方法获取长度
System.out.println(length);
//字符串是char类型的数组
char a=aString.charAt(2);
System.out.println(a);
//equals()方法比较字符串
String cstring="123456";
String bstring=new String("123456");
System.out.println(cstring.equals(bstring));
//substring()方法截取字符串
System.out.println(aString.substring(3));//从索引位置 3 开始到末尾的子字符串
System.out.println(aString.substring(3,6));//从索引 3(包含)到索引 6(不包含)的子字符串
//toLowerCase()方法将字符串转换成小写
System.out.println(aString.toLowerCase());
//toUpperCase()方法将字符串转换成大写
System.out.println(aString.toUpperCase());
//trim()方法删除字符串两端的空格
System.out.println(aString.trim());
//replace()方法替换字符串
System.out.println(aString.replace("l","L"));
System.out.println(aString.replace("l","L").replace("o","O"));
//indexOf()方法查找字符串从头
System.out.println(aString.indexOf("l"));
//lastIndexOf()方法查找字符串从未尾
System.out.println(aString.lastIndexOf("l"));
//concat()方法连接字符串
System.out.println(aString.concat("Hello"));
//contains() 判断是否包含目标串
System.out.println(aString.contains("ll"));
}
}
