Java中的泛型是什么 ? 使用泛型的好處是什么?
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。
好處:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (推薦學(xué)習(xí):java面試題目)
1、類型安全,提供編譯期間的類型檢測(cè)
2、前后兼容
3、泛化代碼,代碼可以更多的重復(fù)利用
4、性能較高,用GJ(泛型JAVA)編寫的代碼可以為java編譯器和虛擬機(jī)帶來(lái)更多的類型信息,這些信息對(duì)java程序做進(jìn)一步優(yōu)化提供條件。
Java的泛型是如何工作的 ? 什么是類型擦除 ?如何工作?
1、類型檢查:在生成字節(jié)碼之前提供類型檢查
2、類型擦除:所有類型參數(shù)都用他們的限定類型替換,包括類、變量和方法(類型擦除)
3、如果類型擦除和多態(tài)性發(fā)生了沖突時(shí),則在子類中生成橋方法解決
4、如果調(diào)用泛型方法的返回類型被擦除,則在調(diào)用該方法時(shí)插入強(qiáng)制類型轉(zhuǎn)換
類型擦除:
所有類型參數(shù)都用他們的限定類型替換:
比如T->Object? ?? extends BaseClass->BaseClass
如何工作:
泛型是通過(guò)類型擦除來(lái)實(shí)現(xiàn)的,編譯器在編譯時(shí)擦除了所有類型相關(guān)的信息,所以在運(yùn)行時(shí)不存在任何類型相關(guān)的信息。例如 List
這樣做的目的,是確保能和Java 5之前的版本開(kāi)發(fā)二進(jìn)制類庫(kù)進(jìn)行兼容。你無(wú)法在運(yùn)行時(shí)訪問(wèn)到類型參數(shù),因?yàn)榫幾g器已經(jīng)把泛型類型轉(zhuǎn)換成了原始類型。
根據(jù)你對(duì)這個(gè)泛型問(wèn)題的回答情況,你會(huì)得到一些后續(xù)提問(wèn),比如為什么泛型是由類型擦除來(lái)實(shí)現(xiàn)的或者給你展示一些會(huì)導(dǎo)致編譯器出錯(cuò)的錯(cuò)誤泛型代碼。
你可以把List
對(duì)任何一個(gè)不太熟悉泛型的人來(lái)說(shuō),這個(gè)Java泛型題目看起來(lái)令人疑惑,因?yàn)檎Э雌饋?lái)String是一種Object,所以 List
如果你再深一步考慮,你會(huì)發(fā)現(xiàn)Java這樣做是有意義的,因?yàn)長(zhǎng)ist
List<Object> objectList; List<String> stringList; objectList = stringList; //compilation error incompatible types
如何阻止Java中的類型未檢查的警告?
如果你把泛型和原始類型混合起來(lái)使用,例如下列代碼,java 5的javac編譯器會(huì)產(chǎn)生類型未檢查的警告,例如
List<String> rawList = newArrayList()
注意: Hello.java使用了未檢查或稱為不安全的操作;
這種警告可以使用@SuppressWarnings(“unchecked”)注解來(lái)屏蔽。
Java中List
原始類型和帶參數(shù)類型
這道題的考察點(diǎn)在于對(duì)泛型中原始類型的正確理解。它們之間的第二點(diǎn)區(qū)別是,你可以把任何帶參數(shù)的類型傳遞給原始類型List,但卻不能把List
編寫一段泛型程序來(lái)實(shí)現(xiàn)LRU緩存?
對(duì)于喜歡Java編程的人來(lái)說(shuō)這相當(dāng)于是一次練習(xí)。給你個(gè)提示,LinkedHashMap可以用來(lái)實(shí)現(xiàn)固定大小的LRU緩存,當(dāng)LRU緩存已經(jīng)滿了的時(shí)候,它會(huì)把最老的鍵值對(duì)移出緩存。
LinkedHashMap提供了一個(gè)稱為removeEldestEntry()的方法,該方法會(huì)被put() 和putAll()調(diào)用來(lái)刪除最老的鍵值對(duì)。當(dāng)然,如果你已經(jīng)編寫了一個(gè)可運(yùn)行的JUnit測(cè)試,你也可以隨意編寫你自己的實(shí)現(xiàn)代碼。
Array中可以用泛型嗎?
這可能是Java泛型面試題中最簡(jiǎn)單的一個(gè)了,當(dāng)然前提是你要知道Array事實(shí)上并不支持泛型,這也是為什么Joshua Bloch在Effective Java一書中建議使用List來(lái)代替Array,因?yàn)長(zhǎng)ist可以提供編譯期的類型安全保證,而Array卻不能。
如何編寫一個(gè)泛型方法,讓它能接受泛型參數(shù)并返回泛型類型?
編寫泛型方法并不困難,你需要用泛型類型來(lái)替代原始類型,比如使用T, E or K,V等被廣泛認(rèn)可的類型占位符。最簡(jiǎn)單的情況下,一個(gè)泛型方法可能會(huì)像這樣:
public V put(K key, V value) { return cahe.put(key,value); }
C++模板和java泛型之間有何不同?
java泛型實(shí)現(xiàn)根植于“類型消除”這一概念。當(dāng)源代碼被轉(zhuǎn)換為Java虛擬機(jī)字節(jié)碼時(shí),這種技術(shù)會(huì)消除參數(shù)化類型。有了Java泛型,我們可以做的事情也并沒(méi)有真正改變多少;他只是讓代碼變得漂亮些。鑒于此,Java泛型有時(shí)也被稱為“語(yǔ)法糖”。
這和 C++模板截然不同。在 C++中,模板本質(zhì)上就是一套宏指令集,只是換了個(gè)名頭,編譯器會(huì)針對(duì)每種類型創(chuàng)建一份模板代碼的副本。
由于架構(gòu)設(shè)計(jì)上的差異,Java泛型和C++模板有很多不同點(diǎn):
C++模板可以使用int等基本數(shù)據(jù)類型。Java則不行,必須轉(zhuǎn)而使用Integer。
在Java中,可以將模板的參數(shù)類型限定為某種特定類型。
在C++中,類型參數(shù)可以實(shí)例化,但java不支持。
在Java中,類型參數(shù)不能用于靜態(tài)方法(?)和變量,因?yàn)樗鼈儠?huì)被不同類型參數(shù)指定的實(shí)例共享。在C++,這些類時(shí)不同的,因此類型參數(shù)可以用于靜態(tài)方法和靜態(tài)變量。
在Java中,不管類型參數(shù)是什么,所有的實(shí)例變量都是同一類型。類型參數(shù)會(huì)在運(yùn)行時(shí)被抹去。在C++中,類型參數(shù)不同,實(shí)例變量也不同。
Atas ialah kandungan terperinci Java泛型面試題目. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Fail Tetapan.JSON terletak di laluan peringkat pengguna atau ruang kerja dan digunakan untuk menyesuaikan tetapan vscode. 1. Laluan peringkat pengguna: Windows adalah C: \ Users \\ AppData \ Roaming \ code \ user \ settings.json, macOS adalah /users//library/applicationsupport/code/user/settings.json, linux adalah/ 2. Laluan Tahap Ruang Kerja: .VSCODE/Tetapan dalam Direktori Root Projek

DependencyInjection (DI) isadesignpatternwhereBjectsReceivedependencys ke luar, promotingloosecouplingandeasieSierTestthroughconstructor, setter, orfieldInjection.2.springframeworkusesannotationsike@component,@service, dan@autowwithjava yang berasaskan@autowwithjava

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

THEJVMenableSjava's "Writeonce, Runanywhere" keupayaanByExecutingByteCodeThroughFourMaincomponents: 1.TheClassloadersubsystemloads, pautan, danInitializes.ClassFilesusingBootstrap, Extension, andapplicationClassloaders, EnsuringseCureAndlazyCon

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan
