1、需要唯一吗?
需要 set
需要顺序吗?
需要 treeSet 不需要 hashSet
不需要 list
需要频繁增删吗?
需要 linkedlist 不需要 ArrayList
2、如何记录每一个容器的结构和所属体系那?
看名字
list
|--- ArrayList
|--- LinkList
Set
|--- HashSet
|---TreeSet
后缀名就是所属集合的体系
前缀名就是所属集合的数据结构
看到array,想到数组,有角标,查询快
看到link,想到链表,增删快,add get removefirst removelast
看到hash 就要想到哈希表,想到唯一性,就要想到元素要覆盖hashcode() 方法 和equals()方法
看到tree,就要想到二叉树,想到要排序,想到排序的两个接口,compareable 和 comparetarator
而且通常这些常用的集合都是不同步的
-------------------------------------------------------------------------------------------------
集合中泛型的通配符的使用
通配符 ? 可以对类型进行限定
上限: ? extends e : 接受e类型的或e的子类性对象
下限: ? super E: 接收E类型,或E的父类型
一般在存储元素的时候都使用上限,因为这样在取出元素的时候,都是按照上限类型来运算的,不会出现类型安全隐患
如下是上限类型的演示:
package com.it.cast.p5.genercdefinedemo;
public class Person2 {
private String name;
private int age;
public Person2(String name,int age){
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "age" + age + " name" + name;
}
}
package com.it.cast.p5.genercdefinedemo;
public class Worker extends Person2{
public Worker(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
}
package com.it.cast.p5.genercdefinedemo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class PrintCollection {
public static void main(String[] args) {
ArrayList <Person2> arr = new ArrayList <Person2>();
arr.add(new Person2("好人",23 ));
arr.add(new Person2("坏人",24));
print (arr);
ArrayList<Worker> arr2 = new ArrayList<Worker>();
arr2.add(new Worker("肌肉男", 25));
arr2.add(new Worker("佰砖", 34));
print ( arr2);
}
/*一般在存储元素的时候都是用上限,因为这样在取出元素的时候都是按照上限类型
* 来运算的,不会出现类型转换问题
* */
public static void print(Collection<? extends Person2> a1){
Iterator<? extends Person2> a = a1.iterator();
while ( a.hasNext()){
Person2 p = a.next(); //进入的都是Person类型的或其子类,都可以用父类来接收
System.out.println(p);//叫做泛型的应用
}
}
}