前几天在做一个小程序,突然想到了先到了双等号和equals的区别,这个大家都知道:除了基本类型外,双等号判断地址是否相等,equals是判断对象的值是否相等。这个就是写本文章的前提。
那么String类中的subString(int i)函数中传递参数0时,是新建一个对象呢还是用原来的对象呢?我们拿例子来说明。
java code:
String hello = "hello world";
String world = hello.substring(0);
System.out.println(hello);
System.out.println(world);
System.out.println(hello == world);
System.out.println(hello.equals(world));
输出结果:
hello world
hello world
true
true
输出结果是两个true,后面那个true很容易想到(字符串相等),但前一个true就表名了字符串对象所在的地址也是相同的,也就是说是同一个。
这是为什么呢?看下面jdk中的源代码:
public String substring(int beginIndex) {
return substring(beginIndex, count);
}
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
可以看到这样的一句:
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
如果前面的条件成立则返回this,也就是字符串所处地址的引用 ,所以得出不管是字符串本身还是所对应的地址都是同一个。
分享到:
相关推荐
10. **反射机制**:探究Java运行时动态加载类的能力,如何通过反射获取类信息、创建对象、调用方法。 11. **枚举与注解**:理解枚举类型的作用和使用场景,以及注解的定义和应用。 12. **泛型**:学习泛型的概念,...
16. **反射机制**:探究Java的运行时类型信息,通过反射动态地访问类、接口、字段和方法。 17. **JDBC数据库编程**:学习如何连接数据库,执行SQL语句,处理结果集,以及事务管理。 18. **Java 8新特性**:介绍...
这是因为数组的`.length`是一个内置的成员变量,而字符串的`.length()`是一个方法,这是由于字符串在Java中是一个对象,实现了许多额外的方法,如`substring()`和`indexOf()`等。 当我们创建一个Java数组时,例如`...
6. **字符串处理**:Java中的String类提供了丰富的字符串操作方法,如substring、indexOf、replace、trim等,对于处理文本数据十分方便。 7. **多线程**:如果项目涉及到并发处理,就需要用到Java的线程概念,如...
4. **字符串操作**:掌握Java中的字符串方法,如split()、substring()和indexOf()等。 5. **信息检索**:学习关键词提取和上下文分析的基本原理。 6. **统计分析**:可能涉及到统计方法,如频率计算或相关性分析。 7...