-*-*-------------------- 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培训、期待与您交流! --------------------*-*-