2012-08-08 16 views
12

javax.sql paketindeki birçok sınıf, new String(str) yapıcısını kullanır.javax.sql paketindeki sınıflar neden yeni String (str) kullanıyor?

public void setCatalogName(int columnIndex, String catalogName) throws SQLException { 
    checkColRange(columnIndex); 
    if (catalogName != null) 
     colInfo[columnIndex].catName = new String(catalogName); 
    else 
     colInfo[columnIndex].catName = new String(""); 
} 

Ya

public void setUsername(String name) { 
    if(name == null) 
    { 
     username = null; 
    } else { 
     username = new String(name); 
    } 
} 

Ve daha birçok:

javax.sql.rowset.serial.SerialStruct.SerialStruct (SQLData, Harita>) javax.sql Örneğin. rowset.serial.SerialStruct.SerialStruct (Struct, Map>) javax.sql.rowset.RowSetMetaDataImpl.setCatalogName (int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnLabel (int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnName (int, String) javax.sql.rowset.RowSetMetaDataImpl.setColumnTypeName (int, String) javax.sql.rowset.BaseRowSet.setCommand (String) javax.sql.rowset. BaseRowSet.setDataSourceName (string) java.text.DateFormatSymbols.setLocalPatternChars (string) javax.sql.rowset.BaseRowSet.setNull (int, int, string)

bu amacı nedir? Yığında gereksiz dize örnekleri oluşturmuyor mu?

+1

Hangi JDK uygulamasına göre? OpenJDK? – oldrinb

+1

JDK6, Oracle .... Sadece JDK7'yi kontrol ettim ve orada sabitlendi – Bozho

+0

Gerçekten de, bunların hiçbirini [OpenJDK 7] 'de görmüyorum (http://grepcode.com/file_/repository.grepcode.com /java/root/jdk/openjdk/7-b147/javax/sql/rowset/RowSetMetaDataImpl.java). – oldrinb

cevap

6

Kodun JDK6'dan JDK7'ye değiştirildiği ve tüm örneklerin new String(str) kaldırıldığı anlaşılıyor. Dolayısıyla, Jon Skeet'in önerisi oldukça ilginç olmasına rağmen, muhtemelen bulduğu ve düzelttiği bir kod parçasıydı.

9

Onlar potansiyel "Büyük bir dize küçük parçası" karşı korumak konum sorun:

String x = getHugeStringFromSomewhere(); 
String y = x.substring(0, 5); 
foo(y); 

Şimdi y ile anılan dize gerekli kalır herhalde, ama x yapmaz. y, orijinal char[]'a başvurduğundan, çok küçük bir bellekten sorumlu olan küçük dizeyle sonuçlanırsınız. veri kopyalama

yerine yeni bir dize oluşturursanız,:

String x = getHugeStringFromSomewhere(); 
String y = new String(x.substring(0, 5)); 
foo(y); 

... sonra orijinal dize ile ilişkili altta yatan büyük char dizi çöp dize ile aynı anda toplanabilir.

Bunu, büyük bir metin dosyasından çok sayıda küçük satır okurken (ör. Bir sözlükteki sözcükler) büyük bir fark yarattığını gördüm. IIRC, BufferedReader.readLine, 80 karakterden oluşan bir arabellek oluşturur, böylece her dize, yalnızca 5 karakter uzunluğunda olsa bile en az 80 karakterden oluşan bir char[] döndürdü. (Anlaşılan bu readLine için Java 1.5 değişti yorum göre - ama substring hala aynı şekilde çalışır.) Her şey ... ekler

EDIT: hala nedeni olarak sadece bir tahmin Tabii ki, ve onu

+0

Teşekkürler, böyle çalışma gibi bir şey düşünülebilir .. JDK7 içinde söz konusu kod kaldırılmış olsa da, muhtemelen keşfettikleri ve sabitledikleri bir kod parçasıydı :) – Bozho

+0

Bu gerçek neden olmasa bile, hala hafıza hakkında dikkat edilmesi gereken önemli bir şey. +1 – Bozho

+0

'yeni Dize (" ")' ??/StringBuffer/String uygulaması 1.5 (sekiz yıl önce) olarak değiştirildi, şimdi her zaman backing karakterini [] kopyalıyor. readLine, bir satır bir arabelleği geçtiğinde yalnızca StringBuffer kullanır (varsayılan 8192 karakter). –

İlgili konular