标签:
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、集合框架
概念:集合框架是Java中为了方便对集合进行存储、操作而形成的体系。集合是针对对象最常见的一种存储形式。
数组和集合类同是容器,区别在哪里?
相同点:
集合和数组都是容器,都可一存储对象(对象引用)。
不同点:
数组长度固定,集合长度可变。
数组可以存储基本数据类型,集合却只能存储对象;
集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合框架常用类关系图:
为什么会有这么多容器?
答:因为每个容器对数据的存储方式都有所不同,这个存储方式就是常说的数据结构。
二、Collection接口 Collection 接口是集合框架中的顶层接口,所以其所有共性在其子接口中都可以得到体现。
集合类中常用的方法:
1、添加
add(E e): 向集合中添加该元素。
addAll(Collection<? extends E> c): 将指定集合中的所有元素都添加到此集合中。
2、删除
remove(Object o):从此集合中移除指定元素的单个实例,如果存在的话。
removeAll(Collection<?> c):移除此集合中那些也包含在指定集合中的所有元素
clear();清空集合中所有元素。
3、判断
contains(Object o): 判断集合中是否包含某个元素。
containsAll(Collection<?> c):判断该集合是否包含另一集合中的所有元素。
isEmpty():判断集合是否为空。
4、获取
iterator():返回在此集合的元素上进行迭代的迭代器。
size():获取集合长度。
5、取交集
retainAll(Collection<?> c):保留本集合与另一集合的交集。
6、集合变数组
toArray(T[] a) :返回包含此 collection 中所有元素的数组。
注意:toArray(T[] a)返回数组的运行时类型与指定数组的运行时类型相同。此方法充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。如果指定的数组能容纳该 collection,则返回包含此 collection 元素的数组;否则,将分配一个具有指定数组的运行时类型和此 collection 大小的新数组;如果指定的数组能容纳 collection,并有剩余空间(即数组的元素比 collection 的元素多),那么会将数组中紧接 collection 尾部的元素设置为 null。所以数组长度与集合长度刚刚好最合适。
因为Collection中有iterator()方法,所以每一个子类集合对象都具备迭代器。每个集合都具备取出的方式,而这个方式不足以用一个方法来描述,所以把取出动作封装成一个对象。因为数据结构不同,每个取出对象中取出的实现方式也不一样。取出的方式就通过类被描述。
迭代器中的方法:
next():返回迭代的下一个元素。
hasNext():如果仍有元素可以迭代,则返回 true。
remove():从迭代器指向的 Collection 中移除迭代器返回的最后一个元素。
注意:
1、迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration。迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException异常。迭代器的next方法返回值类型是Object,所以要记得类型转换。
2、在迭代时循环中next调用一次,就要hasNext判断一次。next连续调用两次可能会发生NoSuchElementException异常。
三、List接口
List接口是Collection的子接口。所以它在具备Collection共性的基础上,还有其自个儿的特性。它可以通过角标获取元素,也可以通过for循环获取元素。
List特有方法:
1、添加
add(int index,E element):在列表的指定位置插入指定元素。
addAll(int index, Collection<? extends E> c) :将指定 集合中的所有元素都插入到列表中的指定位置。
2、删除
remove(int index): 移除列表中指定位置的元素。
3、修改
set(int index, E element):用指定元素替换列表中指定位置的元素,返回以前在指定位置的元素。
4、查找
get(int index) :返回列表中指定位置的元素。
subList(int fromIndex, int toIndex): 返回列表中指定的范围内的部分列表,含头不含尾。
listIterator():返回此列表元素的列表迭代器。
listIterator(int index):从列表的指定位置开始返回列表中元素的列表迭代器。
ListIterator特有的方法:
add(E e):将指定的元素插入列表。
previous():返回列表中的前一个元素。
hasPrevious():如果逆向遍历列表,列表迭代器有多个元素,就返回 true。
set(E e):用指定元素替换 next 或 previous 返回的最后一个元素。
四、Vector类和Enumeration接口
Enumeration特有的方法:
hasMoreElements():测试此枚举是否包含更多的元素。
nextElement():如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
可见其性能相当于迭代器,只不过方法比较少。
Vector特有方法:
elements() :返回此向量的组件的枚举。 返回的类型是Enumernation类型的。
所以对于Vector来说有以下取出元素方式:
1、for循环
2、迭代器
3、列表迭代器
4、get方法,遍历for循环
5、枚举
五、linkedList类
概念:底层数据结构是链表,查询慢,增删快,线程不安全,效率高。
特有的方法:
addFirst(E e):将指定元素插入此列表的开头。
addLast(E e):将指定元素添加到此列表的结尾。
getFirst():返回此列表的第一个元素。
getLast():返回此列表的最后一个元素。
removeFirst():移除并返回此列表的第一个元素。
removeLast():移除并返回此列表的最后一个元素。
注意:获取元素的这些方法。如果集合中没有元素,会出现 NoSuchElementException异常。
JDK1.6出现的新特性:
offerFirst(E e)
offerLast(E e)
peekFirst()
peekLast()
pollFirst()
pollLast()
用法与上面方法一致,但获取元素时,如果集合中没有元素,则会返回 null 。
LinkedList模拟队列代码:
1 import java.util.LinkedList; 2 3 public class LinkedListDemo { 4 /* 5 * 链表模队列,先进先出 6 */ 7 public static void main(String[] args) { 8 DuiLie dl = new DuiLie(); 9 dl.myAdd("aa"); 10 dl.myAdd("bb"); 11 dl.myAdd("cc"); 12 dl.myAdd("dd"); 13 14 System.out.println(dl.myGet()); 15 } 16 17 } 18 19 class DuiLie{ 20 private LinkedList link; 21 22 DuiLie(){ 23 link = new LinkedList(); 24 } 25 26 public void myAdd(Object obj){ 27 link.addFirst(obj); 28 } 29 30 public Object myGet(){ 31 return link.removeLast(); 32 } 33 34 public boolean isNull(){ 35 return link.isEmpty(); 36 } 37 }
六、ArrayList类
概念:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。是List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
ArrayList去除重复对象代码:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 4 public class ArrayListDemo { 5 6 /** 7 * 去除ArrayList的重复对象 8 */ 9 public static void main(String[] args) { 10 ArrayList al = new ArrayList(); 11 al.add("AA"); 12 al.add("BB"); 13 al.add("AA"); 14 al.add("BB"); 15 al.add("CC"); 16 17 System.out.println(getSingle(al)); 18 } 19 public static ArrayList getSingle(ArrayList al){ 20 ArrayList myAl = new ArrayList(); 21 Iterator it = al.iterator(); 22 while(it.hasNext()){ 23 Object obj = it.next(); 24 if(!myAl.contains(obj)) 25 myAl.add(obj); 26 } 27 return myAl; 28 } 29 } 30 /** 31 * 运行结果:[AA, BB, CC] 32 */
上面比较的是字符串,所以可以成功。如果比较自定义对象时,那么就会失败。这是因为contains()方法底层是由equals()方法实现的,而Object类中的equals()方法比的是内存地址,所以我们如果相比较自定义对象,就需要复写equals()方法。
七、Set接口
概念:一个不包含重复元素的 collection
特点:
1、无序(存入与取出的顺序不一致)
2、唯一(存入集合的元素唯一)
八、HashSet类
概念:不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
遍历HashSet代码:
1 public class HashSetDemo 2 2 { 3 3 public static void main(String[] args) 4 4 { 5 5 HashSet<String> hs = new HashSet<String>(); 6 6 hs.add("AA"); 7 7 hs.add("BB"); 8 8 hs.add("CC"); 9 9 hs.add("BB"); 10 10 11 11 for (String s : hs) 12 12 { 13 13 System.out.println(s); 14 14 } 15 15 } 16 16 } 17 /* 18 *运行结果: 19 * BB 20 * AA 21 * CC 22 */
HashSet中存储自定义对象代码:
1 import java.util.*; 2 public class HashSetDemo 3 { 4 public static void sop(Object obj) 5 { 6 System.out.println(obj); 7 } 8 public static void main(String[] args) 9 { 10 HashSet hs = new HashSet(); 11 //向HashSet集合中添加元素 12 hs.add(new Person("a1",11)); 13 hs.add(new Person("a2",12)); 14 hs.add(new Person("a3",13)); 15 hs.add(new Person("a2",12)); 16 //对集合进行迭代 17 Iterator it = hs.iterator(); 18 while(it.hasNext()) 19 { 20 Person p = (Person)it.next(); 21 22 sop(p.getName()+"::"+p.getAge()); 23 } 24 } 25 } 26 //定义一个Person类 27 class Person 28 { 29 private String name; 30 private int age; 31 public String getName() 32 { 33 return name; 34 } 35 public int getAge() 36 { 37 return age; 38 } 39 Person(String name,int age) 40 { 41 this.name = name; 42 this.age = age; 43 } 44 //覆盖hashCode方法 45 public int hashCode() 46 { 47 return name.hashCode()+age*3; 48 } 49 //这里的equals是复写Object类里的equals方法 50 public boolean equals(Object obj) 51 { 52 if(!(obj instanceof Person)) 53 return false; 54 Person p = (Person)obj; 55 return this.name.equals(p.name) && this.age == p.age; 56 } 57 58 }
判断元素唯一性的方式:通过对象的hashCode和equals方法来完成元素唯一性
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
九、TreeSet类
概念:使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
demo代码:
1 public class TreSetDemo 2 { 3 public static void main(String[] args) 4 { 5 TreeSet<Integer> ts = new TreeSet<Integer>(); 6 ts.add(22); 7 ts.add(17); 8 ts.add(24); 9 ts.add(19); 10 ts.add(18); 11 ts.add(20); 12 ts.add(18); 13 ts.add(23); 14 15 16 for(Integer i : ts) 17 { 18 System.out.print(i+" "); 19 } 20 } 21 } 22 //运行结果:17 18 19 20 22 23 24
标签:
原文地址:http://www.cnblogs.com/shadowW-W/p/4649914.html