-如何使CaseInsensitiveString表现得像String,所以上面的语句还可以(带有和不带有扩展String)?字符串到底有什么用,它能够像这样传递文字就可以了吗?据我了解,Java中没有“复制构造函数”的概念,对吗?
从第一点讲已经足够了。“波兰语”是字符串文字,不能分配给CaseInsentiviveString类。
现在关于第二点
尽管您不能创建新的文字,但是您可以按照本书的第一项采用“类似”方法,因此以下陈述是正确的:
CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");
assert cis5 == cis6;
assert cis5.equals(cis6);
这是代码。
C:\oreyes\samples\java\insensitive>type CaseInsensitiveString.java
import java.util.Map;
import java.util.HashMap;
public final class CaseInsensitiveString {
private static final Map<String,CaseInsensitiveString> innerPool
= new HashMap<String,CaseInsensitiveString>();
private final String s;
public static CaseInsensitiveString valueOf( String s ) {
if ( s == null ) {
return null;
}
String value = s.toLowerCase();
if ( !CaseInsensitiveString.innerPool.containsKey( value ) ) {
CaseInsensitiveString.innerPool.put( value , new CaseInsensitiveString( value ) );
}
return CaseInsensitiveString.innerPool.get( value );
}
public CaseInsensitiveString(String s){
if (s == null) {
throw new NullPointerException();
}
this.s = s.toLowerCase();
}
public boolean equals( Object other ) {
if ( other instanceof CaseInsensitiveString ) {
CaseInsensitiveString otherInstance = ( CaseInsensitiveString ) other;
return this.s.equals( otherInstance.s );
}
return false;
}
public int hashCode(){
return this.s.hashCode();
}
//使用“ assert”关键字测试该类
public static void main( String [] args ) {
CaseInsensitiveString cis1 = new CaseInsensitiveString("Polish");
CaseInsensitiveString cis2 = new CaseInsensitiveString("Polish");
assert cis1 != cis2;
assert cis1.equals(cis2);
CaseInsensitiveString cis3 = CaseInsensitiveString.valueOf("Polish");
CaseInsensitiveString cis4 = CaseInsensitiveString.valueOf("Polish");
assert cis3 == cis4;
assert cis3.equals(cis4);
CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");
assert cis5 == cis6;
assert cis5.equals(cis6);
CaseInsensitiveString cis7 = CaseInsensitiveString.valueOf("SomethinG");
CaseInsensitiveString cis8 = CaseInsensitiveString.valueOf("someThing");
assert cis8 == cis5 && cis7 == cis6;
assert cis7.equals(cis5) && cis6.equals(cis8);
}
}
C:\oreyes\samples\java\insensitive>javac CaseInsensitiveString.java
C:\oreyes\samples\java\insensitive>java -ea CaseInsensitiveString
C:\oreyes\samples\java\insensitive>
也就是说,创建一个CaseInsensitiveString对象的内部池,然后从那里返回相应的实例。
这样,对于两个表示相同值的对象引用,“ ==”运算符返回true。
当非常频繁地使用相似的对象并且创建成本很高时,这很有用。
字符串类文档指出该类使用内部池
该类并不完整,当我们尝试在实现CharSequence接口时遍历对象的内容时会出现一些有趣的问题,但是此代码足以说明如何应用Book中的该项。
重要的是要注意,通过使用internalPool对象,这些引用不会被释放,因此也不能被垃圾回收,如果创建了许多对象,这可能会成为一个问题。
它适用于String类,因为它被大量使用,并且池仅由“ interned”对象构成。
它也适用于Boolean类,因为只有两个可能的值。
最后,这也是为什么将Integer类中的valueOf(int)限制为-128到127个int值的原因。