-*-*-------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! --------------------*-*-
集合框架(集合类)
java集合框架是指导java的集合类。
为什么有那么多的集合类的容器呢?
以为每一个容器对数据存储方式都有不同,这个存储方式叫做:数据结构。
集合框架
集合框架分为两大派系
|--单列集合 Coloection 接口
|--List 接口 有序的,可重复,可根据角标操作元素,特有遍历元素方式ListIterator提供双向遍历next() previous(),可删除、替换、增加元素
|--ArrayList 底层数据结构是数组,查询速度快,增删稍慢,线程不同步的,
|--LinkedList 底层数据结构是链表,增删速度快,查询稍慢,线程不同步的
|--Vector 底层数据结构是数组,增删查都稍慢,线程同步的,jdk1.0出现的,那时候还没有集合框架,后来被ArrayList取代
|--Set 接口 无序的,不可重复,因为底层是一个Map集合,只使用了Map的key,要保证键的唯一性
|--HashSet 底层数据结构是哈希表,线程不同步的,无序,高效,必须保证元素的唯一性,是通过调用hashCode和equals方法来判断元素是否相同的
|--TreeSet 底层数据结构是二叉树,线程不同步的,特点就是可以对集合中的元素进行排序,前提是要指定排序规则,有两种方式
1,让元素自身具备比较性,如果元素自身不具备比较性,可以让元素实现Comparable接口,并覆盖compareTo方法来指定比较规则
2,如果元素具备的比较性并不是我们所需要的,可以自己定义一个比较器,实现Comparator接口,并覆盖compare方法来指定比较规则,通过构造函数传递给集合即可
|--要迭代以上集合都是通过迭代器来完成的,通过调用iterator方法来返回一个迭代器Iterator(接口);通过这个迭代器来迭代元素
|--双列集合 Map
|--Hashtable 底层是哈希表结构,线程同步的,不可以存储null键null值,jdk1.0出现,后来被HashMap所替代,
|--HashMap 底层的数据结构是哈希表,线程不同步的,可以存储null键null值,
|--TreeMap 底层是二叉树数据结构,线程不同步,特点是可以对键进行排序,排序方式同TreeSet相同,
|-- Map 集合和Collection的不同点是,Map集合一次是存一对元素,键值对形式(键和值存在着眏射关系),而Collection一次只存一个元素
|-- Map 集合自身并没有迭代方法,但是可以通过keySet和entrySet方法来讲Map集合转换成Set集合在进行迭代,
keySet返回的是集合中所有的键,在通过Map集合中的get(key)来获取对应的值,而entrySet方法返回的是Map.Entry这种数据类型,里面保存的是所有键值对的映射关系
泛型:
泛型其实就是为了限定集合中的输入类型,让编译器挡住程序的非法输入,避免了强制类型转换的问题
泛型的上限 格式为<? extends T>表示输入的类型必须是T或者T的子类型
泛型的下限 格式为<? super T> 表示输入的类型不许是T或者T的父类型
Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则
集合Collection接口基本操作:
增加元素
add(Object obj);
addAll(Collection c);
删除元素
remove(Object obj);
removeAll(Collection c);
求交集
retainAll(Collection c);
删除元素
remove(Object obj);
removeAll(Collection c);
求交集
retainAll(Collection c);
泛型:
没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处:
在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
代码应用:
package basic.method;
import java.util.*;
public class BasicMethodDemo {
public static void main(String[] args) {
//创建集合容器,使用ArrayList
ArrayList al = new ArrayList(); //所有集合类都位于java.util包下
ArrayList la = new ArrayList();
//添加
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
la.add("java01");
la.add("java02");
la.add("java03");
//删除
// al.remove(1);
// al.remove("java3");
// al.removeAll(la); //删除al中al和la公有的元素并保存于al中
// al.clear(); //清空容器
//判断
// sop(al.contains("java05"));
// sop(al.contains(la)); //al中寻找la对象的引用,并非找对象中元素实体
// sop(al.isEmpty());
//获取长度
// sop(al.size());
// al.add(la); //删除al中的重复元素,并把la加到al剩下元素的后面
al.add(1, la); // 删除al中的重复元素,并把la加到al 剩下 元素的后面
sop(al);
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
编写一个类打印人员信息,按照加入人的姓名排序,不得有重复元素,代码实现:
import java.util.*;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
if(! (obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class SingleArrayList {
public static ArrayList<Person> singleP(ArrayList<Person> al) {
ArrayList<Person> temp = new ArrayList<Person>();
Iterator<Person> it = al.iterator();
while(it.hasNext()) {
Person p = (Person)it.next();
if(!(temp.contains(p)))
temp.add(p);
}
return temp;
}
public static void sop(Object obj) {
System.out.println(obj);
}
public static void main(String args[]) {
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("张三01",20));
al.add(new Person("张三02",26));
al.add(new Person("张三03",22));
al.add(new Person("张三03",22));
al.add(new Person("张三01",20));
al.add(new Person("张三04",30));
al.add(new Person("张三01",20));
al = singleP(al);
for(Iterator<Person> it = al.iterator();it.hasNext();) {
Person p = (Person)it.next();
sop(p.getName()+"--"+p.getAge());
}
}
}
-*-*-------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! --------------------*-*-