動態引用儲存——集合&&精確的集合定義——泛型
前言:
對於面向物件的語言來說,為了方便對多個物件進行操作,就必須要對物件進行儲存。
使用陣列來儲存物件的最大問題就是陣列長度的固定性。(不靈活,難擴充套件)
Java集合又稱容器,可以動態的將物件的引用儲存在容器中。(靈活可擴充套件)
集合和陣列區別
陣列:
可以儲存同一型別的基本資料型別或者引用資料型別
長度固定
集合:
- 可以儲存不同型別的元素,但必須是引用資料型別
- 長度可變
集合概覽
Java集合類主要由Collection和Map派生而出。Collection是一個介面,是高度抽象出來的集合,它包含了集合的基本操作和屬性;Map是一個對映介面,即key-value鍵值對。
Collection
- List 有序可重複
- ArrayList
- LinkedList
- Vector
- Stack
- Set 無序不可重複
- HashSet
- LinkedSet
- TreeSet
ArrayList - LinkedList - Vector- Stack特點
- ArrayList : 非同步,執行緒不安全,執行效率高;底層使用陣列,存讀效率高,插入刪除效率低
- LinkedList:非同步,使用雙向連結串列,插入刪除效率高
- Vector: 同步,執行緒安全,執行效率較低
- Stack:繼承Vector
從資料增長的角度看:
ArrayList和Vector都是使用陣列(Array)來控制集合中的物件。
當你向兩種型別中增加元素的時候,如果元素的數目超過了內部陣列目前的長度他們都需要擴充套件內部陣列的長度。
Vector預設情況下自動增長原來一倍的陣列長度,ArrayList是原來的50%。
所以如果你要在集合中儲存大量的資料,那麼使用Vector有一些優勢。
HashSet- LinkedSet-TreeSet特點
HashSet由HashMap實現,存取,查詢效能強。
LinkedHashSet繼承HashSet。
TreeSet提供一個使用樹結構儲存Set介面的實現,物件以升序順序儲存,訪問和遍歷的時間很快。底層是TreeMap。
Map
- HashMap
- TreeMap
HashMap - TreeMap特點
HashMap通常比TreeMap快一點(樹和雜湊表的資料結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap。
HashMap的結果是沒有排序的,而TreeMap輸出的結果是排好序的。
Collection介面和Iterator介面常用方法
簡單使用:
1.HashSet
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Date currentDate = new Date();
HashSet hs= new HashSet();
//新增元素
hs.add(currentDate.toString());
hs.add(new String("2"));
hs.add("3");
hs.add("3");//不能包含重複元素,被自動覆蓋
System.out.println("for 迭代輸出");
for(Object element:hs)
{System.out.println(element); }
System.out.println("Iterator 迭代輸出");
Iterator iterator=hs.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
//刪除元素
hs.remove("2");
hs.remove(currentDate.toString());
System.out.println("刪除元素後輸出:");
for(Object element:hs)
{
System.out.println(element);
}
}
}
2.TreeSet
//TreeSet預設自動排序
import java.util.TreeSet;
import java.util.Iterator;
public class Main {
public static void main(String args[]) {
TreeSet tr = new TreeSet();
tr.add("B");
tr.add("A");
tr.add("D");
tr.add("E");
System.out.println("直接輸出集合物件");
System.out.println(tr);
System.out.println("for遍歷輸出");
for (Object element : tr) {
System.out.println(element);
}
System.out.println("Iterator迭代輸出");
Iterator iterator = tr.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
3.LinkedList
import java.util.LinkedList;
import java.util.Iterator;
public class Main
{
public static void main(String []args)
{
LinkedList li= new LinkedList();
li.addFirst("C");
li.addLast("D");
li.addFirst("B");
li.addLast("E");
li.addFirst("A");
li.addLast("F");
System.out.println( "直接輸出");
System.out.println(li);
System.out.println("--------------------");
System.out.println( "用for輸出");
for(Object str:li)
{System.out.println(str);}
System.out.println("--------------------");
System.out.println( "用迭代器輸出");
Iterator iterator= li.iterator();
while(iterator.hasNext())
{System.out.println(iterator.next());}
System.out.println("--------------------");
System.out.println("訪問");
System.out.println("peekFirst:"+li.peekFirst());//getFirst,getLast
System.out.println("peekLast:"+li.peekLast());
System.out.println("刪除");
System.out.println(li.removeFirst());//pollFirst,pollLast
System.out.println(li.removeLast());
System.out.println("--------------------");
System.out.println("用for輸出");
for(Object str:li)
{System.out.println(str);}
System.out.println("--------------------");
}
}
4.ArrayList
import java.util.ArrayList;
import java.util.Iterator;
public class Main
{
public static void main(String []args)
{
ArrayList list = new ArrayList();
list.add("A");//將指定的元素追加到此列表的尾部
list.add(1,"B");//插入列表的指定位置
list.add("C");
list.add("D");
list.add("E");
//for遍歷
System.out.println("for遍歷");
for(Object element:list)
{
System.out.println(element);
}
System.out.println("------------------");
//用迭代器遍歷
//獲取迭代器
System.out.println("迭代器遍歷");
Iterator iterator = list.iterator();
//如果仍有元素可以迭代,則返回 true。
while(iterator.hasNext())
{
System.out.println(iterator.next());// 返回迭代的下一個元素。
}
System.out.println("------------------");
//刪除元素remove
System.out.println("刪除前:");
for(Object element:list)
{
System.out.println(element);
}
list.remove(0);
list.remove(2);
System.out.println("------------------");
System.out.println("刪除後:");
for(Object element:list)
{
System.out.println(element);
}
}
}
5.HashMap
import java.util.HashMap;
public class Main
{
public static void main(String []args)
{
HashMap hs = new HashMap<>();
//寫入資料
System.out.println("寫入資料...");
System.out.println("...");
hs.put(1,"華晨宇");
hs.put(2,"周杰倫");
hs.put(3,"劉若英");
hs.put(4,"許嵩");
//讀取資料
System.out.println("讀取資料...");
System.out.println("...");
System.out.println(hs.get(1));
System.out.println(hs.get(2));
System.out.println(hs.get(3));
System.out.println(hs.get(4));
//刪除資料
System.out.println("...");
System.out.println("刪除資料...");
hs.remove(1);
System.out.println(hs.get(1));
}
}
小結:
集合的實現類多種多樣,但有一點不變,集合的主要作用是儲存物件,操作物件;根據具體實現類的儲存方式和操作效能特點來配合具體的應用場景是集合的正確開啟方式。
集合通用性導致的問題
當把一個元素丟進集合後,集合為了更好的通用性,都會編譯成Object類。
導致的問題:
- 不同物件儲存到同一指定集合的異常
- 取出集合中元素導致的強制型別轉換異常
什麼是泛型?
引數化型別!!!
什麼是引數化型別???
將具體的型別(如String,Integer)抽象成引數。
泛型的作用
- 消除了集合中的強制型別轉換,減少異常。
- 指定了物件的限定型別,實現了Java的型別安全。
- 合併程式碼。提高重用率。
泛型的表現形式
菱形語法:
List<String> list = new List<>();
Map<Integer , String > = new Map<>();
泛型類
//泛型類
public class Main<T>
{
private T data;
public Main(T data)
{
this.data=data;
}
public T getData()
{
return data;
}
public static void main(String []args)
{
Main<Integer> g1 = new Main<Integer>(1222);
System.out.println(g1.getData());
Main<Double> g2 = new Main<Double>(1222.1222);
System.out.println(g2.getData());
Main<String> g3 = new Main<String>("cat");
System.out.println(g3.getData());
}
}
泛型方法
public class Main
{
public static <E> void printArray(E inputArray[])
{
for(E element:inputArray)
{
System.out.printf("%s",element);
}
}
public static void main(String args[])
{
Integer intArray[]= {1,2,3,4,5};
Double doubleArray[]= {1.1,2.2,3.3,4.4,5.5};
Character charArray[]= {'A','B','C'};
System.out.printf("整型陣列為:\n");
printArray(intArray);
System.out.printf("\n");
System.out.printf("雙精度陣列為:\n");
printArray(doubleArray);
System.out.printf("\n");
System.out.printf("字元型陣列為:\n");
printArray(charArray);
System.out.printf("\n");
}
}
泛型介面
public interface TestInterface<T> {
public T next();
}
import java.util.Random;
public class Main implements TestInterface<String>
{
String list[]={"L","A","C"};
@Override
public String next()
{
Random rand = new Random();
return list[rand.nextInt(2)];
}
public static void main(String[] args)
{
Main obj = new Main();
System.out.println(obj.next());
}
}
相關推薦
動態引用儲存——集合&&精確的集合定義——泛型
前言: 對於面向物件的語言來說,為了方便對多個物件進行操作,就必須要對物件進行儲存。 使用陣列來儲存物件的最大問題就是陣列長度的固定性。(不靈活,難擴充套件) Java集合又稱容器,可以動態的將物件的引用儲存在容器中。(靈活可擴充套件) 集合和陣列區別 陣列: 可以儲存同一型別的基本資料型別或者引用資料
我在北京寫代碼 寫出心中悲與喜 寫出人間的悲歡離合 歡迎閱讀 我的第三章 使用集合組織相關數據(泛型集合)
nes -s ear 插入元素 資源管理 底層 動態 用途 key) ArrayList arry = new ArrayList(); arry.Add("小明"); arry.Add("小D"); arr
集合、數據結構、泛型、可變參數、新式for循環
process 集合 ext 數據 數組結構 image ima mage alt 數據結構之棧和隊列數組結構之數組和鏈表集合、數據結構、泛型、可變參數、新式for循環
Void & void Void用在泛型
public Void setStr(String key,String value)throws Exception{ RetryTemplate retryTemplate=initRetryTemplate(); retryTemplate.execute(new RetryCallba
C#自定義泛型型別集合
一.定義介面 public interface ICustom { string Title { get; set; } string Content { get; set; } } 二.實現介面 public class Custo
黑馬程式設計師——Java集合框架(二)之泛型
培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 泛型 一、泛型概述 1.什麼是泛型? 泛型就是指將資料型別引數化,把以前固定的資料型別用一個代表資料型別的引數進行表示,該引數可以接受傳入的任意資料型別。可以這
2017年11月4日 vs類和結構的區別&哈希表&隊列集合&棧集合&函數
b- protect htable private turn queue ole 長度 ack 類和結構的區別 類:類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存類有構造和析構函數類可以繼承和被繼承結構:結構是值類型在棧上分配(雖然
『Python CoolBook』數據結構和算法_字典比較&字典和集合
pytho 轉換 amp 重復元素 註意 鍵值 相同 values 返回 一、字典元素排序 dict.keys(),dict.values(),dict.items() 結合max、min、sorted、zip進行排序是個很好的辦法,另外註意不使用zip時,字典的lamb
集合--Collection接口詳解&&叠代器
lis trees 基本數據 接口 print 遍歷集合 iter 4.0 amp /* * 集合的頂層接口--Collection接口 * 添加 * add() * addAll() * * 遍歷集合 * iterator() 叠代器 * * 刪
【Python】set() 集合操作與運算 && 元素輸出順序
集合 | SET 集合(set)是Python中一種重要的資料型別,表示一組各不相同元素的無序集合,其主要應用於重複元素消除及關係測試等 集合在Python內部通過雜湊表實現,其本徵無序,輸出時所顯示的順序具有隨機性,且與執行環境相關 操作與運算 主要包括基於不同物件
28-泛型--概述+擦除&補償+在集合中的應用+泛型類+泛型方法+泛型介面
一、泛型概述 1、泛型:對要操作的資料型別進行指定。是JDK1.5出現的安全機制。泛型是給編譯器使用的技術,用在編譯時期,提高了編譯的安全性(確保型別安全) 2、向集合中新增元素,public boolean add(E e); 任何型別都可以接收(新增的元素被提升為Object型別)。通常
day16(List集合&泛型)
###16.01_集合框架(去除ArrayList中重複字串元素方式)(掌握)* A:案例演示 * 需求:ArrayList去除集合中字串的重複值(字串的內容相同) * 思路:建立新集合方式&n
day4-python基礎知識 <元組&&集合>
元組 tuple 定義:值不可修改,只可用下標讀取內容的一種資料序列列表。中括號標識 用處:開發中,防止他人修改自己的程式碼。 怎麼定義? # -僅一個元素的元組,不加逗號,就是個int型別數值 a = (1) 《==》a = 1 print(type(a)) # <class 'int
java的collection&&map集合總結
把自定義的物件放入HashSet或LinkedHashSet,為保證元素內容不重複,需要:• 覆蓋hashCode( )方法,保證相同物件返回相同的值,提供呼叫equals( )方法的機會。• 覆蓋equals( )方法,相同物件返回true。TreeSet是能夠給元素排序的Set集合,要給元素排序,必須
SQL Server溫故系列(4):SQL 查詢之集合運算 & 聚合函式
1、集合運算 1.1、並集運算 UNION 1.2、差集運算 EXCEPT 1.3、交集運算 INTERSECT 1.4、集合運算小結 2、聚合函式 2.1、求行數函式 COUNT 2.2、求和函式 SUM 2.3、求最大值函式 MAX 2.4、求最小值函式 MIN 2.5、求平均值函式 AVG 2.
【Mongodb】聚合查詢 && 固定集合
概述 資料儲存是為了可查詢,統計。若資料只需儲存,不需要查詢,這種資料也沒有多大價值 本篇介紹Mongodb 聚合查詢(Aggregation) 固定集合(Capped Collections) 準備工作 準備10000條資料 var orders = new Array(); fo
動態內存管理---new&amp;delete
不能 內存數據 指針傳遞 code pause 們的 程序猿 c語言 動態 動態內存管理 動態對象(堆對象)是程序在執行過程中在動態內存中用new運算符創建的對象。 因為是用戶自己用new運算符創建的。因此也要求用戶自己用delete運算符釋放,即用戶必須自己管理動
循環引用 && weak strong
turn child rip nsthread left 成員變量 type bsp 弱引用 @weakify _weak _weak @weakify(self); // RAC _weak的self_weak_變量 解決循環引用 問題: weakSelf是弱引用
已知兩個連結串列A和B分別表示兩個集合,其元素遞增排列。請設計演算法求出兩個集合A和B的差集(即僅由在A中出現而不在B中出現的元素所構成的集合),並以同樣的形式儲存,同時返回該集合的元素個數。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
Java8 Lambda( -> )&&方法引用( :: )&&函式式介面(@Functional)
一、簡述 Java8之前建立一個執行緒的程式碼: new Thread(new Runnable() { @Override public void run() { System.out.println("Test");