我們前面介紹了類、抽象類、接口及它們的區別使用場景,現在本章介紹也是使用頻率很高的集合類。
爲了照顧0基礎的人,簡單說下集合類型是怎使用的,在哪些情況下使用。
一、集合類型圖
什麼是集合類型我就不講了,直接給出一張圖
List主要使用ArrayList的多:
實例化,List<類型> list= new ArrayList<>();
Set主要用HashSet多:
實例化:Set<類型> set =new HashSet<>()
Map主要用HashMap的多:
實例化:Map<類型,類型> map=new HashMap<>();
二、集合的線程安全問題
線程安全是多線程編程時的計算機程序代碼中的一個概念。在擁有共享數據的多條線程並行執行的程序中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執行,不會出現數據污染等意外情況。
2.1 List,Map,Set 線程安全性
2.2 聲明線程安全的集合方法
2.2.1 使用Collections. 方式構建
//make thread-safe list
List MyStrList = Collections.synchronizedList(new ArrayList());
MyStrList.add("123");
MyStrList.add("abc");
//make thread-safe hashset
Set set=Collections.synchronizedSet(new HashSet());
set.add(123);
set.add(456);
//make thread-safe hashmap
Map map=Collections.synchronizedMap(new HashMap());
map.put(1, "thb");
map.put(12, "bill tang");
2.2.2 使用ThreadLocal封裝
三、什麼情況下用集合類型
3.1 什麼情況下適合用集合類型
我們開發的時候會遇到數據個數是動態的,還有數據類型是多樣的情況,這樣比較適合使用集合。
集合類型本身就是個數不固定的,所以當個數不固定的情況下可以使用集合類型。
集合類型如果保存的數據類型是多樣的,那麼可以使用Object類型,此類型可以代表所有類,如:List<Object>map<String,Object>、等。
ps: 在實際開發中,集合一般混合使用的的比較多
3.2 例子
如保存幾個學生的信息,除了用數據庫保存之外,還可以用List<Stu>,
先定義一個學生類,有學號、名字、語文成績、數學成績,如果你想用現成的基本數據類型基本找不到。那怎麼辦呢?可以選擇類,這樣類可以把幾種類型包括起來,代碼如下:
public class Stu {
//學號
private String sid;
//學生名
private String name;
//語文,不推薦用yuWen這種方式
private float chinese;
//不建議直接用shuXue這種拼音方式
private float maths;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getChinese() {
return chinese;
}
public void setChinese(float chinese) {
this.chinese = chinese;
}
public float getMaths() {
return maths;
}
public void setMaths(float maths) {
this.maths = maths;
}
@Override
// toString() 是把對象轉爲字符串輸出,看情況添加
public String toString() {
return "Stu{" +
"sid='" + sid + '\'' +
", name='" + name + '\'' +
", chinese=" + chinese +
", maths=" + maths +
'}';
}
}
一個Stu類只能保存個學生信息,如果多個學生,數量是動態的話,可以用List類型,這樣就變成了Lsit<Stu>類了,代碼如下:
/**
* T爲test的意思
* Stu爲 student
*/
public class T2 {
private Stu saveStu(String sid,String name,float chinese,float maths)
{
Stu stu = new Stu();
stu.setSid(sid);
stu.setName(name);
stu.setChinese(chinese);
stu.setMaths(maths);
return stu;
}
public static void main(String[] args) {
T2 t2=new T2();
List<Stu> stuList =new ArrayList<>();
//創建學生1
stuList.add(t2.saveStu("001", "張三", 60f,65.5f ));
//創建學生2
stuList.add(t2.saveStu("002", "李四", 70.5f,80f ));
//創建學生3
stuList.add(t2.saveStu("003", "王五", 91f,98f ));
//寫迭代器
Iterator stuListIt=stuList.iterator();
//循環輸出每個學生的成績信息
while (stuListIt.hasNext())
{
Stu stu = (Stu) stuListIt.next();
System.out.println(stu.getSid()+" "+stu.getName()+" "+stu.getChinese()+" "+stu.getMaths());
}
}
}
效果: