概覽
說明:
- 集合框架是一個類庫的集合,里面還有很多接口。里面虛框都是接口。
- 全部在java.util
- HashSet是基于HashMap實現(xiàn)的。
- TreeSet是一個有序Set。
- ArrayList能快速隨機訪問,可變大小。
- LinkedList隨機訪問相對慢,但是可以當作stack或者queue來用。
Collection接口常用方法
public void contextLoads() {
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
list1.add("one");
list1.add(2); // 沒有指定集合的數(shù)據(jù)類型,也不會報錯
list2.addAll(list1);
list2.add(3.14);
Iterator it1 = list2.iterator(); // 獲取迭代器
while (it1.hasNext()) { // 迭代器是否有下一個?
System.out.print(it1.next() + " "); // 迭代器指向的值
} // one 2 3.14
list2.remove(1); // 按index
list2.removeAll(list1); // 刪掉list1中有的元素
System.out.println("delete list1, size: " + list2.size()); // 大小
}
ArrayList類
下面是List接口常用的方法:
使用的時候直接:
List<String> li = new ArrayList<String>();
- 指定元素類型比較好。因為不指定的話,默認是Object類型,那么get()返回的也是Object,還要轉(zhuǎn)換成期望的數(shù)據(jù)類型。
- 這里其實是使用接口List,引用了一個ArratList實例。
- 這里指定類型,其實用到了Java提供的泛型特性。泛型可以在編譯的時候檢查類型安全,并且自動隱式轉(zhuǎn)換一些類型。比如:使用Map的get()方法,這里隱式轉(zhuǎn)換為Book類型,由于Book里重寫了public String toString(),所以可以直接打印想要的格式。
Map<Integer,Book> books=new HashMap<Integer,Book>(); //定義泛型 Map 集合
System.out.println(books.get(id));
LinkedList類
- 采用鏈表結(jié)構(gòu)保存對象,所以適合頻繁插入刪除元素時使用。
- 隨機訪問會慢。
- 具有Collection接口和List接口提供的方法。
set
遍歷:
Set<Integer> set;
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
iterator.next();
}
for (int item : set) {
System.out.println(item);
}
HashSet類
- 向Set集合中添加新元素時,HashSet會調(diào)用該元素的hashCode()方法,獲取哈希碼,根據(jù)哈希碼計算出元素在集合中的存儲位置。
- 后添加的相同元素會覆蓋前一個。就算是null,也只能有一個。
- HashSet也實現(xiàn)了Collection接口!里面的方法都可以用!
TreeSet類
- 只能對實現(xiàn)了Comparable接口的類對象進行排序。
- 升序
- 要使用排序功能,需要添加相同數(shù)據(jù)類型的對象,不然拋出ClassCastException 異常。
- 除了Collection接口的方法外,還有:
HashMap
- HashMap按照哈希算法存取對象,TreeMap則是對key進行了排序,方法是一樣的。
- Map接口常用方法
Map<Integer, StringBuilder> m = new HashMap<>();
m.put(j, m.get(j).append(temp.charAt(j)));
// 不用先刪除再add
HashMap<String, String> users=new HashMap<String, String>();
users.put("11","張浩太"); //將學生信息鍵值對存儲到Map中
users.put("22","劉思誠");
users.put("33","王強文");
users.put("44","李國量");
users.put("55","王路路");
Scanner input=new Scanner(System.in);
System.out.println("請輸入要刪除的學號:");
int num=input.nextInt();
if(users.containsKey(String.valueOf(num))) {
users.remove(String.valueOf(num)); // 以key刪除一個元素
} else {
System.out.println("該學生不存在!");
}
System.out.println("******** 學生列表 ********");
Iterator it=users.keySet().iterator(); // 使用迭代器
while(it.hasNext()) {
String key = (String)it.next(); // it.next()返回的是Object,需要強制轉(zhuǎn)換
String val = users.get(key);
System.out.println("學號:"+key+",姓名:"+val);
}
// 遍歷Map
Map<String, String> map = new HashMap<String, String>();
//第三種:推薦,尤其是容量大時
System.out.println("通過Map.entrySet遍歷key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
如果遍歷時需要同時取出key和val,那么盡量用entrySet()代替先取key再查val(尤其是key比較復雜的時候)
Collection常用算法
Collections.sort(名稱):升序排序
Collections.reverse(名稱):反轉(zhuǎn)
Collections.copy(destList,srcList):復制
如果destList長度不夠,IndexOutOfBoundsException;長度夠的話,復制到開頭,剩余元素不影響。
Collections.fill(List<? super T> list,T obj) //使用指定元素替換指定列表中的所有元素
泛型
除去Collection對泛型的支持(指定數(shù)據(jù)類型后編譯時自動轉(zhuǎn)換),另外還有泛型類和泛型方法。
泛型類
public class class_name<data_type1,data_type2,…>{
private data_type1 name1;
}
實例
public class Stu<N,A,S> {
private N name;
private A age;
private S sex;
public Stu(N name, A age, S sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//下面是上面3個屬性的setter/getter方法
// 就是記住全部用聲明里指出的類型來代替。就好像Template
}
Stu<String, Integer, Character> stu = new Stu<String, Integer, Character>("Ann", 30, '女'); // Integer才是類,int是基本數(shù)據(jù)類型
String name=stu.getName();
Integer age=stu.getAge();
Character sex=stu.getSex();
System.out.println("學生姓名:"+name+",年齡:"+age+",性別:"+sex);
泛型方法
- 泛型方法可以獨立于類產(chǎn)生變化。泛型方法所在的類不一定是泛型類。如果使用泛型方法就可以取代類的泛型化,那么就應(yīng)該只使用泛型方法。
- static方法無法訪問泛型類的類型參數(shù)(N,A,S這些),也就是說,泛型類里static方法是很難用的,所以如果static方法需要泛型能力,就必須變成泛型方法。
[訪問權(quán)限修飾符][static][final]<類型參數(shù)列表>返回值類型 方法名([形式參數(shù)列表])
高級用法
- 限制泛型可用類型
Java默認是可以使用任何類型來實例化一個泛型對象的,但是也可以限制能用泛型的類型class 類名稱<T extends anyClass>
比如:
public class ListClass<T extends List> {
}
// 在main中測試:
ListClass<ArrayList> lc1 = new ListClass<ArrayList>();
ListClass<LinkedList> lc2=new ListClass<LinkedList>();
ListClass<HashMap> lc3=new ListClass<HashMap>();
// 這個HashMap沒有實現(xiàn)List接口,所以這個實例化會報錯
- 使用類型通配符
語法:泛型類名稱<? extends List>a=null;
A<? extends List>a=null;
a=new A<ArrayList> (); //正確
b=new A<LinkedList> (); //正確
c=new A<HashMap> (); //錯誤
- 繼承泛型類和實現(xiàn)泛型接口
定義為泛型的類可以被繼承,如果要保留父類的泛型類型,需要在繼承時指定。而且泛型父類不能強制轉(zhuǎn)換成泛型子類,因為子類需要的類型并沒有被填滿。
public class FatherClass<T1>{}
public class SonClass<T1,T2,T3> extends FatherClass<T1>{}
可以在泛型中實現(xiàn)接口:
interface interface1<T1>{}
interface SubClass<T1,T2,T3> implements Interface1<T2>{}
枚舉
JDK1.5之前沒有enum,一般用接口常量替代。
語法:
[public|private|internal] enum 名稱[:基礎(chǔ)類型]
{
枚舉成員; // 不能重名,常數(shù)值必須在基礎(chǔ)類型之內(nèi),多個用逗號分隔
}
如果沒有顯示聲明基礎(chǔ)類型,那么基礎(chǔ)類型就是int
使用時:枚舉類型名稱.枚舉成員名稱
枚舉類
- 枚舉類繼承自java.lang.Enum。
- 定義一個枚舉類型時,每個成員都可以看作Enum類的實例。
public class DbApplicationTests {
enum Signal
{
GREEN, YELLOW, RED;
}
public void compare(Signal s) {
for (Signal i: Signal.values()) { // 返回枚舉類型所有值
System.out.println(s+"比較"+i+":"+s.compareTo(i));
// 返回索引差值,找不到的拋異常
} // i.ordinal()可以獲取索引值
}
@Test
public void contextLoads() {
try {
compare(Signal.valueOf("RED"));
// 把普通字符串轉(zhuǎn)為枚舉實例
/*
* RED比較GREEN:2 實際就是2-0
* RED比較YELLOW:1
* RED比較RED:0
*/
compare(Signal.valueOf("BLUE")); // 找不到哦
} catch(IllegalArgumentException e) {
System.out.println(e);
/*
* java.lang.IllegalArgumentException:
* No enum constant com.example.demo.DbApplicationTests.Signal.BLUE
*/
}
}
}
枚舉類里面也可以添加方法,就類似普通類。文章來源:http://www.zghlxwxcb.cn/news/detail-831160.html
java.util中還有EnumMap和EnumSet。文章來源地址http://www.zghlxwxcb.cn/news/detail-831160.html
//定義數(shù)據(jù)庫類型枚舉
public enum DataBaseType
{
MYSQL,ORACLE,DB2,SQLSERVER
}
//某類中定義的獲取數(shù)據(jù)庫URL的方法以及EnumMap的聲明
private EnumMap<DataBaseType,String>urls=new EnumMap<DataBaseType,String>(DataBaseType.class);
public DataBaseInfo()
{
urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample");
urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb");
urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample");
urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb");
}
//根據(jù)不同的數(shù)據(jù)庫類型,返回對應(yīng)的URL
//@param type DataBaseType 枚舉類新實例
//@return
public String getURL(DataBaseType type) {
return this.urls.get(type);
}
到了這里,關(guān)于java基礎(chǔ)-集合+泛型+枚舉的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!