java 文件 string类型_Java String类型

主要属性和方法

public final class String

implments java.io.Serializable, Comparable, CharSequence {

/** The value is used for character storage. */

// 用来存储字符串的值

private final char value[];

/** Cache the hash code for the string */

// 用来缓存hash code 调用hashCode方法时会首先对hash的值进行判断,如果已经存在值, 由于String是不可变的,直接返回hash即可,不用重新对该String对象的hash code的进行计算

// 默认值为0

private int hash; // Default to 0

// 其他属性和方法...

}

从源码String源码可以看出,String是final修饰符修饰的类,表示String不能被继承。String 底层使用final修饰的char[]数组来储存字符串的值。

构造方法

b68922aac0f192ef8fbdbc8ecb0ba119.png

String有多种构造构造,可以传入char[]、String、StringBuffer、StringBuilder等属性构造String对象。

由于String为不可变类型,当调用String中方法对String修改操作时,都会调用相应的构造方法生成一个新的对象并返回,原String对象并不会产生改变。下面以replace()方法为例:

public String replace(char oldChar, char newChar) {

// 只有old != new才进行处理 否则直接返回

if (oldChar != newChar) {

int len = value.length;

int i = -1;

char[] val = value; /* avoid getfield opcode */

// 通过while循环找到第一个oldChar的位置

while (++i < len) {

if (val[i] == oldChar) {

break;

}

}

if (i < len) {

// 创建一个新的char数组 用来存新的String对象的值

char buf[] = new char[len];

// 将第一个oldChar前的所有char都存入buf数组中

for (int j = 0; j < i; j++) {

buf[j] = val[j];

}

// 将剩余val数组中等于oldChar的值修改为newChar后存入buf中

while (i < len) {

char c = val[i];

buf[i] = (c == oldChar) ? newChar : c;

i++;

}

// 根据buf数组生成新的String对象

return new String(buf, true);

}

}

return this;

}

equals方法

//Object中的equals方法

public boolean equals(Object obj) {

return (this == obj);

}

//String重写Object的equals方法

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;

}

可以看出Object中的equals方法直接使用“==”判断两个对象是否相等,"=="对基本类型进行判断是,比较的是基本类型的值,而对引用类型的对象进行判断时,比较的是两个对象的引用的值是否相等,也就是说"=="判断两个对象与对象的内容无关,只与对象的地址有关,当且仅当两个对象的地址一致时(为同一个对象)才会返回true。如:

String s1 = new String("string");

String s2 = new String("string");

s1 == s2; // false "=="只判断地址 s1 s2是单独的两个对象

String重写了equals方法,从源码可以看出,equals方法传入的参数类型为Object,调用equals时,首先会使用"==''比较this和待比较对象anObject的地址是否相等,若相等则表示这个两个对象为同一个对象,直接返回true即可。如果不相等,使用instanceof判断anObject是否为String类型,若不是则返回false,否则进行下一步操作,先判断两个String对象的value数组的长度是否相等,再循环比较数组中的每个元素是否相等。String的equals比较的是两个String对象的内容——也就是value数组是否相等。

String s1 = new String("string");

String s2 = new String("string");

s1.equals(s2); // true s1 s2是单独的两个对象 但是他们的内容都是 "string"

除equals方法外,由于String实现了comparable接口,也可以通过comparable的compareTo方法判断两个字符串是否相等

compareTo

public int compareTo(String anotherString) {

int len1 = value.length;

int len2 = anotherString.value.length;

int lim = Math.min(len1, len2);

char v1[] = value;

char v2[] = anotherString.value;

int k = 0;

while (k < lim) {

char c1 = v1[k];

char c2 = v2[k];

if (c1 != c2) {

return c1 - c2;

}

k++;

}

return len1 - len2;

}

从源码可以看出,compareTo方法的参数类型为String与equals的Object

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值