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接口的兩個子接口是List、Set接口。
注:由于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個:ArrayList、LinkedList和Vector
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);} }//增加泛型
//增加數組擴容
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序开发3——事件处理
- 下一篇: Java的知识点24——多线程技术理论—