Collection, List, Set, Map
Collection – 对象之间没有指定的顺序,允许重复元素。
Set – 对象之间没有指定的顺序,不允许重复元素
List– 对象之间有指定的顺序,允许重复元素,并引入位置下标。
Map – 接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供数值和关键字。Map 接口既不继承 Set 也不继承 Collection。
package collection;
import java.util.*;
public class CollectionToArray {
public static void main(String[] args) {
Collection collection1=new ArrayList();
//创建一个集合对象,ArrayList属于Collection的子类,相当于把一个中国人赋值给一个人
collection1.add("000");//添加对象到Collection集合中
collection1.add("111");
collection1.add("222");
System.out.println("集合collection1的大小:"+collection1.size());
System.out.println("集合collection1的内容:"+collection1);
collection1.remove("000");//从集合collection1中移除掉 "000" 这个对象
System.out.println("集合collection1移除 000 后的内容:"+collection1);
System.out.println("集合collection1中是否包含000 :"+collection1.contains("000"));
System.out.println("集合collection1中是否包含111 :"+collection1.contains("111"));
Collection collection2=new ArrayList();
collection2.addAll(collection1);//将collection1 集合中的元素全部都加到collection2中
System.out.println("集合collection2的内容:"+collection2);
collection2.clear();//清空集合 collection1 中的元素
System.out.println("集合collection2是否为空 :"+collection2.isEmpty());
//将集合collection1转化为数组
Object s[]= collection1.toArray(); //所有的集合类都有这个方法,转化成数组
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
}
}
迭代器
/*
* 迭代器(Iterator)的概念,也是出于一种设计模式就是为达成此目的而形成的。
* 所以Collection不提供get()方法。如果要遍历Collectin中的元素,就必须用Iterator。
* Java的Collection的Iterator 能够用来,:
1) 使用方法 iterator() 要求容器返回一个Iterator .第一次调用Iterator 的next() 方法时,它返回集合序列的第一个元素。
2) 使用next() 获得集合序列的中的下一个元素。
3) 使用hasNext()检查序列中是否元素。
4) 使用remove()将迭代器新返回的元素删除。
需要注意的是:方法删除由next方法返回的最后一个元素,在每次调用next时,remove方法只能被调用一次 。
大家看,Java 实现的这个迭代器的使用就是如此的简单。Iterator(跌代器)虽然功能简单,
但仍然可以帮助我们解决许多问题,同时针对List 还有一个更复杂更高级的ListIterator。
*/
package collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("s1");
collection.add("s2");
collection.add("s3");
Iterator iterator = collection.iterator();//得到一个迭代器
while (iterator.hasNext()) {//遍历
Object element = iterator.next(); // 返回迭代的下一个元素。
System.out.println("iterator = " + element);
}
if(collection.isEmpty())
System.out.println("collection is Empty!");
else
System.out.println("collection is not Empty! size="+collection.size());
Iterator iterator2 = collection.iterator();
while (iterator2.hasNext()) {//移除元素
Object element = iterator2.next();
System.out.println("remove: "+element);
iterator2.remove(); //从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
}
Iterator iterator3 = collection.iterator();
if (!iterator3.hasNext()) {//察看是否还有元素,hasNext()如果仍有元素可以迭代,则返回 true。
System.out.println("没有元素");
}
if(collection.isEmpty())
System.out.println("collection is Empty!");
//使用collection.isEmpty()方法来判断
}
}
List
package collection;
import java.util.*;
public class ListExample {
public static void main(String args[]) {
LinkedList queue = new LinkedList(); // LinkedList和ArrayList
queue.addFirst("Bernadine"); //将指定元素插入此列表的开头。
queue.addFirst("Elizabeth");
queue.addFirst("Gene");
queue.addFirst("Elizabeth");
queue.addFirst("Clara");
System.out.println(queue);
queue.removeLast(); // 移除并返回此列表的最后一个元素。
queue.removeLast();
System.out.println(queue);
Set set1=new TreeSet(); //不允许重复的元素
// List set1 = new ArrayList();
set1.add("a");
set1.add("b");
set1.add("b");
set1.add("c");
set1.add("d");
System.out.println(set1);
}
}
ListIterator 接口
/*
* ListIterator 接口继承 Iterator 接口以支持添加或更改底层集合中的元素,还支持双向访问
*/
package collection;
import java.util.*;
public class ListIteratorTest {
public static void main(String[] args) {
List list = new ArrayList(); //List是ArrayList的父类
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println("下标0开始:"+list.listIterator(0).next());//next()
System.out.println("下标1开始:"+list.listIterator(1).next());
System.out.println("子List 1-3:"+list.subList(1,3));//子列表
ListIterator it = list.listIterator();//默认从下标0开始
//隐式光标属性add操作 ,插入到当前的下标的前面
it.add("sss");
while(it.hasNext()){
System.out.println("next Index="+it.nextIndex()+",Object="+it.next());
}
ListIterator it0 = list.listIterator();//默认从下标0开始
while(it0.hasNext()){
System.out.println("next Index="+it0.nextIndex()+",Object="+it0.next());
}
//set属性
ListIterator it1 = list.listIterator();
it1.next();
//System.out.println("next Index="+it1.nextIndex()+",Object="+it1.next());
it1.set("ooo");
ListIterator it2 = list.listIterator(list.size());//下标
while(it2.hasPrevious()){
System.out.println("previous Index="+it2.previousIndex()+",Object="+it2.previous());
}
}
}
Map
package collection;
/*
* 对于Map部分的使用和实现,主要就是需要注意存放“键值对”中的对象的equals()方法和hashCode()方法的覆写。
* 如果需要使用到排序的话,那么还需要实现Comparable 接口中的compareTo() 方法。
* 我们需要注意Map中的“键”是不能重复的,而是否重复的判断,是通过调用“键”对象的equals()方法来决定的。
* 而在HashMap中查找和存取“键值对”是同时使用hashCode()方法和equals()方法来决定的。
*/
import java.util.*;
//身份证类
class Code{
final int id;//身份证号码已经确认,不能改变
Code(int i){
id=i;
}
//身份号号码相同,则身份证相同
public boolean equals(Object anObject) {
if (anObject instanceof Code){
Code other=(Code) anObject;
return this.id==other.id;
}
return false;
}
public String toString() {
return "身份证:"+id;
}
//覆写hashCode方法,并使用身份证号作为hash值
/* public int hashCode(){
return id;
}*/
}
//人员信息类
class Person {
Code id;// 身份证
String name;// 姓名
public Person(String name, Code id) {
this.id=id;
this.name=name;
}
//如果身份证号相同,就表示两个人是同一个人
public boolean equals(Object anObject) {
if (anObject instanceof Person){
Person other=(Person) anObject;
return this.id.equals(other.id);
}
return false;
}
public String toString() {
return "姓名:"+name+" 身份证:"+id.id+"\n";
}
}
public class HashCodeEx {
public static void main(String[] args) {
HashMap map=new HashMap();
Person p1=new Person("张三",new Code(123));
map.put(p1.id,p1);//我们根据身份证来作为key值存放到Map中
Person p2=new Person("李四",new Code(456));
map.put(p2.id,p2);
Person p3=new Person("王二",new Code(789));
map.put(p3.id,p3);
System.out.println("HashMap 中存放的人员信息:\n"+map);
// 张三 改名为:张山 但是还是同一个人。
Person p4=new Person("张山",new Code(123));
map.put(p4.id,p4);
System.out.println("张三改名后 HashMap 中存放的人员信息:\n"+map);
//查找身份证为:123 的人员信息
System.out.println("查找身份证为:123 的人员信息:"+map.get(new Code(123)));
}
}