2015-11-24 16 views
10

String.substring için performans ile ilgili bir soru. Java 1.7.0_06'dan önce String.substring() yöntemi, ebeveynleri ile aynı temel karakter dizisini paylaşan yeni bir String nesnesini döndürdü ancak farklı ofset ve uzunluk. sadece küçük alt dize tutulması gerekiyordu bellekte çok büyük bir dize tutarak önlemek için, programcılar böyle kod yazmak için kullandı: itibaren 1.7.0_06 itibarenString.substring() altta yatan char [] değerini bir kopyasını oluşturma

s = new String(queryReturningHugeHugeString().substring(0,3)); 

, yeni oluşturmak için gerekli olmamıştır String, Oracle'ın String uygulamasında, alt dizeler artık temel karakter dizilerini paylaşmıyor.

Sorum şu: bazı gelecekteki sürümde char[] paylaşım gitmiyor Oracle (ve diğer satıcılar) güvenmek ve sadece s = s.substr(...) girecek ya açıkça sadece durumda bazı gelecekteki sürüm yeni bir dize oluşturmalıdır olabilir JRE bir paylaşım uygulamasını tekrar kullanmaya başlar mı?

+1

Tam olarak bir cevap değil ama burada çok iyi bir cevap http://stackoverflow.com/a/20275133/2796832 yardımcı olabilir. Belki de gerçekten ihtiyacınız varsa, bu cevaptan 'getValueLength' kullanabilirsiniz ve kodunuzu işaretlemek için kullanabilirsiniz. –

+2

@JonahGraham, kötü tavsiye. Bu zaten Java-9'da kırılabilir: 'char [] 'dizisinin burada byte []' ile değiştirilmesi bekleniyor. Özel JDK alanlarına yansıma yoluyla erişmek genel olarak iyi bir fikir değildir. –

+0

@TagirValeev TBH Bu yorumu cevap olarak düşünmeyi düşünüyordum, ama bu beni rahatsız ediyor. OP'nin, kodlarındaki fazladan bir komplikasyonun erken bir optimizasyon olmadığından emin olmak için detaylı analiz yaptığından eminim. Ancak, gelecekteki okuyucunun aynı özen ve dikkati alacağından emin değilim. Her neyse, cevabınız iyi bir +1 –

cevap

6

String'un gerçek temsili dahili bir uygulama detayıdır, bu yüzden hiçbir zaman emin olamazsınız. Ancak, Oracle mühendislerinin (özellikle de @shipilev) genel görüşmelerinin görüşüne göre, geri değişmesi pek olası değil. Bu sadece olası bellek sızıntısı ile savaşmak için değil, aynı zamanda String içsellerini basitleştirmek için yapıldı. Daha basit dizelerle, String deduplication veya Compact Strings gibi birçok optimizasyon tekniğini uygulamak daha kolaydır.

+0

Aslında, String de-duplication'ın varlığı, yine de substring gösterimi hakkında hiçbir zaman endişelenmenize gerek olmadığını gösteriyor. Bir JVM'nin çöp toplayıcı, eşit örneklerin aynı diziyi paylaşmasına izin vermek için dizeleri yamaya uygunsa, bir JVM satıcısı, paylaşılan alt dizeye geri dönmeye karar verirse, alt dizeleri de yayabileceğini varsaymak için çok uzak değildir. (ofset + uzunluk) gösterimi. – Holger

İlgili konular