Day11:集合
集合是Java语言中最重要的一个工具类,这个工具类涉及到Java所有的数据结构,是一个Java程序的数据容器。
Collection接口中的共性功能。
1,添加。
boolean add(Object obj);一次添加一个。
boolean addAll(Collection c);将制定容器中的所有元素添加。
2,删除。
void clear();
boolean remove(object o)
boolean removeAll(Collection c):
boolean retainAll(Collection c);
3,获取长度。
int size();
4,判断。
boolean isEmpty();
boolean contains(Object o)
boolean containsAll(Collection c)
5,将集合转成数组。
toArray();
toArray([]);
6,取出集合元素。
Iterator iterator()
获取集合中元素上迭代功能的迭代器对象。
迭代:取出元素的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
迭代器:具备着迭代功能的对象。
而迭代器对象不需要new。直接通过 iterator()方法获取即可。
迭代器是取出Collection集合中元素的公共方法。
-----------------------
Collection
|--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
|--Set:不允许重复元素。
重点List接口中的特有方法:它的特有方法都是围绕索引定义的。
支持增删改查。
增:
add(index ,element)
删:
remove(index);
改:
set(index,newelement);
查:
int indexOf(element);
element get(index);
List集合的具体子类。子类之所以区分是因为内部的数据结构(存储数据的方式)不同。
|--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将元数组元素复制到新数组)。线程同步的。增删和查询都慢!
|--ArrayList:也是数组结构,也是长度可变的。线程不同步的,替代了Vector。增删速度不快。查询速度很快。
|--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。
作业:
1,往ArrayList中存储自定义对象。Person(name,age)
2,去除ArrayList集合中的重复元素(String)
去除ArrayList集合中的重复元素(Person,同姓名同年龄视为同一个人)
3,自己查阅LinkeList xxxFirst() xxxLast(),并写demo
实现一个队列数据结构。
-------------------------------- Set集合:不允许重复元素。和Collection的方法相同。Set集合取出方法只有一个:迭代器。 |--HashSet: 哈希(散列)表结构,不同步的。 如何保证唯一性? 元素必须覆盖hashCode和equals方法。 覆盖hashCode方法是为了根据元素自身的特点确定哈希值。 覆盖equals方法,是为了解决哈希值的冲突。 |--TreeSet: 二叉树数据结构。可以对元素进行排序。不同步的。 如何保证元素唯一性? 参考的就是比较方法的返回值是否是0.是,就是重复元素,不存。 排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。 覆盖CompareTo方法。 需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照 自然排序的方法,而是按照自定义的排序方式,对元素进行排序。 而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢? 这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器。 实现Comparator接口,覆盖compare方法。将Comparator接口的对象, 作为参数传递给TreeSet集合的构造函数。 比较器更为灵活。自然排序通常作为元素的默认排序。 技巧: jdk1.2以后出现的集合框架中的常用子类对象,存在的规律。 前缀名是数据结构名,后缀名是所属体系名。 ArrayList: 数组结构。看到数组,就知道查询快,看到list,就知道可以重复。可以增删改查。 LinkedList: 链表结构,增删快。xxxFirst xxxLast. xxx:add get remove HashSet: 哈希表, 就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复。 LinkedHashSet: 链表+哈希表。可以实现有序,因为有链表。 TreeSet:二叉树,可以排序。就要想要两种比较方式:一种是自然排序Comparable,一种是比较器Comparator。 --------------------------------------------
泛型: 在jdk1.4版本之前,容器什么类型的对象都可以存储。但是在取出时。需要用到对象的特有内容时,需要做向下转型。 但是对象的类型不一致,导致了向下转型发生了ClassCastException异常。 为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致。 JDK1.5以后解决了该问题,在定义集合时,就直接明确集合中存储元素的具体类型。 这样,编译器在编译时,就可以对集合中存储的对象类型进行检查。 一旦发现类型不匹配,就编译失败。这个技术就是泛型技术。 好处: 1,将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题。 2,避免了向下转型的麻烦。 总结:泛型就是应用在编译时期的一项安全机制。 泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过, 就会生成class文件,但在class文件中,就将泛型标识去掉了。 泛型的表现:泛型技术在集合集合框架中应用的范围很大。 什么时候需要写泛型呢?1,只要看到类,或者接口在描述的时右边定义<>,就需要泛型。 其实是,容器在不明确操作元素的类型的情况下,对外提供了一个参数<>。 使用容器时,只要将具体的类型实参传递给该参数即可。 说白了,泛型就是,传递类型参数。 泛型类 泛型方法, 泛型接口。 泛型的通配符 <?> 泛型的限定: 上限:? extends E 下限:? super E
Map:双列集合,一次存一对,键值对。要保证键的唯一性。 共性的功能: 1,添加。 v put(key,value); putAll(Map<k,v> map); 2,删除。 void clear(); v remove(key); 3,判断。 boolean containsKey(object) boolean containsValue(object); boolean isEmpty(); 4,获取。 v get(key); int size(); Map |--Hashtable:哈希表,是同步的,不允许null键,null值。 |--HashMap: 哈希表,是不同步的,允许null键,null值。 |--TreeMap: 二叉树,不同步的。可以对map集合中的键进行排序。
集合框架的工具类。 Collections:定义的都是操作Collection的静态方法。 1,对list排序。 sort(list); //排序方法上泛型的由来。 class Student implements Comparable<Person> { public int compareTo(Person p) {} } public static <T extends Comparable<? super T>> void sort(List<T> list) { } public static void sort(List<Student> list) { stu1.compareTo(stu2) } 2,逆序。 reverseOrder 3,max min 4,二分查找。 5,将非同步集合转成同步集合。 ----------------------- Arrays:用来操作数组的工具类,方法都是静态的。 public static <T> void swap(T[] arr,int x,int y) { T temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } asList:将数组转换成集合,为了可以用集合的方法操作数组元素。不可以使用集合的增删方法。 集合转数组:Collection接口 toArray(); ----------------------------------- Collection 和Collections的区别? Collection和Map的区别?