Bu yazıda, sinifdən əlavə metodu ilə
Bəli, şübhəsiz ki, bu sualın dərinliyinə getməyən bir adam deyəcək: “Niyə mən tamamilə fərqli sinifin yeni obyekti yaratmaqla += operatorunu əvəz etməliyəm və sonra metodu da çağırmalıyam
StringBuilder
operator arasındakı fərqi nəzərdən keçirmək, təhlil etmək, danışmaq və göstərmək istərdim . Burada sual tətbiq sahələrində deyil, kodun optimallaşdırılmasında olacaq. +=
String
toString()
? danışırsan?Seçim göz qabağındadır, nə danışırsan?” və o, tamamilə yanılmış olardı. Problemlərdən biri də String
onun primitiv olmamasıdır. String
- Java-da hər hansı digər obyekt kimi bir obyekt class
və bildiyiniz kimi Java-da operatorun həddən artıq yüklənməsi kimi bir şey yoxdur (məsələn, C++-da olduğu kimi), operatorlar yalnız primitivlər üçün müəyyən edilir və istənilən sinif üçün biz heç bir operatoru ləğv edə bilmərik. +
Məhz buna görə də " " və " = " operatorları +
Java kitabxanasının bir növ "köpəkləri"dir və qoltuqağacı həmişə itkilərə məruz qalır. Əslində, pişiyin quyruğunu çəkməyi dayandıraq və ölçmələrə keçək. Budur, 100.000 dəfə döngə dəyişəni olan bir xətti “yapışdırmaq” üçün lazım olan vaxtı ölçən sadə proqram.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Hello";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Mənim kompüterimdə konsolda 6815 ms göstərildi. Yəni bu xətti bir-birinə tikmək mənim kompüterimə az qala 7 saniyə çəkdi. İndi onu StringBuilder ilə əvəz edək və hətta metodu toString()
ölçmələrə daxil edək.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Hello");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Kompüterim mənə 10ms dedi. Yəni 0,01 Saniyədə. Düşünürəm ki, təcrübədəki fərq olduqca açıqdır; kobud desək, 700 dəfə append
daha sürətli işləyirdi. Bunun səbəbi, çox güman ki, " +
" və " +=
" özləri eyni əlavə adlandıra bilər, lakin eyni zamanda belə bir operatorun ümumiyyətlə mövcud olduğunu və nəyin olduğunu başa düşmək üçün dilin qoltuqaltılarından uzun bir yol keçmişdir. etməli (sonuncu abzas təxmindən başqa bir şey deyil, mən JVM inkişaf etdiricisi deyiləm və orada nə olduğunu və necə olduğunu bilmirəm). Bu, əlavə bir obyektin həmişə baha başa gəlmədiyinin bariz nümunəsidir. Bəli, kod bir neçə sətir daha uzun olacaq, lakin böyük layihələrdə vaxta qənaət çox böyük ola bilər. Nəzərə alın ki, ölçmələr tarixdən əvvəlki prosessoru olan ofis kompüterində aparılmayıb, lakin indi təsəvvür edin ki, şərfi çətinliklə çəkə bilən bu ofis kompüterində nə qədər fərq olacaq.
GO TO FULL VERSION