在JDK API中专门设计了一组类,其功能是实现各种各样的数据存储,这样的一组专门用来存储其他对象的类,一般被称为对象容器类,简称为容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。集合框架中容器类和关系如图:
一、Collection接口
Set接口存放的是元素是无序的且不包含重复元素,而List接口存放的是元素是有序的而且允许有重复元素。
1.List
(1)ArrayList
下面是一个一个小例子,使用三种方法输出ArrayList中的元素
package com.MissXu.Collection;
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");//add()方法添加元素
list.add("C");
list.add("E");
list.add("D");
list.add(2,"B");//add(int index, E element)方法指定插入元素的位置
/*for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i) + " ");
}*/
/*Object[] obj = list.toArray();
for(int i = 0;i < list.size(); i++){
System.out.print(obj[i] + " ");
}*/
String[] s = list.toArray(new String[]{});
for(int i = 0; i < list.size(); i++){
System.out.print(s[i] + " ");
}
}
}
下面是上述例子所用到的方法:
add() 方法添加元素
add(int index, E element) 方法指定插入元素的位置
clear() 从列表中移除所有元素
get(int index) 返回列表中指定位置的元素。
size() 返回列表中的元素数。
toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
toArray(T[] a) 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
运行结果:
(2)LinkedList
下面是一个小例子,用到的方法已注明。
package com.MissXu.Collection;
import java.util.*;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.addFirst("X");//表头插入元素
linkedList.addLast("Y");//表尾插入元素
System.out.println("链表头:"+linkedList.getFirst());//获取表头元素
System.out.println("链表尾:"+linkedList.getLast());//获取表尾元素
System.out.println("元素C的索引"+linkedList.indexOf("C"));//某元素的索引位置
//element()方法的使用
for(int i = 0;i < linkedList.size(); i++){
System.out.print(linkedList.element());//获取但不移除此列表的头(第一个元素)
}
System.out.println("\n使用elememt()之后的元素为: "+linkedList);
//poll()方法的使用,注意这里循环的次数
for(int i = 0; i < linkedList.size(); i++){
System.out.print(linkedList.poll());//获取并移除此列表的头(第一个元素)
}
System.out.println("\n使用poll()之后的元素为: "+linkedList);
}
}
因为poll方法使用时是取出并删除第一个元素,所以list的size在减小,这时只循环了三次。
运行结果:
2.HashSet
(1)HashSet不能重复
package com.MissXu.Collection;
import java.util.*;
public class SetDemo1 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("A");
set.add("A");
set.add("B");
set.add("A");
set.add("D");
set.add("A");
set.add("E");
System.out.println(set);
}
}
(2)HashSet不保存添加元素的顺序:
package com.MissXu.Collection;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("ereree");
set.add("asss");
set.add("fdfs");
set.add("dvv");
set.add("fsd");
set.add("ea");
set.add("dfsfe");
System.out.println(set);
}
}
运行结果:
这里使用一个自定义类Person来进行一个稍微复杂一些的例子:
因为Set集合中不能添加重复的元素所以对于自定义类,需要提供判断怎么才算重复的方法,这里的hasCode()和equals()方法是判断两个人类对象是否重复的标准方法。Java规范:如果用户重写了equals()方法就必须重写hashCode()方法。
这里是自定义的Person类:
package com.MissXu.Collection;
public class Person implements Comparable{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写toString方法
public String toString() {
return "Person [name = " + name + ", age = " + age + "]";
}
//自定义比较人类的方法,用年龄比较,年龄相同则比较姓名(系统原来的字符串比较方法compareTo())
public int compareTo(Person person) {
if(this.age > person.age){
return 1;
}else if(this.age < person.age ){
return -1;
}else{
return this.name.compareTo(person.name);
}
}
//Java规范:如果用户重写了equals()方法就必须重写hashCode()方法
public int hashCode() {
return this.name.hashCode() * this.age;
}
//判断是否是相同的两个人
public boolean equals(Object obj) {
if(this == obj){
return true;
}
//如果不是人类的对象,不可能是同一个人,直接return false
if(!(obj instanceof Person)){
return false;
}
//是人类对象,则继续比较姓名和年龄是否相等,这里定义name和age都相等的为同一个人
Person person = (Person)obj;
if(this.name.equals(person.name) && this.age == person.age){
return true;
}else{
return false;
}
}
}
这里是稍复杂的hashSet的例子:
package com.MissXu.Collection;
import java.util.*;
public class SetDemo2 {
public static void main(String[] args) {
Set set=new HashSet();
set.add(new Person("张三",30));
set.add(new Person("李四",30));
set.add(new Person("王五",31));
set.add(new Person("赵六",31));
set.add(null);//空
set.add(new Person("孙七",32));
set.add(new Person("钱八",32));
set.add(new Person("张三",33));
set.add(new Person("张三",33));//重复元素
set.add(null);//空
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果:
(2)treeSet不重复但排序
package com.MissXu.Collection;
import java.util.*;
public class TreeSetDemo {
public static void main(String[] args) {
Set set = new TreeSet();
set.add("C");
set.add("D");
set.add("A");
set.add("B");
set.add("E");
set.add("C");
set.add("A");
set.add("E");
System.out.println(set);
}
}
运行结果:
二、Map接口
HashMap
K - 此映射所维护的键的类型
V - 所映射值的类型
package com.MissXu.Collection;
import java.util.*;
public class HashMapDemo {
public static void main(String[] args) {
Map map = new HashMap();
map.put("A", 1);//put()方法添加元素
map.put("B", 2);
map.put("A", 1);//重复元素
map.put("C", 4);
Integer value=map.get("B");//获取值
System.out.println(value);
System.out.println(map);
}
}
运行结果:
三、输出接口;Iterator接口、ListIterator接口、foreach等等。
package com.MissXu.Collection;
import java.util.*;
public class IteratorDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
//迭代
Iterator it=list.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
System.out.println("\n---------------");
//foreach
for(String s:list){
System.out.print(s+" ");
}
}
}