日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现

發布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

泛型Generics

一般通過“容器”來容納和管理數據。程序中的“容器”就是用來容納和管理數據。

數組就是一種容器,可以在其中放置對象基本類型數據

數組的優勢:是一種簡單的線性序列,可以快速地訪問數組元素,效率高。如果從效率類型檢查的角度講,數組是最好的。

數組的劣勢不靈活容量需要事先定義好,不能隨著需求的變化而擴容。比如:在一個用戶管理系統中,要把今天注冊的所有用戶取出來,那么這樣的用戶有多少個?在寫程序時是無法確定的。因此,在這里就不能使用數組。

容器,也叫集合(Collection)

泛型:可以幫助我們建立類型安全的集合在使用了泛型的集合中,遍歷時不必進行強制類型轉換。JDK提供了支持泛型的編譯器,將運行時的類型檢查提前到了編譯時執行,提高了代碼可讀性和安全性。

泛型的本質就是“數據類型的參數化”。可以把“泛型”理解為數據類型的一個占位符(形式參數),即告訴編譯器,在調用泛型時必須傳入實際類型。

未使用泛型時:

package cn.dym11; //測試泛型 public class TestGeneric {public static void main(String[] args) {MyCollection mc=new MyCollection();mc.set("代止兮", 0);mc.set(8888, 1);Integer a=(Integer) mc.get(1);String b=(String) mc.get(0);} } class MyCollection {Object [] objs=new Object[5];public void set(Object obj,int index) {objs[index]=obj;}public Object get(int index) {return objs[index];} }

使用泛型:

package cn.dym11; //測試泛型 public class TestGeneric {public static void main(String[] args) {MyCollection<String> mc=new MyCollection<String>();mc.set("代止兮", 0);String b=mc.get(0);} } class MyCollection <E> {Object [] objs=new Object[5];public void set(E e,int index) {objs[index]=e;}public E get(int index) {return (E) objs[index];} }

自定義泛型、容器中使用泛型

類的聲明處增加泛型列表,如:<T,E,V>

public class Test {public static void main(String[] args) {// 以下代碼中List、Set、Map、Iterator都是與容器相關的接口;List<String> list = new ArrayList<String>();Set<Man> mans = new HashSet<Man>();Map<Integer, Man> maps = new HashMap<Integer, Man>();Iterator<Man> iterator = mans.iterator();} }

Collection、List、Set、Map、Iterator接口都定義了泛型。


Collection接口

Collection 表示一組對象,它是集中、收集的意思。Collection接口的兩個子接口是ListSet接口。

注:由于List、Set是Collection的子接口,意味著所有List、Set的實現類都有上面的方法。

package cn.dym11;import java.util.ArrayList; import java.util.Collection;//測試Collection接口中的方法 public class TestList {public static void main(String[] args) {Collection<String> c=new ArrayList<>();System.out.println(c.size());System.out.println(c.isEmpty());c.add("代止兮");c.add("蒼凌");System.out.println(c);System.out.println(c.size());System.out.println(c.contains("蒼凌"));Object[] objs=c.toArray();System.out.println(objs);c.remove("蒼凌");System.out.println(c);c.clear();System.out.println(c.size());}}

package cn.dym11;import java.util.ArrayList; import java.util.Collection; import java.util.List;//測試Collection接口中的方法 public class TestList {public static void main(String[] args) {test02();}public static void test02() {List<String> list01=new ArrayList <>();list01.add("aa");list01.add("bb");list01.add("cc");List<String> list02=new ArrayList <>();list02.add("aa");list02.add("dd");list02.add("ee");System.out.println("list01:"+list01); //list01:[aa, bb, cc]// list01.addAll(list02);// System.out.println("list01:"+list01); //list01:[aa, bb, cc, aa, dd, ee]// list01.removeAll(list02);// System.out.println("list01:"+list01); //list01:[bb, cc]list01.retainAll(list02);System.out.println("list01:"+list01); // list01:[aa]System.out.println(list01.containsAll(list02));} }


List特點和常用方法

List是有序、可重復的容器?

有序:List中每個元素都有索引標記。

可重復:List允許加入重復的元素。更確切地講,List通常允許滿足 e1.equals(e2) 的元素重復加入容器。

List接口常用的實現類有3個:ArrayListLinkedListVector

List中操作索引的常用方法

package cn.dym11;import java.util.ArrayList; import java.util.List;public class TsetList01 {public static void main(String[] args) {test01();}public static void test01(){List<String> list=new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");System.out.println(list);list.add(2,"代止兮");System.out.println(list);list.remove(2);System.out.println(list);list.set(2, "代止兮");System.out.println(list);System.out.println(list.get(2));list.add("C");list.add("B");list.add("A");System.out.println(list);System.out.println(list.indexOf("B")); //找到,返回索引位置System.out.println(list.indexOf("d")); //找不到,返回-1System.out.println(list.lastIndexOf("B"));} }


?ArrayList特點和底層實現

ArrayList底層是用數組實現的存儲。? ?特點:查詢效率高,增刪效率低,線程不安全。

ArrayList底層使用Object數組來存儲元素數據

數組長度是有限的,而ArrayList是可以存放任意數量的對象,長度不受限制,那么它是怎么實現的呢?本質上就是通過定義新的更大的數組,將舊數組中的內容拷貝到新數組,來實現擴容。

自定義實現一個ArrayList,體會底層原理

第一個版本:

package cn.dym11;// 自定義實現一個ArrayList,體會底層原理public class SxtArrayList {private Object[] elementData;private int size;private static final int DEFAULT_CAPACITY=10;public SxtArrayList() {elementData=new Object[DEFAULT_CAPACITY];}public SxtArrayList(int capacity) {elementData=new Object[capacity];}public void add(Object obj) {elementData[size++]=obj;}public String toString() {StringBuilder sb=new StringBuilder();// [a,b,c]sb.append("["); // for(Object obj:elementData) { // sb.append(obj); // } // sb.append("]");for(int i=0;i<size;i++) {sb.append(elementData[i]+",");}sb.setCharAt(sb.length()-1, ']');return sb.toString();}public static void main(String[] args) {SxtArrayList s1=new SxtArrayList(20);s1.add("aa");s1.add("bb");System.out.println(s1);} }

//增加泛型
//增加數組擴容

package cn.dym11;// 自定義實現一個ArrayList,體會底層原理 //增加泛型 //增加數組擴容 public class SxtArrayList02<E> {private Object[] elementData;private int size;private static final int DEFAULT_CAPACITY=10;public SxtArrayList02() {elementData=new Object[DEFAULT_CAPACITY];}public SxtArrayList02(int capacity) {elementData=new Object[capacity];}public void add(E element) {// 什么時候擴容??if(size==elementData.length) {//怎么擴容?? //擴容操作Object[] newArray=new Object[elementData.length+(elementData.length>>1)];System.arraycopy(elementData, 0, newArray, 0,elementData.length );elementData=newArray;} elementData[size++]=element;}public String toString() {StringBuilder sb=new StringBuilder();// [a,b,c]sb.append("["); // for(Object obj:elementData) { // sb.append(obj); // } // sb.append("]");for(int i=0;i<size;i++) {sb.append(elementData[i]+",");}sb.setCharAt(sb.length()-1, ']');return sb.toString();}public static void main(String[] args) {SxtArrayList02 s1=new SxtArrayList02(20);for(int i=0;i<40;i++) {s1.add("dym"+i);}System.out.println(s1);} }

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。