网站首页 > java教程 正文
一、String类
- 初始化
```
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//数组定义为常量,不可修改
private final char value[];
public String() {
this.value = "".value;
}
```
- 实例化字符串
```
// //实例化字符串(传入字符串)
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
//字符数组的实例化构造方法(传入字符数组)
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
```
判断两个字符串是否相等(在string中重写了equals的方法,object的equals方法相当于“==”)
```
//判断两个字符串是否相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//判断是不是String类型
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;
}
//重写equals时需要重写hashCode方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
```
注意:在重写equals()时也必须要重写hashCode()方法,以保证相同对象的hash值也是一样的,否则会出现意想不到的问题的。因为如果我们对一个对象重写了equals,意思是只要对象的成员变量值都相等那么equals就等于true,但不重写hashcode,那么我们再new一个新的对象, 当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,导致混淆
二、字符串的三种拼接方法
① 加号
② concat方法
③ append方法
代码案例
```
public class StringConnect {
public static void main(String[] args) {
String str = "a";
long time = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str += "c";
}
System.out.println("加号所花费的时间:");
System.out.println(System.currentTimeMillis()-time);
String str2 = "a";
time = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str2.concat("c");
}
System.out.println("cancat方法所花费的时间:");
System.out.println(System.currentTimeMillis()-time);
time = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder("a");
for (int i = 0; i < 10000; i++) {
stringBuilder.append("c");
}
String str3 = stringBuilder.toString();
System.out.println("StringBuilder的append方法:");
System.out.println(System.currentTimeMillis()-time);
}
}
```
输出结果:

主要的部分字节码如下:
```
0 ldc <String "a"> [16]
2 astore_1 [str]
3 invokestatic java.lang.System.currentTimeMillis() : long [18]
6 lstore_2 [time]
7 iconst_0
8 istore 4 [i]
10 goto 36
13 new java.lang.StringBuilder [24]
16 dup
17 aload_1 [str]
18 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [26]
21 invokespecial java.lang.StringBuilder(java.lang.String) [32]
24 ldc <String "c"> [35]
26 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [37]
29 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [41]
```
结论:append方法最快、concat次之、加号最慢
1.当使用+进行多个字符串连接时,实际上是产生了一个StringBuilder对象和一个String对象。
2.每次concat操作都会创建一个新的String对象,限制速度
3.整个方法内并没有生成对象。只是最后toString返回一个对象
猜你喜欢
- 2024-10-18 java面试题之三:字符串操作(字符串笔试题java)
- 2024-10-18 Jmeter BeanShell循环:字符串 拼接模式,为变量名 获取数据值
- 2024-10-18 连接字符串除了“+”还有哪些方法,进来看
- 2024-10-18 初识java—(三十四)String、StringBuffer和StringBuilder类
- 2024-10-18 初学者都在坑里!不要在Python中使用“+”来连接字符串
- 2024-10-18 一段简单的关于字符串的Java 代码,竟然考察了这么多东西
- 2024-10-18 Java中字符串连接运算符“+”的困惑
- 2024-10-18 Guava之字符串连接,分割,匹配处理
- 2024-10-18 【老梁聊IT之JAVA篇】StringBuilder的正确使用方法详解
- 2024-10-18 为何Java8中不再需要StringBuilder拼接字符串
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)