1. Collection集合框架java
Java.util.Collection接口算法
|--List子接口编程
|--ArrayList实现类数组
|--LinkedList实现类数据结构
|--Vector实现类框架
|--Stack(栈,继承Vector,先进后出)ide
|--Set子接口
工具
|--HashSet实现类性能
|--TreeSet实现类spa
|--Queue接口(普通队列,先进先出)
|--Deque子接口(双端队列)
|--ArrayDeque实现类
2. 泛型
1)泛型是 JDK1.5引入的新特性,泛型的本质是参数化类型。在类、接口、方法的定义过程当中,所操做的数据类型为传入的指定参数类型。全部的集合类型都带有泛型参数,这样在建立集合时能够指定放入集合中的对象类型。同时,编译器会以此类型进行检查。
2)ArrayList支持泛型,泛型尖括号里的符号可随便些,但一般大写E。
3)迭代器也支持泛型,可是迭代器使用的泛型应该和它所迭代的集合的泛型类型一致!
4)泛型只支持引用类型,不支持基本类型,但可使用对应的包装类
5)若是泛型不指定类型的话,默认为Object类型。
案例6:
3. List接口和Set接口
1)List接口:List接口是Collection的子接口,用于定义线性表数据结构,元素可重复、有序的;能够将List理解为存放对象的数组,只不过其元素个数能够动态的增长或减小。
(1) List接口的两个常见的实现类:ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。List、ArrayList和LinkedList均处于java.util包下。
(2) 能够认为ArrayList和LinkedList的方法在逻辑上彻底同样,只是在性能上有必定的差异,ArrayList更适合于随机访问,而LinkedList更适合于插入和删除,在性能要求不是特别苛刻的情形下能够忽略这个差异。
(3) 使用List咱们不须要在建立的时候考虑容量集合的容量是根据其所保存的元素决定的换句话说,集合的容量是能够自动扩充的。
(4) List的实现类会重写toString方法,依次调用所包含对象的toString方法,返回集合中所包含对象的字符串表现 。
2)Set接口:Set接口是Collection的子接口,用于存储不重复的元素,元素是无序的。
(1) HashSet和TreeSet是Set集合的两个常见的实现类,分别用hash表和排序二叉树的方式实现了Set集合。HashSet是使用散列算法实现Set的。
(2) Set集合没有get(int index)方法,咱们不能像使用List那样,根据下标获取元素。想获取元素须要使用Iterator。
(3) 向集合添加元素也使用add方法,可是add方法不是向集合末尾追加元素,由于无序。
4. ArrayList实现类的经常使用方法
(1) add(Object obj):向想集合末尾追加一个新元素,从该方法的参数定义不难看出,集合能够存听任意类型的元素,但在实际编程中咱们发现,几乎不会向集合中存放一种以上的不一样类型的元素。
(2) size()方法:返回当前集合中存放对象的数量。
(3) clear()方法:用于清空集合。
(4) isEmpty()方法:用于返回集合是否为空。
案例7:
(5) contains(Object obj)方法:检查给定对象是否被包含在集合中,检查规则是将obj对象与集合中每一个元素进行equals比较,若比对了全部元素均没有equals为true的则返回false。注意事项:根据状况重写equals:若比较是不是同一个对象,则不须要重写,直接用contains里的equals比较便可。若重写equals为内容是否相同,则按内容比较,不论是否同一个对象。是否重写元素的equals方法对集合的操做结果有很大的效果不一样!
(6) boolean remove(Object obj)方法:删除一个元素,不重写equals,不会有元素被删除(由于比较的是对象的地址,都不相同),重写equals为按内容比较,则删除第一个匹配的就退出,其余即便内容相同也不会被删除。
(7) Object remove(int index)方法:移除此列表中指定位置上的元素。向左移动全部后续元素(将其索引减1)。所以在作删除操做时集合的大小为动态变化的,为了防止漏删,必须从后往前删!
(8) Object get(int index)方法:根据元素下标获取对应位置的元素并返回。
(9) Object set(int index,Object newElement)方法:将index位置的元素修改成newElement,修改后将被修改的元素返回。可实现将List中第i个和第j个元素交换的功能:list.set ( i , list.set ( j , list.get ( i ) ) ) ;
(10) add(int index,Object newElement)方法:使用add的重载方法,咱们能够向index指定位置插入newElement,原位置的元素自动向后移动,即所谓的“插队”。
(11) Object[] toArray()方法:该方法继承自Collection的方法,该方法会将集合以对象数组的形式返回。
(12) List<E> subList(int fromIndex, int toIndex)方法:获取子集合,但在获取子集后,若对子集合的元素进行修改,则会影响原来的集合。
5. HashSet实现类经常使用经常使用方法
(1) boolean add(E e) :若是此 set 中还没有包含指定元素,则添加指定元素。
(2) void clear() :今后 set 中移除全部元素。
(3) Object clone() :返回此 HashSet 实例的浅表副本:并无复制这些元素自己。
(4) boolean contains(Object o) :若是此 set 包含指定元素,则返回 true。
(5) boolean isEmpty() :若是此 set 不包含任何元素,则返回 true。
(6) Iterator<E> iterator(): 返回对此 set 中元素进行迭代的迭代器。
(7) boolean remove(Object o): 若是指定元素存在于此 set 中,则将其移除。
(8) int size() :返回此 set 中的元素的数量(set 的容量)。
注意事项:
1)hashCode对HashSet的影响:若咱们不重写hashCode,那么使用的就是Object提供的,而该方法是返回地址(句柄)!换句话说,就是不一样的对象,hashCode不一样。
2)对于重写了equals方法的对象,强烈要求重写继承自Object类的hashCode方法的,由于重写hashCode方法与否会对集合操做有影响!
3)重写hashCode方法须要注意两点:①与equals方法的一致性,即equals比较返回为true的对象其hashCode方法返回值应该相同(优肯不一样)。②hashCode返回的数值应该符合hash算法要求,若是有不少对象的hashCode方法返回值都相同,则会大大下降hash表的效率。通常状况下,可使用IDE(如Eclipse)提供的工具自动生成hashCode方法。
4)boolean contains(Object o)方法:查看对象是否在set中被包含。下例虽然有新建立的对象,可是经过散列算法找到了位置后,和里面存放的元素进行equals比较为true,因此依然认为是被包含的(重写equals了时)。
5)HashCode方法和equals方法都重写时对hashSet的影响:将两个对象同时放入HashSet集合,发现存在,再也不放入(不重复集)。当咱们重写了Point的equals方法和hashCode方法后,咱们发现虽然p1和p2是两个对象,可是当咱们将他们同时放入集合时,p2对象并无被添加进集合。由于p1在放入后,p2放入时根据p2的hashCode计算的位置相同,且p2与该位置的p1的equals比较为true, hashSet认为该对象已经存在,因此拒绝将p2存入集合。
案例8:
6)不重写hashCode方法,可是重写了equals方法对hashSet的影响:两个对象均可以放入HashStet集合中,由于两个对象具备不用的hashCode值,那么当他们在放入集合时,经过hashCode值进行的散列算法结果就不一样。那么他们会被放入集合的不一样位置,位置不相同,HashSet则认为它们不一样,因此他们能够所有被放入集合。
7)重写了hashCode方法,可是不重写equals方法对hashSet的影响:在hashCode相同的状况下,在存放元素时,他们会在相同的位置,hashSet会在相同位置上将后放入的对象与该位置其余对象一次进行equals比较,若不相同,则将其存入在同一个位置存入若干元素,这些元素会被放入一个链表中。由此能够看出,咱们应该尽可能使得多种类的不一样对象的hashcode值不一样,这样才能够提升HashSet在检索元素时的效率,不然可能检索效率还不如List。注意:两个对象值相同(x.equals(y) == true),但却可有不一样的hash code。