[TOC]
# 集合
## 集合繼承關系圖

list叫鏈,set叫集
list允許存儲重復的,set不允許存儲重復的
## 基本方法

創建集合的方式
~~~
方式一:
Collection<元素類型> 變量名=new ArrayList<元素類型>();
方式二:
Collection 變量名=new ArrayList():
~~~
## ArrayList和LinkedList的區別
1. ArrayList是實現了基于動態數組的數據結構,而LinkedList是基于鏈表的數據結構;
2. 對于隨機訪問get和set,ArrayList要優于LinkedList,因為LinkedList要移動指針;
3. 對于添加和刪除操作add和remove,一般大家都會說LinkedList要比ArrayList快,因為ArrayList要移動數據。但是實際情況并非這樣,對于添加或刪除,LinkedList和ArrayList并不能明確說明誰快誰慢
## 長度的3種表現形式
數組.length 屬性 返回int
字符串.length() 方法,返回值int
集合.size() 方法,返回值int
# 迭代器
集合中把這種取元素的方式描述在Iterator接口中
## 常用方法

~~~
//for循環迭代寫法:
for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) {
System.out.println(it2.next());
}
//存儲時提升了Object。取出時要使用元素的特有內容,必須向下轉型。
Collection coll = new ArrayList();
coll.add("abc");
coll.add("aabbcc");
coll.add("shitcast");
Iterator it = coll.iterator();
while (it.hasNext()) {
//由于元素被存放進集合后全部被提升為Object類型
//當需要使用子類對象特有方法時,需要向下轉型
String str = (String) it.next();
System.out.println(str.length());
}
~~~
# 增強for循環
JDK1.5新特性,增強for循環
JDK1.5版本后,出現新的接口java.lang.Iterable
Collection是繼承Iterable
Iterable作用,實現增強for循環
**弊端:沒有索引,不能操作容器里面的元素**
## 格式
~~~
for (數據類型 變量名 : 數組或集合) {
}
~~~
~~~
int[] arr={1,2,3,4,5};
for(int i : arr) {
System.out.println(i);
}
~~~
# 泛型
由于集合中什么類型的元素都可以存儲,導致取出時候,如果出現強轉就會引發運行時錯誤.
解決,使用集合必須明確集合中元素的類型,這種方式稱之為泛型

## 泛型的好處
泛型的好處
a:將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。
b:避免了類型強轉的麻煩。
演示下列代碼:
~~~
public class GenericDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add(“abc”);
list.add(“itcast”);
//list.add(5);//當集合明確類型后,存放類型不一致就會編譯報錯
//集合已經明確具體存放的元素類型,那么在使用迭代器的時候,迭代器也同樣會知道具體遍歷元素類型
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str.length()); //當使用Iterator<String>
//控制元素類型后,就不需要強轉了。獲取到的元素直接就是String類型
}
}
}
~~~
## 泛型的通配符
~~~
/
* 泛型的通配符
/
public class GenericDemo {
public static void main(String[] args) {
ArrayList array = new ArrayList();
HashSet<Integer> set = new HashSet<Integer>();
array.add("123");
array.add("456");
set.add(789);
set.add(890);
iterator(array);
iterator(set);
}
/*
* 定義方法,可以同時迭代2個集合
* 參數: 怎么實現 , 不能寫ArrayList,也不能寫HashSet
* 參數: 或者共同實現的接口
* 泛型的通配,匹配所有的數據類型 ?
*/
public static void iterator(Collection<?> coll){
Iterator<?> it = coll.iterator();
while(it.hasNext()){
//it.next()獲取的對象,什么類型
System.out.println(it.next());
}
}
}
~~~
## 泛型的限定
~~~
/
* 將的酒店員工,廚師,服務員,經理,分別存儲到3個集合中
* 定義方法,可以同時遍歷3集合,遍歷三個集合的同時,可以調用工作方法
/
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
//創建3個集合對象
ArrayList cs = new ArrayList();
ArrayList fwy = new ArrayList();
ArrayList jl = new ArrayList();
//每個集合存儲自己的元素
cs.add(new ChuShi("張三", "后廚001"));
cs.add(new ChuShi("李四", "后廚002"));
fwy.add(new FuWuYuan("翠花", "服務部001"));
fwy.add(new FuWuYuan("酸菜", "服務部002"));
jl.add(new JingLi("小名", "董事會001", 123456789.32));
jl.add(new JingLi("小強", "董事會002", 123456789.33));
// ArrayList arrayString = new ArrayList();
iterator(jl);
iterator(fwy);
iterator(cs);
}
~~~
~~~
/*
* 定義方法,可以同時遍歷3集合,遍歷三個集合的同時,可以調用工作方法 work
* ? 通配符,迭代器it.next()方法取出來的是Object類型,怎么調用work方法
* 強制轉換: it.next()=Object o ==> Employee
* 方法參數: 控制,可以傳遞Employee對象,也可以傳遞Employee的子類的對象
* 泛型的限定 本案例,父類固定Employee,但是子類可以無限?
* ? extends Employee 限制的是父類, 上限限定, 可以傳遞Employee,傳遞他的子類對象
* ? super Employee 限制的是子類, 下限限定, 可以傳遞Employee,傳遞他的父類對象
*/
public static void iterator(ArrayList<? extends Employee> array){
Iterator<? extends Employee> it = array.iterator();
while(it.hasNext()){
//獲取出的next() 數據類型,是什么Employee
Employee e = it.next();
e.work();
}
}
}
~~~
- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化