Değiştirilebilir bir java oluşturun.lang.String
Java String
ler değişmez olduğu biliniyor. Değişmez Dizeler kuruluşundan bu yana java için harika bir yanı vardır. Değişmezliğini tanıdı hızlı erişim ve iyileştirmeler bir sürü sağlar önemli ölçüde daha az hata eğilimli C-stil göre dizeler ve güvenlik modeli uygulamak yardımcı olur.
Olası kesmek kullanmadan değiştirilebilir bir tane oluşturmak için, yani
java.lang.refect
sun.misc.Unsafe
- Bootstrap classloader sınıflar
- JNI (veya JNI gerektirir JNA)
Ama mümkünse sadece düz Java, dize herhangi bir zamanda değiştirilebilir? SoruNasıl?
CEVAP
java.lang.String
Karakter seti ile bir yapıcı oluşturma, CharsetDecoder
kendi getiriyor kendi Karakter kümesi, enjekte edebilir. CharsetDecoder
decodeLoop yöntemi CharBuffer
bir nesne için bir başvuru alır. Bu CharBuffer char sarar[] orijinal String nesnesi. Bu CharsetDecoder bir başvuru olduğundan, altta yatan char değiştirebilirsiniz[] CharBuffer kullanarak, böylece değişken bir Dize var.
public class MutableStringTest {
// http://stackoverflow.com/questions/11146255/how-to-create-mutable-java-lang-string#11146288
@Test
public void testMutableString() throws Exception {
final String s = createModifiableString();
System.out.println(s);
modify(s);
System.out.println(s);
}
private final AtomicReference<CharBuffer> cbRef = new AtomicReference<CharBuffer>();
private String createModifiableString() {
Charset charset = new Charset("foo", null) {
@Override
public boolean contains(Charset cs) {
return false;
}
@Override
public CharsetDecoder newDecoder() {
CharsetDecoder cd = new CharsetDecoder(this, 1.0f, 1.0f) {
@Override
protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
cbRef.set(out);
while(in.remaining()>0) {
out.append((char)in.get());
}
return CoderResult.UNDERFLOW;
}
};
return cd;
}
@Override
public CharsetEncoder newEncoder() {
return null;
}
};
return new String("abc".getBytes(), charset);
}
private void modify(String s) {
CharBuffer charBuffer = cbRef.get();
charBuffer.position(0);
charBuffer.put("xyz");
}
}
Kod çalışan yazdırır
abc
zzz
Doğru decodeLoop uygulamak için nasıl bilmiyorum () ama şu an umrunda :) bilmiyorum
Java Yöntemi İçerir.lang.String büyük ...
İyi uygulama java kullanmaktır.lang.St...
Ölümcül Hata: java Düzeni Geçersiz.lan...
İle " uğraşan;java.lang.OutOfMemor...
Hata java.lang.OutOfMemoryError: GC ov...