Görüşmeci bana sordu: "Genel silme nedir ve hangi sorunları beraberinde getirir?"

Önsöz

Bu, Douyin'deyken iyi cevaplayamadığımı hissettiğim bir soru. Çünkü odak noktam sadece T'nin Object ile yer değiştirmesi sorunu etrafında ve getireceği sorunları açıklamadım.

zihin haritalama

Genel silme nedir?

Aslında, bu soruyu sık sık kullanıyoruz, hatta sık sık kullanıyorsunuz, ancak buna dikkat etmediniz, ancak bu soruyu görüşmeci tarafından yakalanması kolay oluyor. Önce bir kod parçasına bakalım.

Liste listesi = new ArrayList (); List listString = new ArrayList < Dize > (); List listInteger = new ArrayList < Tamsayı > ();

Bu birkaç kod parçası basit, kaba ve güçlü bir aşinalık duygusuna sahip. Sonra bu üç farklı kod parçasına bir 1 sayısı ekleyeceğim.

Bir okuyucu olarak, şimdi siyah bir soru işaretiniz olabilir mi? ? ? ? Bir sürü sorunuz olmalı, bu açıkça farklı, bu nasıl mümkün olabilir.

public class Ana { public static void main (String args) { Liste listesi = new ArrayList (); List listString = new ArrayList < Dize > (); List listInteger = new ArrayList < Tamsayı > (); Deneyin { list.getClass (). getMethod ("add", Object.class) .invoke (liste, 1); listString.getClass (). getMethod ("add", Object.class) .invoke (listString, 1); // İkna edici olmayan okuyucular için, denemek için onu bir dizeye değiştirebilirsiniz. listInteger.getClass (). getMethod ("add", Object.class) .invoke (listInteger, 1); } catch (İstisna e) { e.printStackTrace (); } System.out.println ("liste boyutu:" + list.size ()); System.out.println ("listString boyutu:" + listString.size ()); System.out.println ("listInteger boyutu:" + listInteger.size ()); } }

Üzgünüm, resimler var ve gerçek, onu yeni ekledim, eğer inanmıyorsanız, gerçekten yardımcı olamam.

Gerçeği keşfedin

Yukarıdakiler genel bir silme işleminin bir tezahürüdür, ancak daha iyi bir anlayış için, elbette daha derin olması gerekir. Liste çok büyük olmasına rağmen, ona bakmak imkansız değil.

Doğrulamak için iki önemli nokta:

  • Veri depolama türü
  • Veri toplama
  • // Listeye büyük bir pastayla bakalım // genel E'yi çok net görebilir public class ArrayList < E > Özet Listesini genişletir < E > Liste uygular < E > , RandomAccess, Cloneable, java.io.Serializable { // İlk önemli nokta // Başlamadan önce sorunları olan depolama türü // Aynı zamanda genel bir E olması gerekmez mi? geçici Nesne elementData; public E get (int indeksi) { rangeCheck (dizin); return elementData (dizin); // 1 ---- > } // doğrudan 1 tarafından çağrılan işlev // İkinci kilit nokta, verilerin zorunlu dönüştürülmesidir E elementData (int dizin) { return (E) elementData; } }

    Aslında, bu sözde jenerik T'nin sonunda bir Nesneye dönüştürüleceğini ve sonunda zorla dönüşüm yoluyla bir dönüşüm gerçekleştirileceğini anlayabilirsiniz. Buradan, verilerimiz önden geldiğinde neden Dize tipi verilerin doğrudan Tamsayı tarafından alınabileceğini de öğrenebiliriz.

    Ne tür sorunlar getiriyor?

    (1) Zorunlu tip dönüştürme

    Yukarıdaki yazımızda bahsettiğimiz bu problemin bir sonucu olarak yansıtma yoluyla eklediğimizde verilerimizde hatalar oluşacaktır.

    Listede isek < Tamsayı > Farkında olmadan String tipi bir değer eklemek, bu kadar büyük bir hata hakkında kiminle konuşmalıyız?

    (2) Referans geçme sorunu

    Yukarıdaki soruda, daha sonraki aşamada T'nin Nesneye kaçacağını söylemiştik, sonra da referansa bir dönüşüm gerçekleştiriyoruz, uygulanabilir mi?

    Liste < Dize > listObject = new ArrayList < Nesne > (); Liste < Nesne > listObject = new ArrayList < Dize > ();

    Böyle yazarsanız, inceleme aşamamızda bir hata bildirilecektir. Ama mantıksal anlamda, gerçekten yanılıyor musun?

    İlk çözümümüzün doğru olduğunu varsayarsak , Daha sonra aslında bir grup Object verisini depolamak ve daha sonra yukarıda bahsedilen zorunlu dönüştürme ile bunu String türüne dönüştürmek. Ama aslında, bir ClassCastException problemi olacaktır, çünkü Object her şeyin temel sınıfıdır, ancak zorunlu dönüştürme, alt sınıfın ebeveyn sınıfa hazırlaması için bir ölçüdür.

    İkinci çözümümüzün doğru olduğunu varsayalım Şu anda, yukarıdaki veri dizisine göre saklanır, ancak bunun anlamı nedir? Sonunda, hala Nesne olmalısın, sadece Nesne de olabilirsin.

    çözüm

    Aslında çok basit.Eğer halka açık bazı dersler gördüyseniz ve gelmek istiyorsanız, böyle bir kullanım görmüş olacaksınız.

    public class Bölüm < T ebeveyni uzatır > { özel T val; public T getVal () { dönüş değeri; } public void setVal (T val) { this.val = val; } }

    Önceki Bölüme kıyasla, daha fazlasına sahip < T ebeveyni uzatır > Aslında bu, temel sınıfın yeniden planlanması işlemidir, derlenmiş olsa bile, sanal makine, verileri doğrudan Object ile değiştirmek yerine, veriyi Parent'e dönüştürmeyi bilecektir.

    Uygulama senaryosu

    Bu bölümün fikri, Java jeneriklerinde extends ve super arasındaki farktan mı geliyor?

    Yukarıdaki çözümden bahsettik, kullan < T ebeveyni uzatır > . Aslında bu sadece bir çözüm, farklı senaryolarda farklı kullanım yöntemleri eklememiz gerekiyor. Ek olarak, görevli de bu yöntemin kullanılmasını savunuyor, ancak yukarıda belirtilen hatalarımızdan kaçınmak için doğal olarak bazı kullanım senaryoları vermemiz gerekiyor.

    İki senaryoya dayanmaktadır, biri genişletilmiş, diğeri devralınmıştır. Aşağıda örnek olarak bir liste kullanılmıştır.

    Birleşik miras emri

    // taşıyıcı sınıf plakası < T > { özel T öğesi; genel Plaka (T t) {öğe = t;} genel boşluk kümesi (T t) {öğe = t;} genel T get () {iade öğesi;} } // Seviye 1 sınıf Yemek {} // 2. Seviye class Fruit Yiyecekleri genişletir {} class Meat Yiyecekleri genişletir {} // 3. Seviye sınıf Apple Fruit'i genişletir {} Sınıf Muz Meyveyi uzatır {} sınıf Domuz Eti uzatır {} sınıf Sığır Eti uzatır {} // 4. Seviye sınıf RedApple Apple'ı genişletir {} sınıf GreenApple Apple'ı genişletir {}

    < T ebeveyni uzatır >

    Mirasın faydası nedir?

    Aslında beklediği şey, bu listenin tamamının verilerinin temelinin ebeveynimizden gelmesidir, böylece bu şekilde elde edilen tüm insanların ebeveyn sınıfı aslında ebeveynimizdendir, bu listeye Ebeveyn ailesi diyebilirsiniz. Dolayısıyla bunun sık okumaya uygun bir çözüm olduğu da söylenebilir.

    Tabak < Meyve uzatır > p1 = yeni Plaka < elma > (yeni Apple ()); Tabak < Meyve uzatır > p2 = yeni Plaka < elma > (new Beef ()); // kontrol başarısız oldu // Değiştirilen veriler geçmez p1.set (yeni Muz ()); // Veri toplama için her şey normaldir // Ama sadece bizim tanımladığımız Meyve için doğru olabilir Meyve sonucu = p1.get ();

    < T süper Ebeveyn >

    Genişletilmiş tipin rolü nedir?

    Bu sınıfla uyumluluğu belirtmek için süper tarafından değiştirilmiş uyumlu bir araç olarak düşünebilirsiniz ve bu şekilde, yukarıda bahsedilen Ana listedeki verileri depolamak için daha uygundur. Bu, sık eklemeler için uygun bir çözümdür.

    // Yiyecek konumunu doldurun, seviye Meyveye eşit veya daha büyük olmalıdır Tabak < ? süper Meyve > p1 = yeni Plaka < Gıda > (yeni Apple ()); // Extend'lerden farklı olarak depolanabilir p1.set (yeni Muz ()); // yöntemi al Muz sonucu1 = p1.get (); // bir hata bildirecek, dönüş yalnızca bir Nesne olduğu için zorunlu dönüştürmeye tabi tutulmalıdır Object result2 = p1.get (); // Bir Object verisi döndürmek için, tüm verileri kaybetmek üzereyiz, bu yüzden okumak için uygun değil

    Yukarıdakiler öğrendiklerimin sonuçlarıdır.Düşünmediğim bir şey varsa veya makalede hatalar varsa lütfen benimle paylaşın.

    Sonunda

    Son olarak şunu söylemek istiyorum: Programcılar için öğrenilmesi gereken çok fazla bilgi içeriği ve teknoloji var. Çevre tarafından ortadan kaldırılmak istemiyorsanız, kendinizi sürekli geliştirmelisiniz. Bize uyum sağlamak için çevreye değil, her zaman çevreye uyum sağlıyoruz!

    Burada editör, yukarıdaki teknik sistem şemalarıyla ilgili düzinelerce set koleksiyonunu paylaşacaktır. Tencent, Toutiao, Ali, Meituan ve diğer şirketlerden 19 yıl içinde mülakat soruları , Teknik noktaları video ve PDF olarak düzenledi (aslında beklenenden çok daha fazla enerji harcadı), Bilgi bağlamı + birçok ayrıntı , Sınırlı alan nedeniyle, işte resim şeklinde bir parçası.

    ve ayrıca Gelişmiş mimari teknolojisi gelişmiş zihin haritası, Android geliştirme röportajı özel materyalleri , Herkesin ileri seviyeyi geliştirmeyi öğrenmesine yardımcı olmak için gelişmiş gelişmiş çerçeve materyalleri ve ayrıca internette öğrenmek için materyal aramak için herkesin zamanından tasarruf sağlar ve ayrıca birlikte öğrenmek için arkadaşlarla paylaşılabilir.

    Size birçok kazanç getireceğine inanıyorum:

    [Android gelişmiş öğrenme videosu], [Android mülakat hilelerinin tam seti PDF], [Android geliştirme temel bilgi notları] özel mesajla [Android] ücretsiz olarak elde edilebilir!

    Programcı olmak kolaydır. İyi bir programcı olmak sürekli öğrenmeyi gerektirir. Genç programcıdan kıdemli programcıya, küçük mimardan kıdemli mimara veya yönetime, teknik müdürden teknik direktörlüğe kadar her aşamada Farklı yeteneklere hakim olmanız gerekiyor. İşinizde ve yetenek gelişiminizde akranlarınızdan kurtulmak için kariyer yönünüzü erkenden belirleyin.

    35 yaşın üzerindeki programcılar için bir çıkış yolu var mı? 46 yaşında bir programcı ile röportaj yaptım, birkaç noktayı özetledim
    önceki
    @Android Programmer: Sorun, Android çalışmıyor değil, devam edemezsiniz
    Sonraki
    Üç yıllık Android deneyimi, bu 70 mülakat sorusuyla 3 teklif aldım
    Orta Düzey ve Orta Düzeyler için Öne Çıkan Android Mülakat Soruları: İşleyiciye Derinlemesine İnceleme, Çoklu Okuma, Bitmap
    Android kıdemli mühendis görüşmesi için gerekli bilgisayar ağının temelleri
    Android mülakat soruları güncellenmeye devam ediyor: Lütfen bu DingTalk ve Douyin mülakatlarını büyük mülakatçılarla saklayın!
    Android yüz yüze paylaşım: 9 şirketle görüştüm, dikkat edilmesi gereken bu teknik noktaları özetledim
    Kıdemli Android geliştiricileri size şunu söylüyor: Özgeçmişinizi böyle yazın ve röportaj görüşmesi yumuşaktır!
    Andrews'ın soğuk kışında iş atlama ve maaş artışı gibi gelişmiş geliştirme deneyimi paylaşılır, böylece mülakat geçiş oranı iki katına çıkar!
    Android Orta Düzey ve İleri Düzey Mülakat Soruları Sürekli Destek: Android Bağlayıcı Mekanizmasını Gösterme
    Android geliştiricilerinin zorlu yolculuğunu geri sayın: o yıllarda hepimizin yaptığı hatalar
    Android Bilgi Notları: 2 "yanlış anlaşılan" Android bilgi puanını kaydedin
    Görüşme sırasında hangi konulara dikkat edilmelidir? İşte programcı iş görüşmelerinin 66 detayı
    Android röportajları için temel bilgi noktaları: Android'de Handler hakkında sekiz önemli sorunun bir özeti
    To Top