Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

PHPz
PHPzke hadapan
2023-04-24 22:31:051499semak imbas

Pengenalan

Dalam pembangunan Java, pengaturcara harus mencuba yang terbaik untuk mengelak daripada mencipta objek dengan fungsi yang sama, kerana ini bukan sahaja menggunakan memori, tetapi juga mempengaruhi kelajuan berjalan program. Pertimbangkan untuk menggunakan semula objek dalam kes ini.

Seterusnya, kami akan memberikan beberapa contoh senario di mana objek digunakan semula untuk melihat sama ada kami telah ditipu !

1. String dan Boolean

Nampaknya tidak ada perbezaan antara dua cara penulisan berikut, tetapi jika kita memahami jvm yang mendasarinya, kita boleh menggunakan ciri-ciri kolam pemalar masa jalan jvm untuk mengelak daripada mencipta objek String dengan fungsi yang sama (terutamanya dicipta dalam gelung) boleh membawa pengoptimuman prestasi yang besar dan penjimatan memori.

Cara penulisan yang salah

// 每次都会创建一个新的String对象,且不会加入常量池
String name2 = new String("李子捌");

Cara penulisan yang betul

// 正确写法
String name1 = "李子捌";

Selain itu, pengaturcara yang baru menulis kod Java juga mesti memilih String dan StringBuilder dengan betul , Penggunaan kelas StringBuffer. String ialah objek tidak berubah dan biasanya digunakan untuk menentukan rentetan tidak berubah; StringBuilder dan StringBuffer digunakan dalam senario operasi rentetan berubah, seperti penyambungan rentetan adalah selamat untuk benang dan menggunakan kata kunci Disegerakkan untuk mencapai penyegerakan benang.

// StringBuffer中的append()方法
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

// StringBuilder中的append()方法
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

Boolean ialah jenis yang biasa digunakan dalam pembangunan, Boolean.valueof() juga harus digunakan dan bukannya Boolean() yang baharu dua Atribut statik akhir, dan Boolean.valueof() secara langsung mengembalikan dua atribut yang ditakrifkan, manakala Boolean() baharu akan mencipta objek baharu.

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

2. Buka kotak dan tinju automatik

Java menyediakan fungsi nyah kotak dan tinju automatik untuk jenis data asas Adakah ini bermakna kita boleh menggunakan kedua-dua jenis ini secara santai? Malah, secara teori, tiada masalah di peringkat kod, tetapi masih ada ruang untuk pengoptimuman dari segi prestasi tertentu! ! !

Mari kita uji prestasi

long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

Menggunakan Integer mengambil masa 3 milisaat

Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

long start = System.currentTimeMillis();
// 修改Integer 为 int 
int sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

Menggunakan int mengambil masa 0 milisaat

Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

Jadi mengenai penggunaan unboxing automatik dan tinju, kita sebenarnya boleh membuat pertimbangan yang sewajarnya Lagipun, kadangkala prestasi kod diperah sedikit demi sedikit! ! !

3. Ungkapan biasa

Ungkapan biasa selalunya digunakan untuk menyemak sama ada rentetan adalah sah ? Saya rasa anda boleh melihatnya ):

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        email.matches(regex);
    }

    System.out.println(System.currentTimeMillis() - start);

}

Ia mengambil masa sebanyak 71 milisaat, yang nampaknya agak pantas!

Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

Tetapi kami melakukan pengoptimuman yang sangat mudah Kod yang dioptimumkan adalah seperti berikut:

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";
    Pattern pattern = Pattern.compile(regex);

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        //email.matches(regex);
        pattern.matcher(email);
    }

    System.out.println(System.currentTimeMillis() - start);

}

Laksanakan kod sekali lagi, yang mengambil masa 1 milisaat secara keseluruhan. . , 70 kali lebih pantas! ! !

Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?

Ini kerana apabila kaedah String.matches() dicipta dalam gelung, Pattern.compile(regex) perlu dilaksanakan setiap kali dan kos mencipta contoh Patter adalah tinggi, kerana ungkapan biasa perlu disusun ke dalam mesin keadaan terhingga. Dalam kes ini, kami sering mengabaikan pertimbangan prestasi kerana API Java menyediakan panggilan kaedah yang lebih mudah, dan selalunya tidak mudah dicari.

Atas ialah kandungan terperinci Bagaimana untuk mengelakkan penciptaan objek yang tidak perlu di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam