javaSE_base04_集合框架
四、集合框架
1:String類:字符串(重點)
???? (1)多個字符組成的一個序列,叫字符串。
???? ?? 生活中很多數(shù)據(jù)的描述都采用的是字符串的。而且我們還會對其進行操作。
???? ?? 所以,java就提供了這樣的一個類供我們使用。
???? (2)創(chuàng)建字符串對象
????????? A:String():無參構(gòu)造
?????????????? **舉例:
?????????????? ? String s = new String();
?????????????? ? s = "hello";
?????????????? ? sop(s);
????????? B:String(byte[] bys):傳一個字節(jié)數(shù)組作為參數(shù) *****
?????????????? **舉例
?????????????? ? byte[] bys = {97,98,99,100,101};
?????????????? ? String s = new String(bys);
?????????????? ? sop(s);
????????? C:String(byte[] bys,int index,int length):把字節(jié)數(shù)組的一部分轉(zhuǎn)換成一個字符串 *****
?????????????? **舉例
?????????????? ? byte[] bys = {97,98,99,100,101};
?????????????? ? String s = new String(bys,1,2);
?????????????? ? sop(s);
????????? D:String(char[] chs):傳一個字符數(shù)組作為參數(shù) *****
?????????????? **舉例
?????????????? ? char[] chs = {'a','b','c','d','e'};
?????????????? ? String s = new String(chs);
?????????????? ? sop(s);
????????? E:String(char[] chs,int index,int length):把字符數(shù)組的一部分轉(zhuǎn)換成一個字符串 *****
?????????????? **舉例
?????????????? ? char[] chs = {'a','b','c','d','e'};
?????????????? ? String s = new String(chs,1,2);
?????????????? ? sop(s);????
????????? F:String(String str):把一個字符串傳遞過來作為參數(shù)
?????????????? ? char[] chs = {'a','b','c','d','e'};
?????????????? ? String ss = new String(s);
?????????????? ? sop(ss);
????????? G:直接把字符串常量賦值給字符串引用對象(最常用) *****
?????????????? **舉例
?????????????? ? String s = "hello";
?????????????? ? sop(s);
???? (3)面試題
????????? A:請問String s = new String("hello");創(chuàng)建了幾個對象。
????????? ? 兩個。一個"hello"字符串對象,在方法區(qū)的常量池;一個s對象,在棧內(nèi)存。
????????? B:請寫出下面的結(jié)果
?????????????? String s1 = new String("abc");
?????????????? Strign s2 = new String("abc");
?????????????? String s3 = "abc";
?????????????? String s4 = "abc";
?????????????? sop(s1==s2);? //false
?????????????? sop(s1==s3);? //false
?????????????? sop(s3==s4);? //true
????????? C:字符串對象一旦被創(chuàng)建就不能被改變。
?????????????? 指的是字符串常量值不改變。
???? (4)字符串中各種功能的方法
????????? A:判斷
????????? ****???? boolean equals(Object anObject):判斷兩個字符串的內(nèi)容是否相同,復寫了Object的方法
????????? ****???? boolean equalsIgnoreCase(String anotherString):判斷兩個字符串的內(nèi)容是否相同,
???????????????????????????????????????????? 不區(qū)分大小寫
????????? ****???? boolean contains(String s):判斷一個字符串中是否包含另一個字符串
????????????????????????????? 注意:判斷字符串是否包含特殊字符.直接表示為str.contains(".")
?????????????? boolean endsWith(String suffix):測試此字符串是否以指定的后綴結(jié)束
?????????????? boolean startsWith(String suffix):測試此字符串是否以指定的前綴開始
?????????????? boolean isEmpty():測試字符串是否為空
????????? B:獲取
????????? *****???? int length():返回此字符串的長度
????????? *****???? char charAt(int index):返回指定索引處的 char值
????????? *****???? int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引。
?????????????? int indexOf(int ch, int fromIndex):返回在此字符串中第一次出現(xiàn)指定字符處的索引,
?????????????????????????????????? ?? 從指定的索引開始搜索。
?????????????? int indexOf(String str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
?????????????? int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次
??????????????????????????????????????? 出現(xiàn)處的索引,從指定的索引開始。
????????? ***???? int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出現(xiàn)處的索引。
?????????????? int lastIndexOf(int ch, int fromIndex)
??????????????????? 返回指定字符在此字符串中最后一次出現(xiàn)處的索引,從指定的索引處開始進行反向搜索。
?????????????? int lastIndexOf(String str)
??????????????????? 返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引。
?????????????? int lastIndexOf(String str, int fromIndex)
??????????????????? 返回指定子字符串在此字符串中最后一次出現(xiàn)處的索引,從指定的索引開始反向搜索。
????????? *****???? String substring(int beginIndex) (注意:該方法substring的String是小寫!!!)
??????????????????? 返回一個新的字符串,它是此字符串的一個子字符串。
?????????????? String substring(int beginIndex, int endIndex) (注意該方法的String是小寫!!!)
??????????????????? 返回一個新字符串,它是此字符串的一個子字符串,包含頭不包含尾。
????????? C:轉(zhuǎn)換
????????? *****???? byte[] getBytes():(很常用!)從字符串到字節(jié)數(shù)組的方法
?????????????? void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
??????????????????? 將字符從此字符串復制到目標字符數(shù)組。
????????? *****???? char[] toCharArray():(很常用!)從字符串到字符數(shù)組的方法
????????? ****???? static String copyValueOf(char[] data)
??????????????????? 返回指定數(shù)組中表示該字符序列的 String。
?????????????? static String copyValueOf(char[] data, int offset, int count)
??????????????????? 返回指定數(shù)組中表示該字符序列的 String。
????????? *****???? static String valueOf(數(shù)據(jù)類型):把該數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成字符串。
????????? ***???? String toLowerCase():把字符串轉(zhuǎn)換成小寫
?????????????? String toUpperCase():把字符串轉(zhuǎn)換成大寫
????????? ***???? 字符串的連接
?????????????? String concat(String str):將指定字符串連接到此字符串的結(jié)尾。
????????? D:替換
?????????????? String replace(char oldChar, char newChar):用新字符替換舊字符(替換所有)
?????????????? String replace(String target, String replacement):用新的子串換舊串
????????? E:分割
?????????????? String[] split(String regex):根據(jù)指定的字符串把一個字符串分割成一個字符串數(shù)組
????????? F:????
?????????????? String trim():去除字符串的前后空格
????????? G:????
?????????????? int compareTo(String anotherString)
??????????????????? 按字典順序比較兩個字符串。
?????????????? int compareToIgnoreCase(String str)
??????????????????? 按字典順序比較兩個字符串,不考慮大小寫。
???? (5)練習
????????? 1:模擬登錄,給三次機會,并提示還有幾次.
????????? 默認的用戶名和密碼為admin。 區(qū)分大小寫。
????????? 自己從鍵盤輸入用戶名和密碼。
????????? 2:給定一個字符串統(tǒng)計,統(tǒng)計大寫字母,小寫字母,數(shù)字出現(xiàn)的個數(shù).
????????? ***注意:不包括特殊字符
????????? 從鍵盤輸入一個不包含特殊字符的字符串(只有26個字母和0-9組成)。
????????? 3:給定一個字符串,把它變成首字母大寫,其他字母小寫的字符串.
????????? 從鍵盤輸入一個字符串,全部26個字母組成的。
????????? 4:子串在整串中出現(xiàn)的次數(shù)。
????????? 也就是說:獲取一個字符串中,指定的字串在該字符串中出現(xiàn)的次數(shù).
????????? 例如:
????????? "nbasdnbafllgnbahjnbakqqqqlnba"? 在這個字符串中,多有個nba.
????????? 5:對字符串中字符進行自然順序排序。
????????? "basckd"-->"abcdks"
????????? 先留做思考內(nèi)容:
????????? 6:兩個字符串的最大相同子串。
????????? 兩個字符串的最大相同子串。
????????? 比如:
????????? "sadabcdfghjkl"
????????? werabcdtyu"
2:StringBuffer
???? (1)字符串的緩沖區(qū),是一個容器。
???? (2)它和String的區(qū)別
????????? 它是緩沖區(qū)可變長度的。
???? (3)構(gòu)造方法
????????? StringBuffer() 構(gòu)造一個其中不帶字符的字符串緩沖區(qū),初始容量為 16 個字符。
????????? StringBuffer(int num) 構(gòu)造一個不帶字符,但具有指定初始容量的字符串緩沖區(qū)。
????????? StringBuffer(String str) 構(gòu)造一個字符串緩沖區(qū),并將其內(nèi)容初始化為指定的字符串內(nèi)容。
???? (4)常用方法
????????? A:增加數(shù)據(jù)
?????????????? **append :添加各種類型的數(shù)據(jù)
?????????????? **insert : 在容器指定位置插入各種類型的數(shù)據(jù)。
????????? B:刪除數(shù)據(jù)
?????????????? **deleteCharAt : 刪除指定位置的字符
?????????????? **delete 還可以用于清空StringBuffer的緩沖區(qū)
????????? C:替換
?????????????? **replace
????????? D:獲取
?????????????? **charAt
????????? E:長度和容量
?????????????? **length() 元素的個數(shù)
?????????????? **capacity 元素的理論值
????????? F:獲取元素的位置
?????????????? **indexOf
?????????????? **lastIndexOf
????????? G:截取
?????????????? **substring(int start)
?????????????? **substring(int start,int end)
????????? H:反轉(zhuǎn)
?????????????? **reverse
???? (5)字符串和StringBuffer的轉(zhuǎn)換
????????? String-->StringBuffer通過構(gòu)造:
?????????????? 如:StringBuffer sb = new StringBuffer(String str)
????????? StringBuffer--String通過toString方法
?????????????? 如:StringBuffer sb = new StringBuffer();
?????????????? ?? sb.toString();
3:StringBuilder
???? 和StringBuffer的功能是一樣的,但是有區(qū)別:
???? StringBuffer(JDK1.0)是線程安全的。
???? StringBuilder(JDK1.5)不保證線程安全。
???? 一般來說,我們寫的程序都是單線程的,所以,用StringBuilder,效率高。
???? JDK版本的升級原則:
???? A:提高效率
???? B:提高安全性
???? C:簡化書寫
4:基本數(shù)據(jù)類型的對象包裝類
???? (1)為了更方便的操作每個基本數(shù)據(jù)類型,java對其提供了很多的屬性和方法供我們使用。
???? (2)用途:
????????? **將基本數(shù)據(jù)類型封裝成對象的好處在于可以在對象中定義更多的功能操作該數(shù)據(jù)。
????????? **常用的操作之一:用于基本數(shù)據(jù)類型與字符串之間的轉(zhuǎn)換。
????????? A:方便操作
????????? B:用于和字符串進行相互轉(zhuǎn)換
???? (3)基本數(shù)據(jù)類型和對象類型的對應
????????? byte????????? Byte
????????? short????????? Short
????????? int????????? Integer
????????? long????????? Long
????????? float????????? Float
????????? double????????? Double
????????? boolean????????? Boolean
????????? char????????? Character
???? (4)構(gòu)造方法
????????? 字段摘要:
?????????????? static int MAX_VALUE 值為 2^31-1 的常量,它表示 int 類型能夠表示的最大值????????
?????????????? static int MIN_VALUE? 值為 -2^31 的常量,它表示 int 類型能夠表示的最小值
?????????????? static Class<Integer> TYPE 表示基本類型int的Class 實例
?????????
????????? Integer(int value) 構(gòu)造一個新分配的Integer對象,它表示指定的int值。
????????? Inreger(String s) 注意:s必須是純數(shù)字的字符串。否則會有異常NumberFormatException
????????? ???????????????????????
???? (5)幾個常用的方法
????????? Integer.toBinaryString();
?????????????? 以二進制(基數(shù) 2)無符號整數(shù)形式返回一個整數(shù)參數(shù)的字符串表示形式。
????????? Integer.toOctalString();
?????????????? 以八進制(基數(shù) 8)無符號整數(shù)形式返回一個整數(shù)參數(shù)的字符串表示形式。
????????? Integer.toHexString();
?????????????? 以十六進制(基數(shù) 16)無符號整數(shù)形式返回一個整數(shù)參數(shù)的字符串表示形式。
????????? static int Integer.parseInt(String s) 將字符串參數(shù)作為有符號的十進制整數(shù)進行解析,
?????????????? 字符串必須是int型范圍內(nèi)的數(shù)字字符串
????????? static int Integer.parseInt(String s,int basic)
?????????????? 使用第二個參數(shù)指定的基數(shù),將字符串參數(shù)解析為有符號的整數(shù).
?????????????? 字符串必須是int型范圍內(nèi)的數(shù)字字符串
????????? short shortValue() 以short類型返回該Integer的值。?????????
????????? int intValue() 以int類型返回該Integer的值。?
????????? static Integer valueOf(int num) 返回一個表示指定的 int 值的 Integer 實例。
????????? static Integer valueOf(String s) 返回保存指定的String的值的Integer對象。??????????
??????????????? static Integer valueOf(String s, int radix)
?????????????? 返回一個Integer對象,該對象中保存了用第二個參數(shù)提供的基數(shù)進行
?????????????? 解析時從指定的String中提取的值。
???? (6)類型轉(zhuǎn)換
????????? int -- Integer
?????????????? int num = 20;
?????????????? A:Integer i = new Integer(num);
?????????????? B:Integer i = Integer.valueOf(num);
????????? Integer -- int
?????????????? Integer i = new Integer(20);
?????????????? A:int num = i.intValue();
?????????
????????? int -- String
?????????????? int num = 20;
?????????????? A:String s = String.valueOf(num);
?????????????? B:String s = ""+num;
?????????????? C:String s = Integer.toString(num);
????????? String -- int
?????????????? String s = "20";
?????????????? A:int num = Integer.parseInt(s);
?????????????? B:Integer i = new Integer(s);或者Integer i = Integer.valueOf(s);
?????????????? ? int num = i.intValue();????
6、集合框架:
???? (1)為什么出現(xiàn)集合類?
????????? 面向?qū)ο髮κ挛锏捏w現(xiàn)都是以對象的形式,為了方便對多個對象的操作,就對對象進行存儲。
????????? 集合就是存儲對象最常用的一種方式.
???? (2)數(shù)組和集合都是容器,兩者有何不同?
????????? **數(shù)組長度固定,而集合長度是可變的????
????????? **數(shù)組值可以存儲對象,還可以存儲基本數(shù)據(jù)類型;而集合只能存儲對象????
????????? **數(shù)組存儲數(shù)據(jù)類型是固定的,而集合存儲的數(shù)據(jù)類型不固定?????????
???? (3)集合類的特點:
????????? 集合只能存儲對象
????????? 集合的長度是可變的
????????? 集合可以存儲不同類型的對象
???? (4)集合類框架(重要!!!要分清幾種容器間的區(qū)別):
????????? **Collection:頂層接口
????????? ???? |--->List:列表,元素是有序的(元素帶角標索引),可以有重復元素,可以有null元素。
????????? ??????????? |--->ArrayList(JDK1.2):底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組數(shù)據(jù)結(jié)構(gòu),特點是查詢速度快(因為帶角標),
????????????????????????????? ?? 但是增刪速度稍慢,因為當元素多時,增刪一個元素則所有元素的角標都得改變
????????????????????????????? ?? 線程不同步。默認長度是10,當超過長度時,按50%延長集合長度。??????????????????? ??
?????????????? ??? |--->LinkedList(JDK1.2):底層數(shù)據(jù)結(jié)構(gòu)式鏈表數(shù)據(jù)結(jié)構(gòu)(即后面一個元素記錄前一個),
????????????????????????????? ??? 特點:查詢速度慢,因為每個元素只知道前面一個元素,但增刪速度快
????????????????????????????? ??? 因為元素再多,增刪一個,只要讓其前后的元素重新相連即可
????????????????????????????? ??? 線程是不同步的。??????????????????????????????????
?????????????? ??? |--->Vector(JDK1.0):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組數(shù)據(jù)結(jié)構(gòu).特點是查詢和增刪速度都很慢。
????????????????????????????? 默認長度是10,當超過長度時,按100%延長集合長度。
????????????????????????????? 線程同步。
????????????????????????????? (Vector功能跟ArrayList功能一模一樣,已被ArrayList替代)
????????? ?? **List使用注意!
?????????????? |--->ArrayList:
?????????????? (1)當往ArrayList里面存入元素沒什么要求時,即只要求有序就行時;
?????????????? ??
?????????????? (2)當往ArrayList里面存入元素要求不重復時,比如存入學生對象,當同名同姓時
?????????????? ?? 視為同一個人,則不往里面存儲。則定義學生對象時,需復寫equals方法
?????????????? ?? public boolean equals(Object obj)
?????????????? ?? {
??????????????????? if(!(obj instanceof Student))
???????????????????????? return false;
??????????????????? Student stu = (Student)obj;
??????????????????? return this.name.equals(stu.name)&&this.age==stu.age;
?????????????? ?? }
?????????????? ?? 則往ArrayList集合通過add存入學生對象時,集合底層自己會調(diào)用學生類的equals方法,
?????????????? ?? 判斷重復學生則不存入。
?????????????? 注:對于List集合,無論是add、contains、還是remove方法,判斷元素是否相同,
?????????????? ???? 都是通過復寫equals方法來判斷!
?????????????? |--->LinkedList
?????????????? (1)LinkLedist的特有方法:
??????????????????? boolean offerFirst(E e)? 在此列表的開頭插入指定的元素。
??????????????????? boolean offerLast(E e) 在此列表末尾插入指定的元素。
??????????????????? E peekFirst() 獲取但不移除此列表的第一個元素;如果此列表為空,則返回 null。
??????????????????? E peekLast() 獲取但不移除此列表的最后一個元素;如果此列表為空,則返回 null。
??????????????????? E pollFirst() 獲取并移除此列表的第一個元素;如果此列表為空,則返回 null。
??????????????????? E pollLast() 獲取并移除此列表的最后一個元素;如果此列表為空,則返回 null。
?????????????? (2)通過LinkLedist的特有方法,可以實現(xiàn)某些數(shù)據(jù)特殊方式的存取,比如堆棧和隊列。
??????????????????? 一般情況下,使用哪種List接口下的實現(xiàn)類呢?
??????????????????? 如果要求增刪快,考慮使用LinkedList
??????????????????? 如果要求查詢快,考慮使用ArrayList
??????????????????? 如果要求線程安全,考慮使用Vector。
????????? ???? |--->Set:集合,元素是無序的(因為沒有索引),元素不可以重復。可以有null元素。
?????????????? ??? |--->HashSet(JDK1.2):底層數(shù)據(jù)結(jié)構(gòu)是哈希表、存取速度快、元素唯一、線程不同步。
???????????????????????? 保證性元素唯一的原理:
???????????????????????? 先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true
???????????????????????? (往HashSet里面存的自定義元素要復寫hashCode和equals方法,
???????????????????????? 以保證元素的唯一性!)
?????????????? ??? |--->TreeSet:底層數(shù)據(jù)結(jié)構(gòu)式二叉樹。可以對Set集合中的元素進行排序。元素有序、線程不同步。
???????????????????????? 保證元素唯一性的依據(jù):compareTo方法return 0
???????????????????????? TreeSet排序的第一種方式:讓元素自身具備比較性,比如八種基本數(shù)據(jù)類型或則字符串,
??????????????????????????????????????? 實現(xiàn)Compareble接口,覆蓋compareTo方法,
??????????????????????????????????????? 此方式是元素的自然順序??????????????
???????????????????????? TreeSet排序的第一種方式:當元素自身不具備比較性(比如存儲學生對象時)或者具備的
??????????????????????????????????????? 比較性不是我們所需要的比較性時(比如想字符串的長度排序),
??????????????????????????????????????? 此時就需要讓集合自身具備自定義的比較性。
??????????????????????????????????????? 那如何讓集合自身具備比較性呢?可在集合初始化時,
??????????????????????????????????????? 就讓集合具備比較方式。即定義一個類,
??????????????????????????????????????? 實現(xiàn)Comparator接口,覆蓋compare方法。
?????????????? **Set集合使用注意事項:
?????????????? (1)HashSet:
?????????????? ????? 通過new的方式往HashSet里面存的元素的hashCode都不同,但通常我們定義對象,
?????????????? ????? 比如學生對象時,雖然是new的兩個學生對象,但是當他們name和age一樣時,我們認為是
?????????????? ????? 同一個對象,所以為了保證元素的唯一性,我們通常在往HashSet集合里面存儲元素時,
?????????????? ????? 在定義對象的類中通常復寫hashCode和equals方法。
?????????????? ????? public int hashCode()
?????????????? ????? {
??????????????????? return name.hashCode()+age*39;
?????????????? ????? }
?????????????? ????? public boolean equals(Object obj)
?????????????? ????? {
??????????????????? if(!(obj instanceof Student))
???????????????????????? return false;
??????????????????? Student stu = (Student)obj;
??????????????????? return this.name.equals(stu.name)&&this.age==stu.age;
?????????????? ????? }
?????????????? ???? HashSet是如何保證元素唯一性的呢?
?????????????? ????? **如果兩元素的hashCode值不同,則不會調(diào)用equals方法
?????????????? ????? **如果兩元素的hashCode值相同,則繼續(xù)判斷equals是否返回true;
?????????????? ????? **hashCode和equals方法雖然定義在自定義對象類里面,但不是我們手動調(diào)用
?????????????? ??????? 而是往HashSet集合里面存儲元素的時候,集合底層自己調(diào)用hashCode和equals
??????????????????? 它自己拿對象去判斷,自己判斷兩元素是否是同一個元素。
?????????????? (2)TreeSet:
?????????????? ???? TreeSet要求往里面存的元素具備比較性,否則會報錯。
?????????????? ???? TreeSet排序的第一種方式:讓元素自身具備比較性
??????????????????? ? 定義對象類,實現(xiàn)Compareble接口,復寫compareTo方法,此方式是元素的自然順序
??????????????????? ? class Student implements Comparable
??????????????????? ? {
???????????????????????? private String name;
???????????????????????? private int age;
???????????????????????? public Student(String name,int age)
???????????????????????? {
????????????????????????????? this.name=name;
????????????????????????????? this.age=age;
???????????????????????? }
???????????????????????? public String getName()
???????????????????????? {
????????????????????????????? return name;
???????????????????????? }
???????????????????????? public int getAge()
???????????????????????? {
????????????????????????????? return age;
???????????????????????? }
???????????????????????? public int compareTo(Object obj)
???????????????????????? {
????????????????????????????? if(!(obj instanceof Student))
?????????????????????????????????? throw new RuntimeException("不是學生對象!");
????????????????????????????? Student stu = (Student)obj;
????????????????????????????? int num = this.age-stu.age;
????????????????????????????? if(num==0)
?????????????????????????????????? return this.name.compareTo(stu.name);
????????????????????????????? return num;
???????????????????????? }
??????????????????? ? }
?????????????? ??? TreeSet排序的第一種方式:讓集合具備比較性
???????????????????????? 當元素自身不具備比較性(比如存儲學生對象時)或者具備的
???????????????????????? 比較性不是我們所需要的比較性時(比如想字符串的長度排序),
???????????????????????? 此時就需要讓集合自身具備自定義的比較性。
???????????????????????? 那如何讓集合自身具備比較性呢?可在集合初始化時,
???????????????????????? 就讓集合具備比較方式。即定義一個類,
???????????????????????? 實現(xiàn)Comparator接口,覆蓋compare方法。
??????????????????? class StringLengthComparator implements Comparator
??????????????????? {
???????????????????????? public int compare(Object obj1,Object obj2)
???????????????????????? {
????????????????????????????? String s1 = (String)obj1;
????????????????????????????? String s2 = (String)obj2;
????????????????????????????? int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
????????????????????????????? if(num==0)
?????????????????????????????????? return s1.compareTo(s2);
????????????????????????????? return num;
???????????????????????? }
??????????????????? }
??????????????????? class TreeSetTest
??????????????????? {
???????????????????????? public static void main(String[] args)
???????????????????????? {
????????????????????????????? TreeSet ts = new TreeSet(new StringLengthComparator());
????????????????????????????? ts.add("addfg");
????????????????????????????? ts.add("dfg");
????????????????????????????? ts.add("agtuug");
????????????????????????????? ts.add("vgjkg");
????????????????????????????? sop(ts);
???????????????????????? }
??????????????????? }
???????????????????
??????????????????????????????????????? ????
?????????????? ???? 基本數(shù)據(jù)類型或字符串對象均實現(xiàn)了Comparable接口,故同種類型基本數(shù)據(jù)間具備比較性,即自然順序。
????
?????????????? ?????
???? **Map:頂層接口,該集合存儲的是鍵值對,而且鍵是唯一的,Map和Set很像,Set集合底層就是使用了Map集合。
????????? Map集合沒有迭代器,要取出元素必須先將Map集合轉(zhuǎn)換成Set集合才能遍歷元素
???? ?? |--->HashTable(JDK1.0):
????????? 底層是哈希表數(shù)據(jù)結(jié)構(gòu);
????????? 不可以使用null鍵和null值;
????????? 用作鍵的對象必須實現(xiàn)hashCode和equals方法來保證鍵的唯一性
????????? 線程同步,效率低
???? ?? |--->HashMap(JDK1.2):
????????? 底層是哈希表數(shù)據(jù)結(jié)構(gòu);
????????? 允許使用null鍵和null值;
????????? 線程不同步,效率高;
????????? 保證元素唯一性的:
?????????????? 原理:先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true
?????????????? (往HashSet里面存的自定義元素要復寫hashCode和equals方法,
?????????????? 以保證元素的唯一性!)
????????? class Student {
?????????????? private String name;
?????????????? private int age;
?????????????? public Student(String name, int age) {
??????????????????? super();
??????????????????? this.name = name;
??????????????????? this.age = age;
?????????????? }
?????????????? public int getAge() {
??????????????????? return age;
?????????????? }
?????????????? public void setAge(int age) {
??????????????????? this.age = age;
?????????????? }
?????????????? public String getName() {
??????????????????? return name;
?????????????? }
?????????????? public void setName(String name) {
??????????????????? this.name = name;
?????????????? }
??????????????
?????????????? @Override
?????????????? public int hashCode(){
??????????????????? return name.hashCode()+age*34;
?????????????? }
?????????????? @Override
?????????????? public boolean equals(Object obj){
???????????????????
??????????????????? if(!(obj instanceof Student))
???????????????????????? return false;
??????????????????? Student stu = (Student)obj;
??????????????????? return this.name.equals(stu.name)&&this.age==stu.age;
?????????????? }
????????? public class HashMapDemo1 {
?????????????? public static void main(String[] args) {
??????????????????? Map<Student , String> hmap = new HashMap<Student , String>();
??????????????????? hmap.put(new Student("001",20), "beijing");
??????????????????? hmap.put(new Student("002",25), "hebei");
??????????????????? hmap.put(new Student("003",50), "hainan");
??????????????????? hmap.put(new Student("001",20), "beijing");
???????????????????
??????????????????? System.out.println(hmap.size());
??????????????????? Set<Student> keySet = hmap.keySet();
??????????????????? Iterator<Student> it = keySet.iterator();
??????????????????? while(it.hasNext()){
???????????????????????? Student stu = it.next();
???????????????????????? String addr = hmap.get(stu);
???????????????????????? System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr);
??????????????????? }????
?????????????? }????
????????? }??????????????
???? ?? |--->TreeMap(JDK1.0):
????????? 底層是二叉樹結(jié)構(gòu);
????????? 允許使用null鍵和null值;
????????? 線程不同步;
????????? 可以給Map集合中的鍵進行排序.
????????? TreeMap排序的第一種方式:讓元素自身具備比較性,比如八種基本數(shù)據(jù)類型或則字符串,
??????????????????? 實現(xiàn)Compareble接口,覆蓋compareTo方法,
??????????????????? 此方式是元素的自然順序??????????????
????????? TreeMap排序的第一種方式:當元素自身不具備比較性(比如存儲學生對象時)或者具備的
??????????????????? 比較性不是我們所需要的比較性時(比如想字符串的長度排序),
??????????????????? 此時就需要讓集合自身具備自定義的比較性。
??????????????????? 那如何讓集合自身具備比較性呢?可在集合初始化時,
??????????????????? 就讓集合具備比較方式。即定義一個類,
??????????????????? 實現(xiàn)Comparator接口,覆蓋compare方法。
????????? class Student implements Comparable<Student>{
?????????????? private String name;
?????????????? private int age;
?????????????? public Student(String name, int age) {
??????????????????? super();
??????????????????? this.name = name;
??????????????????? this.age = age;
?????????????? }
?????????????? public int getAge() {
??????????????????? return age;
?????????????? }
?????????????? public void setAge(int age) {
??????????????????? this.age = age;
?????????????? }
?????????????? public String getName() {
??????????????????? return name;
?????????????? }
?????????????? public void setName(String name) {
??????????????????? this.name = name;
?????????????? }
?????????????? @Override
?????????????? public int compareTo(Student stu) {
??????????????????? int num = new ???? Integer(this.age).compareTo(new Integer(stu.age));
??????????????????? if(num==0)
???????????????????????? return this.name.compareTo(stu.name);
??????????????????? return num;
?????????????? }??????????????
????????? }
????????? public class HashMapDemo1 {
?????????????? public static void main(String[] args) {
??????????????????????????????????
??????????????????? Map<Student , String> tmap = new TreeMap<Student , String>();
??????????????????? tmap.put(new Student("001",20), "beijing");
??????????????????? tmap.put(new Student("002",25), "hebei");
??????????????????? tmap.put(new Student("003",50), "hainan");
??????????????????? tmap.put(new Student("001",20), "beijing");
???????????????????
??????????????????? System.out.println(tmap.size());
??????????????????? Set<Student> keySet1 = tmap.keySet();
??????????????????? Iterator<Student> it1 = keySet1.iterator();
??????????????????? while(it1.hasNext()){
???????????????????????? Student stu = it1.next();
???????????????????????? String addr = tmap.get(stu);
???????????????????????? System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr);?????????
??????????????????? }
?????????????? }
????????? }
????
???? **Iterator:對collection進行迭代的迭代器.迭代器取代了Enumeration。
????????? 迭代器和枚舉的區(qū)別:
????????? 迭代器允許調(diào)用者利用定義良好的語義在迭代期間從迭代器所指向的collection移除元素
????????? 方法名稱得到了改進,簡化書寫
???? **LisIterator:系列表迭代器,允許程序員按任一方向遍歷列表、迭代期間修改列表?????????
???? **Comparable:此接口強行對實現(xiàn)它的每個類的對象進行整體自然排序。使元素具備比較性
???? **Comparator:強行對某個對象collection進行整體排序的比較函數(shù),使集合具備比較性
???? **Collections:此類完全由在 collection 上進行操作或返回 collection 的靜態(tài)方法組成。
???? **Arrays:此類包含用來操作數(shù)組(比如排序和搜索)的各種靜態(tài)方法
7、集合類各容器方法:
**接口Collection方法摘要(沒有構(gòu)造方法)?????????
???? a)添加:??????????????????????????????????
????????? i.? boolean add(E e)??????????????????????????????????
????????? j.? boolean addAll(Collection c)
???? b)刪除:
????????? i.? void clear():清空容器
????????? j.? boolean remove(Objec object):
????????? k.? boolean removeAll(Collection c):
???? c)判斷:
????????? i.? boolean contains(Object object):判斷是否包含此元素
????????? j.? boolean containsAll(Collection c):判斷是否包含一堆元素
????????? k.? boolean equals(Object object):比較此collection與指定對象是否相等
????????? m.? boolean isEmpty():判斷是否集合為空
???? d)獲取:
????????? h.? Iterator iterator():取出
????????? i.? int hashCode():返回此collection的哈希值
????????? j.? int size():返回此collection中元素的個數(shù)
????????? k.? boolean retainAll(Collection c):取交集
????????? m.? Object toArray():返回此collection中所有元素的數(shù)組
????????? n.? T[] toArray(T[] a):返回包含此collection中所有元素的數(shù)值。
*****List集合子類及其方法
???? (1)List接口是Collection接口的一個子接口。
???? (2)List接口中的元素有如下特點(對角標的操作都是特有方法,因為有序):
????????? A:元素有序(存儲順序和取出順序一致)
????????? B:元素可以重復
???? (3)List接口中的特有方法
????????? A:add(int index,Object obj):在指定位置加入元素
????????? B:remove(int index):移除指定位置的元素
????????? C:set(int index,Object obj):修改指定位置的元素
????????? D:get(int index):獲取指定位置的元素
????????? E:indexOf(Object obj):獲取指定元素的位置
????????? F:subList(int start,int end):從一個大的List中截取一個小的List
????????? G:listIterator():返回一個List接口特有的迭代器
(1)、ArrayList:
??? |--->構(gòu)造方法摘要:(少用,不是重點)
???? ArrayList():構(gòu)造一個初始容量為 10 的空列表。
???? ArrayList(Collection<? extends E> c): 構(gòu)造一個包含指定 collection 的元素的列表,????????????????????????????? ??
???? ArrayList(int initialCapacity): 構(gòu)造一個具有指定初始容量的空列表。
??? |--->方法摘要:
???? |--->添加:
???? boolean add(E e): 將指定的元素添加到此列表的尾部。
???? void add(int index, E element): 將指定的元素插入此列表中的指定位置。
???? boolean addAll(Collection<? extends E> c):按照指定 collection 的迭代器所返回的元素順序,
????????????????????????????? 將該 collection 中的所有元素添加到此列表的尾部
???? boolean addAll(int index, Collection<? extends E> c): 從指定的位置開始,將指定 collection
?????????????????????????????????? ?????? 中的所有元素插入到此列表中。
???? |--->刪除:
???? void clear(): 移除此列表中的所有元素。
???? E remove(int index): 移除此列表中指定位置上的元素。
???? boolean remove(Object o): 移除此列表中首次出現(xiàn)的指定元素(如果存在)。
???? protected? void removeRange(int fromIndex, int toIndex):
?????????????? 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
???? boolean removeAll(Collection<?> c): 從列表中移除指定 collection 中包含的其所有元素
???? |--->獲取:
???? E get(int index): 返回此列表中指定位置上的元素。
???? int indexOf(Object o): 返回此列表中首次出現(xiàn)的指定元素的索引,或如果此列表不包含元素,則返回 -1。
???? int lastIndexOf(Object o) 返回此列表中最后一次出現(xiàn)的指定元素的索引,或如果此列表不包含索引,則返回 -1。??
???? public List<E> subList(int fromIndex,int toIndex): 返回列表中指定的 fromIndex(包括 )????????????????????????????????????????????????? ?? 和 toIndex(不包括)之間的部分視圖。
???? Iterator<E> iterator(): 返回按適當順序在列表的元素上進行迭代的迭代器。
???? ListIterator<E> listIterator(int index):返回列表中元素的列表迭代器(按適當順序),從列表的指定位置開始。
???? |--->修改:(特有方法!!)
????????? E set(int index, E element): 用指定的元素替代此列表中指定位置上的元素。
(2)LinkedList:
???? |--->構(gòu)造方法摘要:
????????? LinkedList(): 構(gòu)造一個空列表。
????????? LinkedList(Collection<? extends E> c): 構(gòu)造一個包含指定 collection 中的元素的列表,
????????????????????????????? ?????? 這些元素按其 collection 的迭代器返回的順序排列。
???? |--->方法摘要:(特有的)
????????? |--->添加
?????????????? void addFirst(E e): 將指定元素插入此列表的開頭。
?????????????? void addLast(E e): 將指定元素添加到此列表的結(jié)尾。
????????? |--->獲取元素,但不刪除元素
?????????????? E get(int index): 返回此列表中指定位置處的元素。??????????
?????????????? E getFirst(): 返回此列表的第一個元素。?????????
?????????????? E getLast(): 返回此列表的最后一個元素。
????????? |--->獲取元素且刪除元素
?????????????? E remove(): 獲取并移除此列表的頭(第一個元素)。?????????
?????????????? E remove(int index): 移除此列表中指定位置處的元素。????????
?????????????? boolean remove(Object o): 從此列表中移除首次出現(xiàn)的指定元素(如果存在)。????????
?????????????? E removeFirst(): 移除并返回此列表的第一個元素。
?????????????? E removeLast(): 移除并返回此列表的最后一個元素。
????????? |--->修改
?????????????? E set(int index, E element) 將此列表中指定位置的元素替換為指定的元素。
(3)Vector
???? |--->構(gòu)造方法摘要:
????????? Vector(): 構(gòu)造一個空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10,其標準容量增量為零。?????????
????????? Vector(Collection<? extends E> c):? 構(gòu)造一個包含指定 collection 中的元素的向量,
????????????????????????????? ??? 這些元素按其 collection 的迭代器返回元素的順序排列。
???? |--->方法摘要:
????????? |--->添加:
?????????????? boolean add(E e): 將指定元素添加到此向量的末尾。
?????????????? void add(int index, E element): 在此向量的指定位置插入指定的元素。????????
?????????????? boolean addAll(Collection<? extends E> c):
???????????????????????? 將指定 Collection 中的所有元素添加到此向量的末尾,
???????????????????????? 按照指定 collection 的迭代器所返回的順序添加這些元素。
?????????????? boolean addAll(int index, Collection<? extends E> c): 在指定位置將指定 Collection 中的所有元素插入到此向量中。
????????? |--->獲取:
?????????????? Enumeration<E> elements(): 返回此向量的組件的枚舉。
?????????????? ?? Vector特有的取出方式:
?????????????? ?? 枚舉和迭代器很像,其實枚舉和迭代器是一樣的,只是因為枚舉的名稱和方法的名稱
?????????????? ?? 名字都過長,所以枚舉被迭代器取代了。
?????????????? |--->枚舉Enumeration的方法摘要:
??????????????????? boolean hasMoreElements(): 測試此枚舉是否包含更多的元素。
??????????????????? E nextElement(): 如果此枚舉對象至少還有一個可提供的元素,
????????????????????????????? ? 則返回此枚舉的下一個元素。
*****Set集合子類及其方法
(1)HashSet:它不保證set的迭代順序;特別是它不保證該順序恒久不變.此類允許使用null元素。
???? |--->構(gòu)造方法:
????????? HashSet() 構(gòu)造一個新的空 set,其底層 HashMap 實例的默認初始容量是 16,加載因子是 0.75。
????????? HashSet(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 中的元素的新 set。
???? |--->方法摘要:
????????? boolean add(E e) 如果此 set 中尚未包含指定元素,則添加指定元素。??
????????? void clear() 從此 set 中移除所有元素。???? ?
????????? Object clone() 返回此 HashSet 實例的淺表副本:并沒有復制這些元素本身。 ???? ?
????????? boolean contains(Object o) 如果此 set 包含指定元素,則返回 true。 ???? ?
????????? boolean isEmpty() 如果此 set 不包含任何元素,則返回 true。 ???? ?
????????? Iterator<E> iterator() 返回對此 set 中元素進行迭代的迭代器。 ???? ?
????????? boolean remove(Object o) 如果指定元素存在于此 set 中,則將其移除。???? ??
????????? int size() 返回此 set 中的元素的數(shù)量(set 的容量)。?
(2)TreeSet:使用元素的自然順序?qū)υ剡M行排序,或者根據(jù)創(chuàng)建 set 時提供的 Comparator 進行排序.
???? |--->構(gòu)造方法:
????????? TreeSet() 構(gòu)造一個新的空 set,該set根據(jù)其元素的自然順序進行排序。?????????
????????? TreeSet(Collection<? extends E> c)
?????????????? 構(gòu)造一個包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進行排序。
????????? TreeSet(Comparator<? super E> comparator)? 構(gòu)造一個新的空 TreeSet,它根據(jù)指定比較器進行排序。
???? |--->方法摘要:
????????? 添加:
????????? boolean add(E e)? 將指定的元素添加到此 set(如果該元素尚未存在于 set 中)。
????????? boolean addAll(Collection<? extends E> c) 將指定 collection 中的所有元素添加到此 set 中。
????????? 刪除:
????????? ? void clear() 移除此 set 中的所有元素。
????????? ? boolean remove(Object o)? 將指定的元素從 set 中移除(如果該元素存在于此 set 中)。
????????? ? E pollFirst() 獲取并移除第一個(最低)元素;如果此 set 為空,則返回 null。
????????? ? E pollLast() 獲取并移除最后一個(最高)元素;如果此 set 為空,則返回 null。
????????? 獲取:
????????? ? Iterator<E> iterator()? 返回在此 set 中的元素上按升序進行迭代的迭代器。
????????? ? E first() 返回此 set 中當前第一個(最低)元素。
????????? ? E last() 返回此 set 中當前最后一個(最高)元素。
????????? ? int size()? 返回 set 中的元素數(shù)(set 的容量)。
????????? 判斷:
????????? boolean isEmpty()? 如果此 set 不包含任何元素,則返回 true。
????????? boolean contains(Object o) 如果此 set 包含指定的元素,則返回 true。
**Map:將鍵映射到值的對象。Map集合沒有迭代器!Map集合特點:該集合存儲鍵值對。而且鍵是唯一的。
???? |--->方法摘要:
???? ?? |--->添加:
???? ????? V put(K key, V value) 將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作)。??????????
???? ????? void putAll(Map<? extends K,? extends V> m) 從指定映射中將所有映射關(guān)系復制到此映射中
???? ?? |--->刪除:
????????????? void clear()? 從此映射中移除所有映射關(guān)系(可選操作)。
???? ????? V remove(Object key) 如果存在一個鍵的映射關(guān)系,則將其從此映射中移除(可選操作)。
???? ?? |--->判斷
???? ????? boolean containsKey(Object key) 如果此映射包含指定鍵的映射關(guān)系,則返回 true。
????????????? boolean containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true。
????????????? boolean isEmpty() 如果此映射未包含鍵-值映射關(guān)系,則返回 true。
?????????? |--->獲取
???? ????? int size() 返回此映射中的鍵-值映射關(guān)系數(shù)。
????????????? Collection<V> values()? 返回此映射中包含的值的 Collection 視圖。
????? 重點:Map集合沒有迭代器,以下是Map的兩種取出方式:
????? 第一種:Set<K> keySet()
????????? 返回此映射中包含的鍵的Set視圖,將Map集合中所有的鍵存入Set集合,然后再通過Set集合的
????????? 迭代器取出所有的鍵,再根據(jù)get方法獲取每個鍵的值;
????? 第二種:Set<Map.Entry<K,V>> entrySet()
????????? 返回此映射中包含的映射關(guān)系的Set視圖,將Map集合中的映射關(guān)系存入到Set集合中,
????????? 這個映射關(guān)系的數(shù)據(jù)類型是Map.entry,再通過Map.Entry類的方法再要取出關(guān)系里面的鍵和值
????????? Map.Entry的方法摘要:
?????????????? boolean equals(Object o)? 比較指定對象與此項的相等性。?????????????? ?
?????????????? K getKey()? 返回與此項對應的鍵。?????????????? ?
?????????????? V getValue() 返回與此項對應的值。?????????????? ??
?????????????? int hashCode() 返回此映射項的哈希碼值。
?????????????? V setValue(V value) 用指定的值替換與此項對應的值(特有!!!)。
8、Map集合和Collection集合的區(qū)別?
???? 1,
???? Map中一次存儲是鍵值對。
???? Collection中一次存儲是單個元素。
???? 2,
???? Map的存儲使用的put方法。
???? Collection存儲使用的是add方法。
???? 3,
???? Map集合沒有迭代器,Map的取出,是將Map轉(zhuǎn)成Set,在使用迭代器取出。
???? Collection取出,使用就是迭代器。
???? 4,
???? 如果對象很多,必須使用集合存儲。
???? 如果元素存在著映射關(guān)系,可以優(yōu)先考慮使用Map存儲或者用數(shù)組,
???? 如果沒有映射關(guān)系,可以使用Collection存儲。
8、迭代器:Iterator(Map集合沒有迭代器)
???? (1)迭代器就是取出集合元素的方式
???? (2)迭代器的作用
????????? 因為每個集合中元素的取出方式都不一樣,于是就把元素的取出方式進行抽取,并定義在集合內(nèi)部,
????????? 這樣取出方式就可以直接訪問集合內(nèi)部的元素;
????????? 而每個容器的數(shù)據(jù)結(jié)構(gòu)不同,所以取出動作的細節(jié)也不一樣,但是有共性內(nèi)容:判斷和取出。
????????? 那么就將共性內(nèi)容進行抽取,從而形成了接口Iterater
???? (3)獲取迭代器的方法:
????????? Iterator<E> iterator() 返回在此 collection 的元素上進行迭代的迭代器。
????????? Iterator<E> iterator() 返回在此 set 中的元素上進行迭代的迭代器。?????
???? (3)迭代器方法:
????????? boolean hasNext() 如果仍有元素可以迭代,則返回 true。
????????? E next() 返回迭代的下一個元素。??????
????????? void remove() 從迭代器指向的collection中移除迭代器返回的最后一個元素(可選操作)。
9、列表迭代器:ListIterator
???? (1)List集合特有的迭代器ListIterator是Iterator的子接口,在迭代時,不可以通過集合對象的
???? ?? 方法操作集合中的元素,因為會發(fā)生ConcurrentModificationException(當方法檢測到對象的并發(fā)修改,
???? ?? 但不允許這種修改時,拋出此異常)
???? (2)Iterator方法有限,只能對元素進行判斷、取出和刪除的操作
???? ?? ListIterator可以對元素進行添加和修改動作等。
???? (3)獲取列表迭代器方法:
????????? ListIterator<E> listIterator() 返回此列表元素的列表迭代器(按適當順序)。
????????? ListIterator<E> listIterator(int index)
?????????????? 返回此列表中的元素的列表迭代器(按適當順序),從列表中指定位置開始。
???? (4)列表迭代器方法:
????????? void add(E e) 將指定的元素插入列表(可選操作)。
????????? boolean hasPrevious()? 如果以逆向遍歷列表,列表迭代器有多個元素,則返回 true。
????????? int nextIndex() 返回對 next 的后續(xù)調(diào)用所返回元素的索引。????????
????????? E previous() 返回列表中的前一個元素。 ???? ?
????????? int previousIndex() 返回對 previous 的后續(xù)調(diào)用所返回元素的索引。 ???? ?
????????? void set(E e) 用指定元素替換 next 或 previous 返回的最后一個元素(可選操作)。
10、堆棧和隊列
???? 堆棧:先進后出,比如杯子里的水
???? 隊列:先進先出,比如水管的水
11、集合類各種容器的使用注意細節(jié):
???? (1)迭代器:
????????? **迭代器的next方法是自動向下取元素,要避免出現(xiàn)NoSuchElementException。
????????? ? 也就是在迭代循環(huán)中調(diào)用一次next方法一次就要hasNext判斷一次,比如語句
????????? ? sop(it.next()+"..."+it.next())會發(fā)生上述異常。
????????? **迭代器的next方法返回值類型是Object,所以要記得類型轉(zhuǎn)換,應用泛型后就不用強轉(zhuǎn)
???? (2)List集合:
????????? **List集合里面的元素因為是帶角標,所以List集合里面的元素都是有序的,
????????? ? 另外List集合可以包含重復元素,也可以包含null。?
????????? **List集合有迭代器Iterator,還有一個特有迭代器列表ListIterator
????????? **List集合中判斷元素是否相同都是用equals方法,無論contains、remove都依賴equals方法
????????? ? 比如往ArrayList集合里面存放學生,同名同年齡視為同一個人,此時就需要在學生類復寫Object類
????????? ? 里面的equals方法(非常重要!!!要注意!!)
???? (3)Set集合:
????????? **Set接口里面存放的是元素是無序的,不可以有重復元素,可以包含null
????????? **Set集合只有一種取出方式,就是迭代器Iterator
????????? **Set集合功能和Collection是一致的,沒有特殊方法
???? ??? |--->HashSet:
????????? **集合里面存放的元素是無序的,唯一的
????????? **底層數(shù)據(jù)結(jié)構(gòu)是哈希表,哈希表結(jié)構(gòu)的數(shù)據(jù)都是無序的,哈希表結(jié)構(gòu)的操作效率都高效
????????? **線程不同步
????????? **保證元素唯一性的原理是:通過復寫hashCode和equals方法
?????????????? ****如果兩元素的hashCode值相同,則繼續(xù)判斷兩元素equals是否為真
?????????????? ****如果兩元素的hashCode值不同,則不會調(diào)用equals方法。
????????? **當我們往HashSet集合存放自定義的元素時(比如學生對象),通常都要復寫hashCode和equals方法,
????????? ? 而且hashCode和equals方法不通過我們調(diào)用,HashSet集合底層內(nèi)部自己調(diào)用,自己拿元素去比較
???? ??? |--->TreeSet
????????? **TreeSet集合可以對存放的元素進行排序,彌補了Set集合元素無序的缺點,且元素是唯一的
????????? **底層數(shù)據(jù)結(jié)構(gòu)是二叉樹,二叉樹結(jié)構(gòu)都是有序的
????????? **線程不同步
????????? **TreeSet集合要求往集合里存放的元素自身具備比較性,否則會報錯
????????? **TreeSet集合保證元素唯一性的依據(jù)是:通過compareTo或者compare方法中的來保證元素的唯一性。
?????????????? TreeSet排序的第一種方式:讓元素自身具備比較性,
????????????????????????????? 定義元素類實現(xiàn)Compareble接口,覆蓋compare方法,
????????????????????????????? 此方式是元素的自然順序。
?????????????? TreeSet排序的第二種方式:讓集合具備比較性
????????????????????????????? 當元素自身不具備比較性或者具備的比較性不是
????????????????????????????? 我們所需要的比較性時,此時就需要讓集合具備自定義的比較性。
????????????????????????????? 那如何讓集合自身具備比較性呢?
????????????????????????????? 可在集合初始化時,就讓集合具備比較方式。
????????????????????????????? 即定義一個類,實現(xiàn)Comparator接口,覆蓋compare方法。
?????????????? 注:
?????????????? **判斷元素唯一時,當主要條件一樣時,判斷次要條件
?????????????? **兩種排序方式都在時,以比較器為主!!!
???? (4)Map集合:
????????? |--Hashtable
?????????????? 底層是哈希表結(jié)構(gòu)
?????????????? 線程安全的,并且鍵和值不能為null。
????????? |--HashMap
?????????????? 底層是哈希表結(jié)構(gòu)
?????????????? 線程不安全的,鍵和值可以為null。
?????????????? |--LinkedHashMap
??????????????????? 底層是鏈表和哈希表
??????????????????? 線程不安全
????????? |--TreeMap
?????????????? 底層是二叉樹
?????????????? 線程不安全的
12、如果你想將一組對象按一定順序存取,在不考慮并發(fā)訪問的情況下會使用____C_____ ,
???? 反之則會使用____A_____;如果你想存儲一組無序但唯一的對象,你會使用___B______ ;
???? 如果你想按關(guān)鍵字對對象進行存取,在不考慮并發(fā)訪問的情況下會使用___D______ ,反之則會使用_____E____。
A. Vector
B. HashSet
C. ArrayList
D. HashMap
E. Hashtable
13、泛型:
???? (1)為什么會出現(xiàn)泛型?
????????? 因為集合存放的數(shù)據(jù)類型不固定,故往集合里面存放元素時,存在安全隱患,
????????? 如果在定義集合時,可以想定義數(shù)組一樣指定數(shù)據(jù)類型,那么就可以解決該類安全問題。
????????? JDK1.5后出現(xiàn)了泛型,用于解決集合框架的安全問題。
????????? 泛型是一個類型安全機制。
???? (2)泛型定義格式:通過<>來定義要操作的引用數(shù)據(jù)類型
????????? ArrayList<String> al = new ArrayList<String>;
???? (3)泛型的好處:
????????? **將運行時期出現(xiàn)的ClassCastException(類型轉(zhuǎn)換異常)問題轉(zhuǎn)移到編譯時期;
????????? **避免了強制轉(zhuǎn)換的麻煩
???? (4)什么時候定義泛型?
????????? 泛型在集合框架中很常見,只要見到<>就要定義泛型。其實<>就是用來接收類型的。
????????? 當使用集合時,將集合中要存儲的數(shù)據(jù)類型作為參數(shù)傳遞到<>中即可
???? (5)泛型的形式
????????? **泛型類:即自定義泛型類
?????????????? A:當類中要操作的引用數(shù)據(jù)類型不確定時,早起定義Object來完成擴展,現(xiàn)在定義泛型來完成
?????????????? B:局限性:泛型類定義的泛型,在整個類中有效,如果該泛型類的方法被調(diào)用,
?????????????? ?? 當泛型類的對象明確要操作的類型后,所有要操作的類型就被固定。
????????? **泛型方法:泛型放在返回值前面,修飾符的后面
?????????????? A:為了避免泛型類的局限性,讓不同方法可以操作不同的類型,而且類型還不確定,
?????????????? ? 則可以將泛型定義在方法上
?????????????? B:特殊之處:靜態(tài)方法不可以反問類上定義的泛型
?????????????? ? 如果靜態(tài)方法操作的應用數(shù)據(jù)類型不確定,可以講泛型定義在靜態(tài)方法上
????????? **泛型接口:
?????????????? 當泛型定義在接口上時,則子類中要指定實現(xiàn)接口類型,同時還可以子類也可以定義為泛型類
???? (6)泛型的高級應用:?通配符
????????? **當指定兩種泛型的集合,則迭代時也要定義兩種泛型的迭代器,麻煩,此時可通過將迭代器的泛型
????????? ? 改為?,如Iterator<?> it=al.iterator();
????????? **兩種泛型限定
?????????????? 向上限定: ? extends E? ;E可以接收E類型或者E的子類
?????????????? 向下限定: ? super E? ;E可以接收E類型或者E的父類
14、高級for循環(huán)
???? (1)JDK1.5新特性,代替迭代器使用時的不爽,簡化書寫,底層原理是迭代器凡是支持迭代器的都支持高級for循環(huán)
???? ?? 高級for循環(huán),只用于集合和數(shù)組的遍歷,集合只能用Collection不能用Map集合
???? ?? 只能把Map集合轉(zhuǎn)化成Set集合,才能用for循環(huán)。
???? (2)格式
????????? for(數(shù)據(jù)類型 變量名:被遍歷的集合(Collection)或者數(shù)組)
????????? {
??????????????
????????? }
??????? (3)局限性:
????????? 必須要有遍歷的目標
????????? 對集合或者數(shù)組進行遍歷時,只能獲取集合元素,不能對集合元素進行操作
????????? 迭代器除了遍歷,還可以進行remove操作集合中的元素
????????? 列表迭代器還可以在遍歷過程中進行增刪改查的操作
???? (4)傳統(tǒng)for循環(huán)和高級for循環(huán)的區(qū)別
????????? 高級for循環(huán)有一個局限性,就是必須要有遍歷的目標(集合或者數(shù)組)
????????? 遍歷數(shù)組時建議使用傳統(tǒng)for循環(huán),因為可以定義角標,比如打印100次helloworld時用傳統(tǒng)for循環(huán)方便
15、可變參數(shù)
???? (1)數(shù)組的可變參數(shù)
????????? 格式:
?????????????? int... arr
???? (3)方法的可變參數(shù)
????????? 格式:
?????????????? public static void show(String str,int... arr)
?????????????? {
?????????????? }
????????? 注意:可變參數(shù)一定要放在參數(shù)列表的最后面
16、靜態(tài)導入:
???? **import static java.util.Arrays.*? 導入的是Arrays這個類中所有的靜態(tài)方法
???? **當類名重名時,需要制定具體的報名
???? **當方法重名時,需要制定具體所屬的對象或者類
17、Collections類:
???? (1)此類完全由在 collection 上進行操作或返回 collection 的靜態(tài)方法組成。
???? (2)靜態(tài)方法摘要:
????????? static <T> boolean addAll(Collection<? super T> c, T... elements)
?????????????? 將所有指定元素添加到指定 collection 中。
????????? static <T> void fill(List<? super T> list, T obj)
?????????????? 使用指定元素替換指定列表中的所有元素。
????????? static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
?????????????? 使用另一個值替換列表中出現(xiàn)的所有某一指定值。
????????? static void reverse(List<?> list)
?????????????? 反轉(zhuǎn)指定列表中元素的順序。
????????? static <T> Comparator<T>? reverseOrder()
?????????????? 返回一個比較器,它強行逆轉(zhuǎn)實現(xiàn)了 Comparable 接口的對象 collection 的自然順序
????????? static <T> Comparator<T> reverseOrder(Comparator<T> cmp)
?????????????? 返回一個比較器,它強行逆轉(zhuǎn)指定比較器的順序。
???? (3)Collections類特牛的方法:
????????? 集合有一個共同的缺點,那就是線程不安全,被多線程操作時,容易出現(xiàn)問題,雖然可以自己加鎖
????????? 但是麻煩。Collections提供特牛的方法,就是給它一個不同步的集合,它返回一個同步的安全的集合
????????? static <T> Collection<T> synchronizedCollection(Collection<T> c)
?????????????? 返回指定 collection 支持的同步(線程安全的)collection。
????????? static <T> List<T>? synchronizedList(List<T> list)
?????????????? 返回指定列表支持的同步(線程安全的)列表。
????????? static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
?????????????? 返回由指定映射支持的同步(線程安全的)映射。
????????? static <T> Set<T> synchronizedSet(Set<T> s)
?????????????? 返回指定 set 支持的同步(線程安全的)set。
????????? static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
?????????????? 返回指定有序映射支持的同步(線程安全的)有序映射。
????????? static <T> SortedSet<T>? synchronizedSortedSet(SortedSet<T> s)
?????????????? 返回指定有序 set 支持的同步(線程安全的)有序 set。
18、Arrays類:
???? 此類包含用來操作數(shù)組(比如排序和搜索)的各種方法。里面都是靜態(tài)方法。
???? 如果指定數(shù)組引用為 null,則此類中的方法都會拋出 NullPointerException。
???? (1)靜態(tài)方法摘要:
????????? static <T> List<T> asList(T... a)
?????????????? 返回一個受指定數(shù)組支持的固定大小的列表。
????????? 注意:
?????????????? A:該方法將一個數(shù)組變成集合后,不可以使用集合的增刪方法,因為數(shù)組的長度是固定的!
????????? ????????? 如果增刪,則發(fā)生UnsupportedOprationException(不支持操作異常)
?????????????? B:如果數(shù)組中的元素都是基本數(shù)據(jù)類型,則該數(shù)組變成集合時,會將該數(shù)組作為集合的一個
?????????????? ? 元素出入集合
?????????????? C:如果數(shù)組中的元素都是對象,如String,那么數(shù)組變成集合后,數(shù)組中的元素就直接轉(zhuǎn)成
?????????????? ? 集合中的元素
19、數(shù)組變集合以及集合變數(shù)組的對比:
???? (1)數(shù)組變集合:
????????? 方法:static <T> List<T> asList(T... a) 返回一個受指定數(shù)組支持的固定大小的列表。
????????? 好處:可以使用集合的思想和方法操作數(shù)組中的元素,數(shù)組是一個對象,但是數(shù)組中的功能很少
???? (2)集合變數(shù)組:
????????? 方法:Collction中的toArray方法
????????? 好處:可以限定對集合元素的操作,防止對集合的元素進行增刪,因為數(shù)組長度是固定的。
20、Collections類和Arrays類的使用。(重點)
???? A:Collections
????????? 排序
????????? 二分查找
????????? 發(fā)轉(zhuǎn)
???? B:Arrays
????????? 把數(shù)組變成字符串輸出
????????? 排序
????????? 二分查找
21、System:
???? (1)描述系統(tǒng)信息的類
???? (2)該類沒有構(gòu)造方法,該類的方法和屬性都是靜態(tài)的
???? (3)字段摘要:
????????? static InputStream in? “標準”輸入流。??
????????? static PrintStream out? “標準”輸出流。????????
???? (4)方法摘要:
????????? static void exit(int status) 終止當前正在運行的 Java 虛擬機。
????????? static void gc() 運行垃圾回收器。
????????? static Properties getProperties()? 確定當前的系統(tǒng)屬性?????????
????????? static String getProperty(String key) 獲取指定鍵指示的系統(tǒng)屬性。????
????????? static String getProperty(String key, String def) 獲取用指定鍵描述的系統(tǒng)屬性。
????????? static void setIn(InputStream in) 重新分配“標準”輸入流。??????????
????????? static void setOut(PrintStream out) 重新分配“標準”輸出流。
????????? static void setProperties(Properties props) 將系統(tǒng)屬性設(shè)置為 Properties 參數(shù)。??????????
????????? static String setProperty(String key, String value) 設(shè)置指定鍵指示的系統(tǒng)屬性。
22、Runtime:
???? (1)每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環(huán)境相連接。
???? ?? 可以通過 getRuntime 方法獲取當前運行時。 應用程序不能創(chuàng)建自己的 Runtime 類實例。
???? (2)該類沒有構(gòu)造函數(shù),也就是它不能直接創(chuàng)建對象,但是它里里面的方法又不是靜態(tài)的
???? ?? ,故它一定有一個方法返回本類對象
???? (3)故該類是單例設(shè)計模式,保證在內(nèi)存中只有一個對象
???? (4)方法摘要:
????????? Process exec(String command) 在單獨的進程中執(zhí)行指定的字符串命令
????????? void gc() 運行垃圾回收器。
????????? static Runtime getRuntime() 返回與當前 Java 應用程序相關(guān)的運行時對象
????????? void exit(int status) 通過啟動虛擬機的關(guān)閉序列,終止當前正在運行的 Java 虛擬機
23、Date:
???? (1)Date接口表示特定的瞬間,精確到毫秒
???? (2)構(gòu)造方法
????????? Date() 分配 Date 對象并初始化此對象,以表示分配它的時間(精確到毫秒)。
????????? Date(long date) 分配Date對象并初始化此對象,以表示自從標準基準時間(稱為“歷元(epoch)”,
?????????????? 即1970年1月1日00:00:00GMT)以來的指定毫秒數(shù)。
???? (3)方法摘要:
????????? int compareTo(Date anotherDate) 比較兩個日期的順序。?????????
????????? boolean equals(Object obj) 比較兩個日期的相等性。
24、Calendar:
???? (1)直接已知子類: GregorianCalendar
???? (2)構(gòu)造方法:
????????? protected? Calendar() 構(gòu)造一個帶有默認時區(qū)和語言環(huán)境的 Calendar。????????
????????? protected? Calendar(TimeZone zone, Locale aLocale)? 構(gòu)造一個帶有指定時區(qū)和語言環(huán)境的 Calendar。????????
???? (3)方法摘要:
????????? static Calendar getInstance() 使用默認時區(qū)和語言環(huán)境獲得一個日歷。
四、jdk1.5的新特性
???? (1)靜態(tài)導入:
????????? **import語句可以導入一個類或某個包中的所有類
????????? **import static語句導入一個類中的某個靜態(tài)方法或所有靜態(tài)方法
????????? ? 靜態(tài)導入后,靜態(tài)方法前面就不用寫類名.方法的方式類調(diào)用
????????? **語法舉例:
?????????????? import static java.lang.Math.sin;//導入一個靜態(tài)方法
?????????????? import static java.lang.Math.*; //導入一個類中的所有靜態(tài)方法
????????? **靜態(tài)導入使用注意:
?????????????? 當類名重復時,需要制定具體的包名;
?????????????? 當方法重名時,需要制定具體所屬的對象或者類
???? (2)可變參數(shù):
????????? **可變參數(shù)的特點:
?????????????? *可變參數(shù)只能出現(xiàn)在參數(shù)列表的最后;
?????????????? *...位于變量類型和變量名之間,前后有無空格都可以;
?????????????? *調(diào)用可變參數(shù)的方法時,編譯器為該可變參數(shù)隱含創(chuàng)建一個數(shù)組,
?????????????? 在方法體中以數(shù)組的形式訪問可變參數(shù)。
????????? **可變參數(shù)舉例:
?????????????? *變量類型... 變量名 如 int... arr 表示可變參數(shù)數(shù)組
?????????????? *public static void show(String str , int... arr){}
???? (3)增強for循環(huán):
????????? **語法:
?????????????? for ( type 變量名:集合變量名 )? { … }
????????? **注意事項:
?????????????? 迭代變量必須在( )中定義!
?????????????? 集合變量可以是數(shù)組或?qū)崿F(xiàn)了Iterable接口的集合類
????????? **舉例:
?????????????? public static int add(int x,int ...args) {
??????????????????? int sum = x;
??????????????????? for(int arg:args) {
???????????????????????? sum += arg;
??????????????????? }
??????????????????? return sum;
?????????????? }
????????? **增強for循環(huán)代替了迭代器使用的不爽,簡化書寫
????????? **增強for循環(huán)局限性:
?????????????? 對集合或者數(shù)組進行遍歷時,只能取元素,不能對集合進行操作
???? (4)基本數(shù)據(jù)類型的自動裝箱和拆箱
????????? **基本數(shù)據(jù)類型
?????????????? byte???? --->???? Byte
?????????????? short???? --->???? Short
?????????????? int???? --->???? Integer
?????????????? long???? --->???? Long
?????????????? float???? --->???? Float
?????????????? double???? --->???? Double
?????????????? char???? --->???? Character
?????????????? boolean???? --->???? Boolean
????????? **例子:
?????????????? **裝箱:自動把一個基本數(shù)據(jù)類型的數(shù)據(jù)裝箱成一個該類型數(shù)據(jù)的對象引用
??????????????????? Integer i = 3;(jdk1.5之前這樣寫是不行的,編譯報錯)
?????????????? **拆箱:自動把一個基本數(shù)據(jù)類型的對象引用拆箱成一個基本數(shù)據(jù)類型的數(shù)據(jù),再參與運算
??????????????????? Integer i = 12;
??????????????????? sop(i+4);
?????????????? **享元模式:
??????????????????? Integer num1 = 12;
??????????????????? Integer num2 = 12;
??????????????????? System.out.println(num1 == num2);//打印true
??????????????????? Integer num5 = Integer.valueOf(12);
??????????????????? Integer num6 = Integer.valueOf(12);
??????????????????? System.out.println(num5 == num6);//打印true
??????????????????? Integer num3 = 129;
??????????????????? Integer num4 = 129;
??????????????????? System.out.println(num3 == num4);//打印false
??????????????????? 為什么前面的返回true而后面的運算返回false呢?
??????????????????? 對于基本數(shù)據(jù)類型的整數(shù),裝箱成Integer對象時,如果該數(shù)值在一個字節(jié)內(nèi),(-128~127),
??????????????????? 一旦裝箱成Integer對象后,就把它緩存到磁里面,當下次,又把該數(shù)值封裝成Integer對象時
??????????????????? 會先看磁里面有沒有該對象,有就直接拿出來用,這樣就節(jié)省了內(nèi)存空間。因為比較小的整數(shù),
??????????????????? 用的頻率比較高,就沒必要每個對象都分配一個內(nèi)存空間。
??????????????????? 這就是享元模式!比如26個英文字母,10個阿拉伯數(shù)字
???? (5)枚舉
????????? **為什么要有枚舉?
?????????????? 問題:要定義星期幾或性別的變量,該怎么定義?假設(shè)用1-7分別表示星期一到星期日,
?????????????? 但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。
?????????????? 枚舉就是要讓某個類型的變量的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。
?????????????? 枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,
?????????????? 普通變量的方式在開發(fā)階段無法實現(xiàn)這一目標。
????????? **用普通類如何實現(xiàn)枚舉的功能?定義一個Weekday類來模擬實現(xiàn):
?????????????? 步驟:
??????????????????? *私有化構(gòu)造方法
??????????????????? *每個元素分別用一個公有的靜態(tài)成員變量表示(public static final)
??????????????????? *可以有若干公有方法或抽象方法。采用抽象方法定義nextDay就將大量的if.else語句
??????????????????? 轉(zhuǎn)移成了一個個獨立的類。
????????? **枚舉的應用:
?????????????? 舉例:定義一個Weekday的枚舉。
?????????????? 擴展:枚舉類的values,valueOf,name,toString,ordinal等方法
?????????????? ???? (記住,講課時要先于自定義方法前介紹,講課更流暢)
?????????????? 總結(jié):枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象。
?????????????? ????? 例如可以調(diào)用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
????????? **枚舉的高級應用:
?????????????? **枚舉就相當于一個類,其中也可以定義構(gòu)造方法、成員變量、普通方法和抽象方法。
?????????????? **枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其他成員分隔。
?????????????? ? 把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。
?????????????? **帶構(gòu)造方法的枚舉
?????????????? ? 構(gòu)造方法必須定義成私有的
?????????????? ? 如果有多個構(gòu)造方法,該如何選擇哪個構(gòu)造方法?
?????????????? ? 枚舉元素MON和MON()的效果一樣,都是調(diào)用默認的構(gòu)造方法。
?????????????? **帶方法的枚舉
?????????????? ? 定義枚舉TrafficLamp
?????????????? ? 實現(xiàn)普通的next方法
?????????????? ? 實現(xiàn)抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,
?????????????? ? 這些子類采用類似內(nèi)部類的方式進行定義。增加上表示時間的構(gòu)造方法???? ?
?????????????? **枚舉只有一個成員時,就可以作為一種單例的實現(xiàn)方式。?????????
???? (6)泛型:
????????? **泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,
????????? ? 編譯器編譯帶類型說明的集合時會去除掉“類型”信息,使程序運行效率不受影響,
????????? ? 對于參數(shù)化的泛型類型,getClass()方法的返回值和原始類型完全一樣。
????????? ? 由于編譯生成的字節(jié)碼會去掉泛型的類型信息,只要能跳過編譯器,
????????? ? 就可以往某個泛型集合中加入其它類型的數(shù)據(jù),例如,用反射得到集合,再調(diào)用其add方法即可。
????????? **ArrayList<E>類定義和ArrayList<Integer>類引用中涉及如下術(shù)語:
?????????????? 整個稱為ArrayList<E>泛型類型
?????????????? ArrayList<E>中的E稱為類型變量或類型參數(shù)
?????????????? 整個ArrayList<Integer>稱為參數(shù)化的類型
?????????????? ArrayList<Integer>中的Integer稱為類型參數(shù)的實例或?qū)嶋H類型參數(shù)
?????????????? ArrayList<Integer>中的<>念著typeof
?????????????? ArrayList稱為原始類型
????????? **參數(shù)化類型與原始類型的兼容性:
?????????????? 參數(shù)化類型可以引用一個原始類型的對象,編譯報告警告,
?????????????? 例如,Collection<String> c = new Vector();//可不可以,不就是編譯器一句話的事嗎?
?????????????? 原始類型可以引用一個參數(shù)化類型的對象,編譯報告警告,
?????????????? 例如,Collection c = new Vector<String>();//原來的方法接受一個集合參數(shù),新的類型也要能傳進去
????????? **參數(shù)化類型不考慮類型參數(shù)的繼承關(guān)系:
?????????????? Vector<String> v = new Vector<Object>(); //錯誤!///不寫<Object>沒錯,寫了就是明知故犯
?????????????? Vector<Object> v = new Vector<String>(); //也錯誤!
?????????????? 編譯器不允許創(chuàng)建泛型變量的數(shù)組。即在創(chuàng)建數(shù)組實例時,
?????????????? 數(shù)組的元素不能使用參數(shù)化的類型,
?????????????? 例如,下面語句有錯誤:
??????????????????? Vector<Integer> vectorList[] = new Vector<Integer>[10];
????????? **泛型限定:
?????????????? **限定通配符的上邊界:
??????????????????? 正確:Vector<? extends Number> x = new Vector<Integer>();
??????????????????? 錯誤:Vector<? extends Number> x = new Vector<String>();
?????????????? **限定通配符的下邊界:
??????????????????? 正確:Vector<? super Integer> x = new Vector<Number>();
??????????????????? 錯誤:Vector<? super Integer> x = new Vector<Byte>();
?????????????? **提示:
??????????????????? 限定通配符總是包括自己。
??????????????????? ?只能用作引用,不能用它去給其他變量賦值
??????????????????? Vector<? extends Number> y = new Vector<Integer>();
??????????????????? Vector<Number> x = y;
??????????????????? 上面的代碼錯誤,原理與Vector<Object > x11 = new Vector<String>();相似,
??????????????????? 只能通過強制類型轉(zhuǎn)換方式來賦值。
轉(zhuǎn)載于:https://www.cnblogs.com/skyzcx520/p/3872243.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的javaSE_base04_集合框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【20190226】JavaScript
- 下一篇: POJ 1273 Drainage Di