Java programcıları tarafından yapılan en yaygın 10 hata

1. Array to ArrayList

Bir diziyi ArrayList'e dönüştürmek için birçok Java programcısı aşağıdaki kodu kullanır:

Arrays.asList, bir ArrayList nesnesi döndürür, ancak bu sınıf, genel java.util.ArrayList sınıfı değil, Arrays sınıfındaki özel bir statik dahili sınıftır. Bu java.util.Arrays.ArrayList sınıfı set (), get (), contains () gibi yöntemlere sahiptir, ancak öğe eklemek veya kaldırmak için herhangi bir yönteme sahip değildir. Çünkü sınıfın boyutu sabittir. Gerçek bir ArrayList oluşturmak için kod şu şekilde görünmelidir:

ArrayList'in yapım yönteminin Collection türünde bir nesneyi kabul edebileceğini ve java.util.Arrays.ArrayList'imizin bunun bir alt sınıfı olduğunu biliyoruz. Aslında, daha verimli bir kod örneği şudur:

2. Dizi belirli bir değer içeriyor mu?

Dizinin belirli bir değer içerip içermediğini kontrol etmek için, birçok Java programcısı aşağıdaki kodu kullanır:

İşlev açısından kod doğrudur, ancak bir diziyi Listeye dönüştürme ve ardından bir Listeyi Kümeye dönüştürme sürecinde çok fazla performans tüketir. Aşağıdaki formda optimize edebiliriz:

Veya aşağıda gösterildiği gibi en verimli koda daha fazla optimize edin:

3. Yineleme sırasında Listedeki öğeleri kaldırın

İlk olarak, yineleme sırasında Listedeki öğeleri kaldıran koda bir göz atın:

Bu örnek kodun çıktısı:

Bu örnek kodda çok ciddi bir hata var. Bir öğe kaldırıldığında, Listenin boyutu küçültülecek ve indeks noktası da değişecektir. Bu nedenle, yinelemeli işlemde dizinin kullanılması, birden çok belirtilen öğeyi Listeden doğru şekilde silmez.

Bu hatayı çözmenin yollarından birinin bir yineleyici kullanmak olduğunu biliyor olabilirsiniz. Dahası, Java'daki foreach ifadesinin yineleyicilere çok benzediğini düşünebilirsiniz, ancak durum böyle değil. Aşağıdaki örnek kodu ele alalım:

Bu örnek kod, ConcurrentModificationException oluşturur. Aşağıdaki gibi değiştirmeliyiz:

Next () yöntemi, remove () yönteminden önce çağrılmalıdır. Foreach döngüsünde, derleyici remove () yönteminin next () yönteminden önce çağrılmasına neden olur ve bu da ConcurrentModificationException'a yol açar. Ayrıntılar için lütfen ArrayList.iterator () kaynak kodunu kontrol edin.

Ek: Başka bir yol da for döngüsü kullanmaktır:

for (int i = 0; i < list.size ();) { eğer ("a" .equals (list.get (i))) { list.remove (i); devam et; } i ++; }

Dosyayı sildikten sonra, alt simge hareket etmez ve öğe sola doğru hareket eder.

4. Hashtable vs HashMap

Veri yapılarını inceleyen okuyucular, çok önemli bir veri yapısının karma tablo olarak adlandırıldığını bilirler. Java'da, hash tablosuna karşılık gelen sınıf Hashtable yerine HashMap'dir. HashMap ve Hashtable arasındaki temel fark şudur:

HashMap eşzamansızdır, Hashtable eşzamanlıdır.

5. Koleksiyonda ilkel türleri kullanın

Java'da, ilkel türleri sonsuz joker karakter türleriyle karıştırmak kolaydır. Bir Set örneğini ele alalım: Set ilkel bir türdür; Set < ? > Sınırsız joker karakter türüdür. Listedeki ilkel türleri kullanma örneğine bakalım:

Bu örnek kod bir istisna oluşturacaktır:

Koleksiyonlarda ilkel türlerin kullanımı, çok sayıda tür hatası riski taşır çünkü ilkel türlerde statik tür denetimi yoktur. Aslında, Ayarla, Ayarla < ? > İle Set arasında çok büyük bir fark var.

6. Erişim hakları

Java'ya yeni başlayan birçok kişi, sınıf üyelerini dekore etmek için genel olarak kullanmayı sever. Bu, üyeye doğrudan erişmeyi ve depolamayı kolaylaştırır. Ancak, bu çok kötü bir programlama tarzıdır ve doğru tasarım stili sınıf üyelerinin erişim haklarını olabildiğince azaltmak olmalıdır.

7. ArrayList vs LinkedList

Java'ya yeni başlayanların çoğu, ArrayList ve LinkedList arasındaki farkı anlamıyor, bu yüzden sadece nispeten basit ArrayList kullanıyorlar ve LinkedList'in hala JDK'da var olduğunu bile bilmiyorlar. Bununla birlikte, bazı özel senaryolarda, bu iki Listenin seçimi, program performansında büyük bir farka neden olacaktır. Basitçe söylemek gerekirse: Uygulama senaryosunda birçok ekleme / kaldırma işlemi ve yalnızca birkaç rastgele erişim işlemi olduğunda LinkedList seçilmelidir; diğer senaryolarda, ArrayList kullanmayı düşünün.

8. Değişken ve Değişmez

Değişmez nesnelerin basitlik ve güvenlik gibi birçok avantajı vardır. Bununla birlikte, her farklı değer için o sınıfın bir nesnesi gereklidir. Dahası, birçok nesnenin üretilmesindeki sorun, sık sık çöp toplamaya neden olabilmesidir. Bu nedenle, değişken veya değişmez bir tür seçerken, kapsamlı bir değerlendirmeden sonra bir karar vermelisiniz.

Genel olarak, değiştirilebilir nesneler çok sayıda ara nesne oluşturmaktan kaçınabilir. Çok klasik bir örnek, çok sayıda kısa String nesnesini tek bir uzun String nesnesine bağlamaktır. Değişmez String sınıfını kullanırsanız, bağlama işlemi, çok fazla CPU performansı ve bellek alanı tüketen, anında çöp toplama için uygun çok sayıda ara String nesnesi üretir. Şu anda, bir değişken StringBuilder veya StringBuffer kullanmak doğrudur.

Yukarıdakilere ek olarak, diğer senaryolarda değişmez nesneler için değiştirilebilir nesneler kullanılabilir. Örneğin, yönteme değişken bir nesne iletebilir ve nesneyi birden çok döngü düzeyine girip çıkmadan birden çok sonuç toplamak için kullanabilirsiniz.

9. Kalıtımdaki yapıcı

Yukarıdaki şekildeki iki derleme zamanı hatası şudur: varsayılan kurucu ana sınıfta tanımlanmamıştır ve ana sınıfın varsayılan kurucusu alt sınıfta çağrılır. Java'da, bir sınıf herhangi bir kurucu tanımlamazsa, derleme sırasında sınıfa otomatik olarak varsayılan bir kurucu eklenir. Bir sınıf herhangi bir kurucuyu tanımladığında, derleme zamanında sınıfa hiçbir kurucu eklenmeyecektir. Yukarıdaki örnekte, Super sınıfı parametre türü String olan bir yapıcıyı tanımlar, bu nedenle bu sınıfta yalnızca bir yapıcı vardır ve varsayılan bir kurucu olmayacaktır.

Subclass Sub'da, iki yapıcı tanımlıyoruz: parametre tipi String olan bir yapıcı ve diğeri öğün içermeyen varsayılan bir fonksiyon. İşlev gövdesinin ilk satırında ana sınıfın hangi yapıcısının çağrılacağını belirtmedikleri için, hepsi Super ana sınıfının varsayılan yapıcısını çağırmalıdır. Ancak, Süper sınıfın varsayılan kurucusu yoktur, bu nedenle derleyici bu iki hata mesajını bildirir.

Ek: Ayrıca, Java'daki alt sınıfın nesnesinin de ebeveyn sınıfın nesnesi olduğunu kanıtlar.Alt sınıfı oluşturduğumuzda, aynı zamanda ebeveyn sınıfın nesnesini de oluşturacağız. Ebeveyn sınıfının referansının alt sınıfın nesnesine işaret ettiği de anlaşılabilir. Örneğin:

paket cn.qlq.action; public class Super { korumalı Dize adı = "xxx"; genel Süper () { System.out.println ("Süper Oluştur"); } public void getName () { System.out.println ("ana sınıfın adı" + this.name); } public static void main (String args) { yeni Sub (). getName (); } } class Sub, Super { genel Sub () { System.out.println ("Alt Oluşturma"); } @Override public void getName () { this.name = "Zhang San"; super.getName (); System.out.println (bu.ad); } }

sonuç:

Süper oluşturuldu

Alt oluşturma

Ebeveyn sınıfının adı Zhang San

Zhang San

10. İp nesnelerinin iki yapım yöntemi

Java'da dize nesneleri oluşturmanın iki yaygın yolu vardır:

Onların arasındaki fark ne? Aşağıdaki koda tekrar bakalım:

Ayrıntılı JSON sözdizimi
önceki
Chongqing güzel havayı memnuniyetle karşılıyor, vatandaşlar güneşlenmek için dışarı çıkıyor
Sonraki
Jincheng'deki sonbahar çiçekleri sonbahar renklerini yansıtıyor
2019 için 30 ilin GSYİH büyüme hedefleri açıklandı: aralık değerleri belirlemek yaygınlaştı
Thunder vs. Timberwolves, Warriors vs. Clippers, yarın hangi oyunu izliyorsunuz?
1 ila 3 milyon nüfusa sahip büyük şehirler, yerleşim üzerindeki kısıtlamaları tamamen ortadan kaldırıyor
2018 Ulusal Gün hava durumu rehberi yayınlandı, ülkenin çoğu seyahat etmeli
200.000 millik posta yolu, 4 motosiklet kırıldı! 1980'lerde doğan postacının şık gençliği
Bu gece kimse uyumuyor! Renfu İlaç, 3 milyar şerefiye tahakkuk etti ve bir düzineden fazla şirketin 1 milyardan fazla tahmini zararı var ...
Bahar yapılandırması ek açıklama önbelleğini yeniden oluştur
Chengdu Ulusal Günü'nden önce güzel havayı çizmek için mavi gökyüzü çizim tahtası
Ali tarafından üretilen - bir butik olmalı, dağıtılmış ileti kuyruğu ara yazılımı RocketMQ
Altın sonbahar mevsiminde, "Wuhuashan" ın güzelliğini görmek için İç Moğolistan'daki Daxinganling'e gelin.
Fransa Kupası: Verratti Mbappé'yi vurdu, Paris 3-0 Nantes finale yükseldi
To Top