当前位置:文档之家› JAVASE集合超完整讲义

JAVASE集合超完整讲义

一、Collection集合类的方法(带all方法的参数都为集合)添加和删除方法: Add() addAll() remove() removeAll()两个集合中的相同元素从调用removeall的方法中删除 clear()判断方法返回boolean:contains(元素) cotainsAll() isEmpty()其他方法Size() iterator()返回Iterator类型的迭代器retainAll()取交集与removeAll中的方法相反。

toArray()转数组一、List1.特点:有序(存入和取出的元素顺序一致)都有索引,可以重复(set相反)2.常用方法:添加删除传下标值:add(int index, E element)也可以直接addaddAll(int index, Collection c)也可以最直接添加集合Remove可以传下标也可以传元素(移除第一次出现的)判断:boolean equals()当且仅当指定的对象也是一个列表、两个列表有相同的大小,并且两个列表中的所有相应的元素相等才返回 true修改:set(int index, E element)替换制定位置的元素获取:get(int index),subList(int fromIndex, int toIndex)indexOf(Object o)返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1lastIndexOf(Object o)最后出现的,没有返回-1一、Vector特点:内部是数组结构,同步,增删查询都很慢,内部数据数组的大小为 10超出后100%的增长二、ArrayList特点:内部数组,不同步的代替了vector大小可变数组(创建一个数组将原来的数组复制到新数组中来)查询速度很快。

初始容量为 10 的数组超出后50%的增长Contains方法判断元素是否相同实际走的是equals方法重点案例:保证元素的唯一性。

通过重写hashCode ()方法和equals()方法Arraylist中去除重复的元素比较重复元素的时候先使用hashCode(),如果相等再判断equals()是否相等,如果为true则元素重复。

三、linklist特点:内部是链表的数据结构不同步,增删速度很快方法addFirst(E e)addLast(E e)add方法里面有具体操作位置的返回void类型反之返回boolean类型的。

offer默认插入到末尾offerFirst,offerLast,offer都有返回值PeekFrist(Last)和getFirst(Last)如果为空前者(jdk1.6)返回null而后者会抛出异常。

Pool(jdk1.6)移除poolFirst,poolLast和removeFirst和removeLast区别和上面一样。

类似的还有添加pool(jdk1.6)和add的区别与上同理。

面试题:队列FIFO 链表: FILO二、Set元素不重复,无序。

方法:和其父类方法完全一致。

一、HashSet特点:内部数据结构是哈希表,不同步。

性能很稳定,线程不安全存储速度快哈希算法能够给每个对象算出一个哈希值,哈希值指向某些地址,所以查找起来非常方便。

判断元素是否相同首先判断哈希值是否相同,如果相同就进行第二次判断看内容是否相同(用的是equals方法)。

1.LinkedHashset具有可预知的迭代顺序二、TreeSet特点:有指定顺序即按照元素的字典顺序来排序,不同步的。

判断是否相同的原理就是看返回值是否为0Comparable接口对实现它的每个对象进行整体的排序即自然排序。

小于大于等于分别返回负数正数和0案例一实现comparable接口自定义比较-----让元素自身具备比较功能在TreeSet里面存放一些person对象ts.add(new Person("zhanag",29));对存放的对象要求按照年龄来排序如果年龄相同按照姓名来排序。

方法,Person类实现conmarable接口重写compareTo方法然后迭代取出值:按照姓名如果姓名相同按照年龄排序案例二让集合具备比价功能实现Comparactor比较器接口将该类的对象作为参数传递给TreeSet集合的构造函数Comparactor新建集合的时候创建一个建立排序类的参数。

二、Map集合特点:键值对的映射集合,每次存储一个键值对,值可以重复键是不可以重复方法:1.put()添加元素有一个返回值,返回值得类型是值的类型,put(1,2)再次put(1,4)的时候2会被4替代返回的是被替代的值4。

2判断:containsKey(传递键)containsValue(传递的值)3判断集合中是否含有键值对isEmpty()。

4 containsKey 判断有没有这个键5 containsValue 判断有没有这个值6 keySet 键存储到Set集合7 entrySet 键值关系对象存储到Set集合重点:取出map集合的键值对由于map集合中没有迭代器,只能使用其他方法来获取方法1,利用Set集合进行获取Map接口中有一个方法,keySet() 将Map集合中的所有的键,存储到Set集合有了Set集合以后,迭代器Set集合,Set里面存储的都是键代码://使用Map集合的keySet方法,将Map集合中的键,存储到Set集合Set<String> set = map.keySet();//创建迭代器,迭代Set集合Iterator<String> it = set.iterator();while(it.hasNext()){//it.next()方法,获取的是什么,是键String key = it.next();//使用map中get方法获取值Integer value = map.get(key);System.out.println(key+"..."+value);}第二种方法,利用的键值对的映射关系来获取,好比通过结婚证,获得证上的两个人有一个接口,用来描述键值对的映射关系对象的代码://使用entrySet方法,获取键值对关系对象的Set集合Set<Map.Entry<String, Integer>> set = map.entrySet();//建立迭代器Iterator<Map.Entry<String, Integer>> it = set.iterator();while(it.hasNext()){//it.next()获取到的是什么呢,是键值对映射对象Map.EntryMap.Entry<String, Integer> entry = it.next();//有了键值对关系对象,getKey getValueString key = entry.getKey();Integer value = entry.getValue();System.out.println(key+"..."+value);}2.1、HashMap底层也是哈希表结构线程不安全的,执行效率快任何,包含null,可以存储null键,和null值HashMap存储自定义对象,并采用两种方法获取2.2、Hashtable底层也是哈希表结构,但是不存null值,null键Hashtable是线程安全的,执行效率低Hashtable JDK1.0开始类似于 Vector2.2.1、properties2.3、TreeMap可以对键进行自然顺序的排序,可以实现Comparactor接口Properties 类表示了一个持久的属性集。

与IO流配合使用。

值都是String由于Properties 继承于 Hashtable,所以 put 和 putAll 方法也能进行插入操作。

但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。

相反,应该使用 setProperty 方法。

同理取值也是一样的用getProperty(setProperty(get)两个方法固定只能存String类型的值)获取系统的属性也可获取单一的通过键去拿值2. Map集合|-- Map接口中的方法put 存储,键值对get 获取,根据键获取值containsKey 判断有没有这个键containsValue 判断有没有这个值keySet 键存储到Set集合entrySet 键值关系对象存储到Set集合3. HashMap|-- 底层哈希表,线程不安全,允许存储null|-- 存储自定义对象,重写hashCode 和 equals4. TreeMap|-- 红黑树,线程不安全|-- 存储自定义对象,重写compareTo方法|-- 传递比较器5. Hashtable|-- 线程安全的哈希表,不允许null多学一招:LinkedHashSet LinkHashMap 有序的set和有序的map,怎么存怎么取三、泛型Jdk1.5之后出现的,将运行时期出现的类型转换异常(存不同类型的数据)转换到了编译时期,泛型是给编译器使用的技术,用于编译时期,运行时会将泛型去掉生成.class文件这种机制叫做泛型的擦除。

目的是为了兼容类加载器。

在运行时不需要强转(如:迭代器获取的时候),是泛型的补偿机制为了避免安全隐患的出现在定义集合的时候就规定集合的类型(数组定义的时候要加类型int[]arr)3.1自定义泛型,了解读懂就行,就是为了安全性。

3.2泛型的方法和泛型类(Demo1代码),泛型接口:了解。

3.2.1泛型类3.2.2静态的方法泛型写在static的后面非静态的泛型方法3.2.3泛型接口1.子类实现后,直接,确定了数据类型2.子类实现后,不实现泛型,不指定数据类型,等到建立子类对象的时候,在指定泛型GenericDemo1.java GenericDemo2.java3.3泛型的通配符参照addAll(Collection<? extends E> c)其中问号也是通配符//可以迭代每个集合的方法,其中问号就是通配符,可以匹配任意的集合类型。

private static void method(Collection<?> c){Iterator<?> it = c.iterator();//不要进行强制转换while(it.hasNext()){System.out.println(it.next());}3.4泛型的限定上限限定:? extends E限定E类型,和E的子类类型,下限限定:?super E 限定了E的父类性,可以传递E类型,E的父类类型,下限限定Eg:private static void method(ArrayList<? extends Company> array){四、Collections工具类特点: Collections操作集合的工具类,方法全部静态,类名调用方法:1.Static sort(List )对List集合排序2.static sort(List Comparator)按照指定的比较器,进行排序myStringLength为自定义的类实现comparactor接口可以按照长度进行排序,第二个方法是逆转长度排序static Comparetor reverseOrder()运行结果是一个比较器,强行逆转对象的自然顺序(Comparable)需要和sort配合使用3.static reverseOrder(Comparator<T> cmp) 传递比较器,强行逆转比较器4.static int binarySearch(List,关键字)二分查找法array是一个集合,该语句的原理是查找集合中为2的元素的角标,如果没有返回负的插入点减一(先排序好的集合)。

相关主题