java类集整理及例子

来源:互联网 发布:win10软件消失 编辑:程序博客网 时间:2024/06/06 03:00

JAVA类集 
类集的作用、CollectionMapIteratorListIteratorListSetEnumeration、二叉树算法 
JAVA SE的最重要四块知识:面向对象、类集、JAVA IO、数据库编程 
2、知识点 
1IO操作 
 BufferedReader:一次性读取数据 
 PrintStream:打印流 
 字节流:InputStreamOutputStream 
 File 
2、对象序列化 
2.2、本次预计讲解的知识点 
1、类集的作用 
2、单值集合:CollectionListSet 
3、二元偶集合:Map 
4、输出:IteratorListIteratorEnumeration 
5、类集的作用 
3、具体内容 
3.1、类集的作用 
类集:就是一个动态的对象数组。 
对象数组:可以保存一组对象,但是其本身有长度的限制。 
类集可以保存一组对象,但是此保存没有长度的限制。 
JAVA中类集的操作都在java.util包中,本身也分为两种操作形式: 
1、存放单值的类集,最大的接口是Collection,每次可以存放一个值。但是其下又分为两个子接口: 
 List接口:表示可以重复,插入的顺序即为输出顺序 
 Set接口:不能够有重复元素 
 List接口在实际中应用较为广泛 
主要操作方法: 
 添加一个对象:public boolean add(Object obj) 
 清空里面的所有内容:public void clear() ; 
 测试集合中是否包含指定元素:boolean contains(Object o) 
 判断集合是否为空:public boolean isEmpty() 
 从集合中删除指定内容:public boolean remove(Object o) 
 取得集合中大小:public int size() 
 将集合变为对象数组:public Object[] toArray() 
 将集合变为Iterator实例:public Iterator<E> iterator() 
对于整个Collection集合,只允许从前向后输出,没有从后向前输出的功能。 
讨论: 
 是使用Collection好,还是使用ListSet好呢? 
2、存放一对值的类型:Map集合 
value key 
 通过key可以找到value 
3CollectionMap的作用: 
 Collection主要用于数据输出上 
 Map主要用于数据查找上 
3.2List接口 
ListCollection的子接口,如果要想使用此接口,则必须通过其子类为其实例化,从运行效果中可以发现,在List中可以有重复的内容。 
List接口拥有比Collection接口中更多的方法,主要以下几个常用方法: 
 在指定位置上加入元素:public void add(int index,Object obj) 
 返回指定位置的元素:public Object get(int ind) 
 返回ListIterator实例:public ListIterator<E> listIterator() 
3.2.1、常用子类 
1 ArrayList:是一个新的类,是在JDK 1.2推出之后才有的。本身属于异步处理。性能高,但是不属于线程的安全处理。只允许使用Iterator接口输出。 
2Vector:是一个旧的类,是在JDK 1.0时推出的。本身属于同步处理。性能相对较低,但是属于线程安全的,因为使用了同步。可以使用IteratorEnumeration(使用类本身)输出 
3.2.2Vector 
Vetor也是经过发展之后不断改良,在最早就已经实现了动态数组的功能,之后之后又增加了List接口的实现,所以在整个代码之中对于Vector本身也有自己的一个特性: 
 增加元素:public void addElement(Object obj),此功能与add()一样。 
 枚举输出:public Enumeration<E> elements() 
Vector类中还有一个堆栈的类 —— Stack,此类实现了先进后出的功能。 
Stack中主要有以下两个方法: 
 入栈:public Object push(Object item) 
 出栈:public Object pop() 
3.2.3、使用List操作(ArrayList 
例如:以下代码演示了ArrayList的作用 
import java.util.* ; 
public class ColDemo01{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("A") ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
System.out.println(list) ; 

}; 
例如:使用clear()方法清空里面的全部内容 
import java.util.* ; 
public class ColDemo02{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("A") ; 
// 清空全部的内容 
list.clear() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
System.out.println(list) ; 

}; 
例如:测试contains()方法,查找指定内容 
import java.util.* ; 
public class ColDemo03{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
System.out.println(list.contains("A")) ; 
System.out.println(list.contains("X")) ; 

}; 
例如:验证集合是否为空 
import java.util.* ; 
public class ColDemo04{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
System.out.println(list.isEmpty()) ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
System.out.println(list.isEmpty()) ; 

}; 

例如:以下代码演示了remove()作用 
import java.util.* ; 
public class ColDemo05{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
list.remove("B") ; 
System.out.println(list) ; 

}; 
例如:将集合变为对象数组输出 
import java.util.* ; 
public class ColDemo06{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
Object str[] = list.toArray() ; 
for(int i=0;i<list.size();i++){ 
String s = (String)str[i] ; 
System.out.println(s) ; 


}; 
之前的所有代码在编译的时候都出现了以下的提示: 
注意: ColDemo01.java 使用了未经检查或不安全的操作。 
注意: 要了解详细信息,请使用 -Xlint:unchecked 重新编译。 
那么这样的错误提示,是因为在JDK 1.5之后加入了泛型的操作。因为类集中本身是使用Object进行接收的,而且接收的时候牵扯到转型问题,那么如果不指定泛型的话,则里面肯定可以加入各种类型的数据,那么在转型会出现类型转换异常。如下代码所示: 
import java.util.* ; 
public class ColDemo10{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add(1) ; 
list.add('2') ; 
Iterator iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = (String)iter.next() ; 
if("C".equals(str)){ 
// 使用了Iterator中的删除语法。 
iter.remove() ; 


System.out.println(list) ; 

}; 
那么此时,就可以加入泛型进行错误的回避,加入之后,集合中只能有一种类型,当然,在实际中集合中的数据也只有一种类型。 
import java.util.* ; 
public class ColDemo11{ 
public static void main(String args[]){ 
// Collection<String> list = new ArrayList<String>() ; 
List<String> list = new ArrayList<String>() ; 
list.add("A") ; 
list.add(1) ; 
list.add('2') ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = iter.next() ; 
System.out.println(str) ; 


}; 
以上加入了泛型操作之后,在编译的时候以上代码就会出现错误提示: 
ColDemo11.java:7: 找不到符号 
符号: 方法 add(int
位置: 接口 java.util.List<java.lang.String> 
 list.add(1) ; 
 ^ 
ColDemo11.java:8: 找不到符号 
符号: 方法 add(char
位置: 接口 java.util.List<java.lang.String> 
 list.add('2') ; 
 ^ 
错误 
所以,此时,代码只能按如下样式编写: 
import java.util.* ; 
public class ColDemo11{ 
public static void main(String args[]){ 
// Collection<String> list = new ArrayList<String>() ; 
List<String> list = new ArrayList<String>() ; 
list.add("A") ; 
list.add("B") ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = iter.next() ; 
System.out.println(str) ; 


}; 
例如:使用List进行由后向前的输出 
import java.util.* ; 
public class ColDemo12{ 
public static void main(String args[]){ 
List<String> list = new ArrayList<String>() ; 
list.add("A") ; 
list.add("B") ; 
list.add(1,"X") ; 
list.add(0,"H") ; 
list.add(2,"Y") ; 
for(int i=list.size()-1;i>=0;i--){ 
System.out.println(list.get(i)) ; 


}; 
3.2.4、使用List操作(Vector 
例如:使用Vector完成以上的操作 
import java.util.* ; 
public class ColDemo14{ 
public static void main(String args[]){ 
List<String> list = new Vector<String>() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
list.add("D") ; 
list.add("E") ; 
Iterator<String> liter = list.iterator() ; 
while(liter.hasNext()){ 
System.out.print(liter.next()+"") ; 


}; 
可以发现,整个程序与之前没有任何的区别。 
3.2.5、使用Stack操作 
例如:入栈和出栈 
import java.util.* ; 
public class ColDemo16{ 
public static void main(String args[]){ 
Stack<String> s = new Stack<String>() ; 
s.push("A") ; 
s.push("B") ; 
s.push("C") ; 
System.out.println(s.pop()) ; 
System.out.println(s.pop()) ; 
System.out.println(s.pop()) ; 
System.out.println(s.pop()) ; 

}; 
如果栈的内容已经空了,再继续出栈的话,则肯定出现以下的错误: 
Exception in thread "main" java.util.EmptyStackException 
3.3Set接口 
List接口不同的是Set接口中本身不能有任何的重复元素。 
List接口不同的是Set接口中并没有对Collection进行扩充,也就是说,Set只是比Collection接口增加了一个不能重复的功能。 
JAVA中通过类的HashCodeequals两个方法来确定是否是同一个对象。 
3.3.1、常用子类(理解) 
1HashSet:是散列存放的,无序 
2TreeSet:是排序的,使用Comparable接口排序(二叉树排序),如果使用Comparable的时候里面的所有字段都要进行比较,否则如果有若干个字段相同,而其他字段没有比较的话,系统会认为是重复的内容,而去掉。 

二叉树(Binary Tree),三种遍历方式: 
 前序遍历:根-- 
 中序遍历:左-- 
 后序遍历:左-- 
3.3.2、使用Set操作(HashSet 
例如:观察HashSet使用 
import java.util.* ; 
public class ColDemo17{ 
public static void main(String args[]){ 
Set<String> list = new HashSet<String>() ; 
list.add("A") ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
list.add("D") ; 
list.add("E") ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
3.3.3、使用Set操作(TreeSet 
例如:观察TreeSet功能 
import java.util.* ; 
public class ColDemo18{ 
public static void main(String args[]){ 
Set<String> list = new TreeSet<String>() ; 
list.add("A") ; 
list.add("X") ; 
list.add("B") ; 
list.add("D") ; 
list.add("Q") ; 
list.add("Q") ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
那么,如果现在给定了一个类的若干对象,如果使用TreeSet存放是否可以? 
import java.util.* ; 
class Person{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名;" + this.name + ",年龄;" + this.age ; 

}; 
public class ColDemo19{ 
public static void main(String args[]){ 
Set<Person> list = new TreeSet<Person>() ; 
list.add(new Person("张三",30)) ; 
list.add(new Person("李四",31)) ; 
list.add(new Person("王五",32)) ; 
Iterator<Person> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
以上代码运行的时候出现了以下的错误: 
Exception in thread "main" java.lang.ClassCastException: Person 
类型转换异常,因为TreeSet本身是带排序功能的,如果现在要对一个对象进行排序,则必须指定对象的排序规则,排序规则通过比较器 —— Comparable完成。 
import java.util.* ; 
class Person implements Comparable<Person>{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名;" + this.name + ",年龄;" + this.age ; 

public int compareTo(Person per){ 
if(this.age>per.age){ 
return -1 ; 
}else if(this.age<per.age){ 
return 1 ; 
}else
return 0 ; 


}; 
public class ColDemo20{ 
public static void main(String args[]){ 
Set<Person> list = new TreeSet<Person>() ; 
list.add(new Person("张三",30)) ; 
list.add(new Person("李四",31)) ; 
list.add(new Person("王五",32)) ; 
Iterator<Person> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
观察TreeSet的问题: 
 题目:设计一个学生类,此类包含姓名、年龄、成绩,产生一个对象数组,要求按成绩由高到低排序、如果成绩相等,则按年龄由低到高排序。 
通过java.util.Arrays类可以排序。public static void sort(Object[] a) 
发现以上的操作可以对一个对象数组进行排序 
import java.util.* ; 
class Student implements Comparable<Student>{ 
private String name ; 
private int age ; 
private float score ; 
public Student(String name,int age,float score){ 
this.name = name ; 
this.age = age ; 
this.score = score ; 

public String toString(){ 
return name + "\t\t" + age + "\t\t" + score ; 

public int compareTo(Student stu){ 
if(this.score>stu.score){ 
return -1 ; 
}else if(this.score<stu.score){ 
return 1 ; 
}else
if(this.age>stu.age){ 
return 1 ; 
}else if(this.age<stu.age){ 
return -1 ; 
}else
return this.name.compareTo(stu.name) ; 



}; 

public class ColDemo34{ 
public static void main(String args[]){ 
Set<Student> s = new TreeSet<Student>() ; 
s.add(new Student("张三",20,90.0f)) ; 
s.add(new Student("李四",22,90.0f)) ; 
s.add(new Student("王五",20,99.0f)) ; 
s.add(new Student("赵六",20,70.0f)) ; 
s.add(new Student("孙七",22,100.0f)) ; 
s.add(new Student("赵九",22,100.0f)) ; 
Iterator<Student> iter = s.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
3.3.4、二叉树排序(理解) 
对于整个JAVA来说所有的排序操作都是以Comparable展开的,所以现在重点观察Comparable 
以下代码全部使用String为例。 
例如:使用Comparable接收String对象 
public class ColDemo22{ 
public static void main(String args[]){ 
Comparable c = "abc" ; 
System.out.println(c) ; 

}; 
分析: 
1、所有对象打印的时候调用的都是toString() 
2String类中已经覆写toString() 
3StringObject的子类。 
4、如果直接打印Comparable接口对象,调用的是toString()方法,但是此时此对象是通过String实例化的,所以肯定使的是String中已经被覆写toString()方法。 
对于JAVA中可以使用以下的方式规定出二叉树的排序方式: 
class BinaryTree{ 
class Node{ 
// 具体的内容 
private Comparable data ; 
// 保存左子树 
private Node left ; 
// 保存右子树 
private Node right ; 
public void addNode(Node newNode){ 
// 要确定是放在左子树还是右子树 
if(newNode.data.compareTo(this.data)<0){ 
// 放在左子树 
if(this.left==null){ 
this.left = newNode ; 
}else
this.left.addNode(newNode) ; 


if(newNode.data.compareTo(this.data)>0){ 
// 放在左子树 
if(this.right==null){ 
this.right = newNode ; 
}else
this.right.addNode(newNode) ; 



public void printNode(){ 
// 先输出左子树 
if(this.left!=null){ 
this.left.printNode() ; 

// 输出根节点 
System.out.println(this.data) ; 
// 输出右子树 
if(this.right!=null){ 
this.right.printNode() ; 


}; 
// 确定根元素 
private Node root ; 
public void add(Comparable data){ 
Node newNode = new Node() ; 
newNode.data = data ; 
if(root==null){ 
// 第一个元素,设置成根元素 
root = newNode ; 
}else
// 如果此语句没有执行的话,则必须确定好是放在左子树还是右子树 
root.addNode(newNode) ; 


public void print(){ 
this.root.printNode() ; 

}; 
public class ColDemo23{ 
public static void main(String args[]){ 
BinaryTree bt = new BinaryTree() ; 
bt.add("C") ; 
bt.add("X") ; 
bt.add("A") ; 
bt.add("S") ; 
bt.add("O") ; 
bt.print() ; 

}; 

3.4Iterator接口 
3.4.1、接口的主要用处 
Iterator是一个迭代输出接口。 
Iterator接口定义: 
 判断下一个元素是否有内容:public boolean hasNext() 
 取出内容:public Object next() ; 
 从集合中删除元素:public void remove() ; 
例如:使用Iterator输出CollectionList)中的内容 
import java.util.* ; 
public class ColDemo07{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
Iterator iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = (String)iter.next() ; 
System.out.println(str) ; 


}; 
3.4.2、删除元素的说明 
ListIterator上都有remove方法。 
在使用Iterator迭代输出的时候,不能修改List中的内容,如果一旦修改,则肯定会出现错误。 
例如:以下代码在迭代输出的时候使用了List中的remove方法。 
import java.util.* ; 
public class ColDemo08{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
Iterator iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = (String)iter.next() ; 
if("C".equals(str)){ 
// 使用了List中的删除语法。 
list.remove(str) ; 



}; 
以上代码运行时出现了错误: 
Exception in thread "main" java.util.ConcurrentModificationException 
 at java.util.AbstractList$Itr.checkForComodification(Unknown Source) 
 at java.util.AbstractList$Itr.next(Unknown Source) 
 at ColDemo08.main(ColDemo08.java:11) 
同样的代码,现在直接使用Iterator中的删除方法完成: 
import java.util.* ; 
public class ColDemo09{ 
public static void main(String args[]){ 
// Collection list = new ArrayList() ; 
List list = new ArrayList() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
Iterator iter = list.iterator() ; 
while(iter.hasNext()){ 
String str = (String)iter.next() ; 
if("C".equals(str)){ 
// 使用了Iterator中的删除语法。 
iter.remove() ; 


System.out.println(list) ; 

}; 

3.4.3、子接口 —— ListIterator 
Iterator本身只支持由前向后的输出,并不支持由后向前,那么其有一个子接口 —— ListIterator,此接口可以将内容从前向后,也可以从后向前,但是必须注意的是:必须先由前向后输出完之后,才能由后向前输出。只有List接口的对象才可以使用此种方法。 
ListIterator中的主要方法: 
 判断是否有下一个内容:public boolean hasNext() 
 取出下一个元素:public Object next() 
 判断是否有上一个元素:public boolean hasPrevious(); 
 取出上一个元素:public Object previous() ; 
 本身ListIterator也是支持泛型的 
例如:以下代码演示了ListIterator的作用 
import java.util.* ; 
public class ColDemo13{ 
public static void main(String args[]){ 
List<String> list = new ArrayList<String>() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
list.add("D") ; 
list.add("E") ; 
ListIterator<String> liter = list.listIterator() ; 
System.out.println(" ============== 由前向后输出 ==================") ; 
while(liter.hasNext()){ 
System.out.print(liter.next()+"") ; 

System.out.println("") ; 
System.out.println(" ============== 由后向前输出 ==================") ; 
while(liter.hasPrevious()){ 
System.out.print(liter.previous()+"") ; 


}; 
3.4Enumeration接口 
是最早的迭代输出接口,其本身的功能和Iterator类似,但是因为其出现较早,而且代码本身存在安全问题,所以现在使用较少,但是对于一些原有的系统中的若干方法,还是只能使用Enumeration输出。 
Enumerationi接口的定义: 
 判断是否有下一个元素:public boolean hasMoreElements() 
 取出元素:public Object nextElement() 
例如:使用Enumeration输出Vector中的内容 
import java.util.* ; 
public class ColDemo15{ 
public static void main(String args[]){ 
Vector<String> list = new Vector<String>() ; 
list.add("A") ; 
list.add("B") ; 
list.add("C") ; 
list.add("D") ; 
list.add("E") ; 
Enumeration<String> enu = list.elements() ; 
while(enu.hasMoreElements()){ 
System.out.print(enu.nextElement()+"") ; 


}; 
3.5foreach输出(了解) 
提供了比Iterator更简单的输出语法,但是是在JDK 1.5之后才增加的。 
语法格式: 
for(类型 对象:集合)
进行对象的操作 

例如:验证foreach语法 
import java.util.* ; 
class Person implements Comparable<Person>{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名;" + this.name + ",年龄;" + this.age ; 

public int compareTo(Person per){ 
if(this.age>per.age){ 
return -1 ; 
}else if(this.age<per.age){ 
return 1 ; 
}else
return 0 ; 


}; 
public class ColDemo21{ 
public static void main(String args[]){ 
Set<Person> list = new TreeSet<Person>() ; 
list.add(new Person("张三",30)) ; 
list.add(new Person("李四",31)) ; 
list.add(new Person("王五",32)) ; 
for(Person p:list){ 
System.out.println(p) ; 


}; 

3.6Map接口 
与之前Collection不同的是Map接口可以存放一对值。 
MapSet一样,本身不能有任何重复的内容(key不能重复)。 
主要操作方法如下; 
 向集合中插入一组数据:public V put(K key,V value) 
 根据key取出valuepublic V get(Object key) 
Map中因为其组成较为特殊,所以本身不直接支持Iterator输出。 
Set实例 entrySet()  步骤:Map   区分keyvalue Map.Entry实例  Iterator  
 Map.Entry:是Map的内部接口 
|- 得到keypublic K getKey() 
|- 得到valuepublic V getValue() 
 操作方法: 
|- 将全部的Map变为Set集合:public Set<Map.Entry<K,V>> entrySet() 
|- 将全部的key变为Set集合:public Set<K> keySet() 
|- 将全部的value变为Collection集合:public Collection<V> values() 
3.6.1、常用子类 
1HashMap:是一个新的类,是在JDK 1.2之后推出的,属于异步处理方式。 
2Hashtable:是一个旧的类,是在JDK 1.0时推出,属于同步处理方式 
3TreeMap:按照key排序,同样key所在的类必须实现Comparable接口 
3.6.2Hashtable子类 —— Properties 
Hashtable不同的是Properties主要操作的内容为字符串,表示的是属性操作。 
Properties的主要方法: 
 设置属性:public Object setProperty(String key, String value) 
 取得属性: 
|- public String getProperty(String key):根据key找到value,没找到返回null 
|- public String getProperty(String key,String defaultValue):如果没有找到,则指定默认值。 
 保存属性到文件:public void store(OutputStream out,String comments) throws IOException 
 从文件中读取内容:public void load(InputStream inStream) throws IOException 
 把文件保存成XML样式: 
|- public void storeToXML(OutputStream os,String comment) throws IOException 
 XML样式的文件之中读取属性: 
|- public void loadFromXML(InputStream in) throws IOException, 
 InvalidPropertiesFormatException 
3.6.3Map操作(HashMap 
例如:通过HashMap验证Map的使用 
import java.util.* ; 
public class ColDemo24{ 
public static void main(String arg[]){ 
Map<String,String> m = new HashMap<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
String str = m.get("zhangsan") ; 
System.out.println(str) ; 
System.out.println(m.get("xxx")) ; 

}; 
3.6.4Map操作(Hashtable 
import java.util.* ; 
public class ColDemo25{ 
public static void main(String arg[]){ 
Map<String,String> m = new Hashtable<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
String str = m.get("zhangsan") ; 
System.out.println(str) ; 
System.out.println(m.get("xxx")) ; 

}; 
3.6.5Map操作(TreeMap 
import java.util.* ; 
public class ColDemo26{ 
public static void main(String arg[]){ 
Map<String,String> m = new TreeMap<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
String str = m.get("zhangsan") ; 
System.out.println(str) ; 
System.out.println(m.get("xxx")) ; 

}; 
3.6.6Map操作(输出) 
1、使用Iterator输出Map中的全部数据(格式是固定的) 
 public Set<Map.Entry<K,V>> entrySet() 
import java.util.* ; 
public class ColDemo27{ 
public static void main(String arg[]){ 
Map<String,String> m = new TreeMap<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
Set<Map.Entry<String,String>> list = m.entrySet() ; 
Iterator<Map.Entry<String,String>> iter = list.iterator() ; 
while(iter.hasNext()){ 
Map.Entry me = iter.next() ; 
System.out.println(me.getKey() + " --> " + me.getValue()) ; 


}; 
2、将Map中全部的key输出 
import java.util.* ; 
public class ColDemo28{ 
public static void main(String arg[]){ 
Map<String,String> m = new TreeMap<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
Set<String> list = m.keySet() ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 

3、将Map中全部的value输出 
import java.util.* ; 
public class ColDemo29{ 
public static void main(String arg[]){ 
Map<String,String> m = new TreeMap<String,String>() ; 
m.put("zhangsan","123456") ; 
m.put("lisi","234567") ; 
m.put("wangwu","345678") ; 
Collection<String> list = m.values() ; 
Iterator<String> iter = list.iterator() ; 
while(iter.hasNext()){ 
System.out.println(iter.next()) ; 


}; 
3.6.7Map操作(问题) 
例如:定义一个Person类,里面有nameage属性,之后在Map中保存一个person对象。 
import java.util.* ; 
class Person{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名:" + this.name + ",年龄:" + this.age ; 

}; 
public class ColDemo30{ 
public static void main(String args[]){ 
Map<String,Person> m = new HashMap<String,Person>() ; 
m.put("zhangsan",new Person("张三",30)) ; 
System.out.println(m.get("zhangsan")) ; 

}; 
以上的运行结果,可以发现内容已经查找出来了。如果现在换个方式,使用Person对象表示张三呢? 
import java.util.* ; 
class Person{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名:" + this.name + ",年龄:" + this.age ; 

}; 
public class ColDemo31{ 
public static void main(String args[]){ 
Map<Person,String> m = new HashMap<Person,String>() ; 
m.put(new Person("张三",30),"zhangsan") ; 
System.out.println(m.get(new Person("张三",30))) ; 

}; 
从运行结果,发现,里面没有任何的内容,返回一个null。此时再修改代码: 
import java.util.* ; 
class Person{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名:" + this.name + ",年龄:" + this.age ; 

}; 
public class ColDemo32{ 
public static void main(String args[]){ 
Map<Person,String> m = new HashMap<Person,String>() ; 
Person p = new Person("张三",30) ; 
m.put(p,"zhangsan") ; 
System.out.println(m.get(p)) ; 

}; 
以上可以找到代号。 
从以上代码中可以发现问题: 
 如果使用字符串作为key,就算是匿名对象也是可以找得到 
 如果自己编写了一个key,则如果使用匿名对象则无法找到。 
因为在对象上有一个对象自己的编码,那么如果要想使用此编码,则必须在对象所在的类中覆写Object类中的hashCode()方法。 
import java.util.* ; 
class Person{ 
private String name ; 
private int age ; 
public Person(String name,int age){ 
this.name = name ; 
this.age = age ; 

public String toString(){ 
return "姓名:" + this.name + ",年龄:" + this.age ; 

public boolean equals(Object obj){ 
if(this==obj){ 
return true ; 

if(!(obj instanceof Person)){ 
return false ; 

Person p = (Person)obj ; 
if(this.name.equals(p.name)&&this.age==p.age){ 
return true ; 
}else
return false ; 


public int hashCode(){ 
// 正常来说,应该为hashCode的产生自己定义一个公式 
return this.age * this.name.hashCode() ; 

}; 
public class ColDemo33{ 
public static void main(String args[]){ 
Map<Person,String> m = new HashMap<Person,String>() ; 
m.put(new Person("张三",30),"zhangsan") ; 
System.out.println(m.get(new Person("张三",30))) ; 

}; 

3.6.8Properties操作 
1、向Properties中设置属性,并取得属性 
import java.util.* ; 
public class ColDemo35{ 
public static void main(String args[]){ 
Properties pro = new Properties() ; 
pro.setProperty("BJ","BeiJing") ; 
pro.setProperty("NJ","NanJing") ; 
pro.setProperty("SH","ShangHai") ; 
System.out.println(pro.getProperty("BJ")) ; 
System.out.println(pro.getProperty("XJ")) ; 
System.out.println(pro.getProperty("XJ","nofound")) ; 

}; 
2、将全部的属性保存在普通文件之中 
import java.util.* ; 
import java.io.* ; 
public class ColDemo36{ 
public static void main(String args[]) throws Exception{ 
Properties pro = new Properties() ; 
pro.setProperty("BJ","BeiJing") ; 
pro.setProperty("NJ","NanJing") ; 
pro.setProperty("SH","ShangHai") ; 
pro.store(new FileOutputStream(new File("e:\\pro.ini")),"AREA") ; 

}; 
3、从文件中读取属性 
import java.util.* ; 
import java.io.* ; 
public class ColDemo37{ 
public static void main(String args[]) throws Exception{ 
Properties pro = new Properties() ; 
pro.load(new FileInputStream(new File("e:\\pro.ini"))) ; 
System.out.println(pro.getProperty("BJ")) ; 

}; 
4、将属性按照XML样式的风格进行保存 
import java.util.* ; 
import java.io.* ; 
public class ColDemo38{ 
public static void main(String args[]) throws Exception{ 
Properties pro = new Properties() ; 
pro.setProperty("BJ","BeiJing") ; 
pro.setProperty("NJ","NanJing") ; 
pro.setProperty("SH","ShangHai") ; 
pro.storeToXML(new FileOutputStream(new File("e:\\pro.xml")),"AREA") ; 

}; 
5、将属性从XML中读取出来 
import java.util.* ; 
import java.io.* ; 
public class ColDemo39{ 
public static void main(String args[]) throws Exception{ 
Properties pro = new Properties() ; 
pro.loadFromXML(new FileInputStream(new File("e:\\pro.xml"))) ; 
System.out.println(pro.getProperty("BJ")) ; 

}; 
现在操作属性的时候基本上都是以XML样式为准。 
3.7、实例 
3.7.1、实例一 
一个人有多本书,一本书属于一个人。 
package org.lxh.demo1; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
class Person { 
private String name; 
private int age; 
private List<Book> listBooks; 
public Person() { 
this.listBooks = new ArrayList<Book>(); 

public Person(String name, int age) { 
this(); 
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; 

public List<Book> getlistBooks() { 
return listBooks; 

public void setlistBooks(List<Book> listBooks) { 
this.listBooks = listBooks; 


class Book { 
private String title; 
private Person person; 
public Book(String title) { 
super(); 
this.title = title; 

public String getTitle() { 
return title; 

public void setTitle(String title) { 
this.title = title; 

public Person getPerson() { 
return person; 

public void setPerson(Person person) { 
this.person = person; 


public class Demo01 { 
public static void main(String[] args) { 
Person per = new Person("张三", 30); 
Book b1 = new Book("JAVA"); 
Book b2 = new Book("C"); 
Book b3 = new Book("NET"); 
per.getlistBooks().add(b1); 
per.getlistBooks().add(b2); 
per.getlistBooks().add(b3); 
b1.setPerson(per); 
b2.setPerson(per); 
b3.setPerson(per); 
System.out.println("姓名:" + per.getName() + ",年龄:" + per.getAge()); 
Iterator<Book> iter = per.getlistBooks().iterator(); 
while (iter.hasNext()) { 
System.out.println("\t|- " + iter.next().getTitle()); 



3.7.2、实例二 
一个学生可以选多个课程,一个课程可以多个学生参加。 
package org.lxh.demo2; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
class Student { 
private String name; 
private List<Course> listCourses; 
public Student() { 
this.listCourses = new ArrayList<Course>(); 

public Student(String name) { 
this(); 
this.name = name; 

public String getName() { 
return name; 

public void setName(String name) { 
this.name = name; 

public List<Course> getlistCourses() { 
return listCourses; 

public void setlistCourses(List<Course> listCourses) { 
this.listCourses = listCourses; 


class Course { 
private String name; 
public List<Student> listStudents; 
public Course() { 
this.listStudents = new ArrayList<Student>(); 

public Course(String name) { 
this(); 
this.name = name; 

public String getName() { 
return name; 

public void setName(String name) { 
this.name = name; 

public List<Student> getlistStudents() { 
return listStudents; 

public void setlistStudents(List<Student> listStudents) { 
this.listStudents = listStudents; 


public class Demo02 { 
public static void main(String[] args) { 
Student s1 = new Student("张三"); 
Student s2 = new Student("李四"); 
Student s3 = new Student("王五"); 
Student s4 = new Student("赵六"); 
Student s5 = new Student("孙七"); 
Course c1 = new Course("JAVA"); 
Course c2 = new Course("Oracle"); 
// 设置关系 
s1.getlistCourses().add(c1); 
c1.getlistStudents().add(s1); 
s2.getlistCourses().add(c1); 
c1.getlistStudents().add(s2); 
s3.getlistCourses().add(c1); 
c1.getlistStudents().add(s3); 
s4.getlistCourses().add(c2); 
c2.getlistStudents().add(s4); 
s5.getlistCourses().add(c2); 
c2.getlistStudents().add(s5); 
s1.getlistCourses().add(c2); 
c2.getlistStudents().add(s1); 
s2.getlistCourses().add(c2); 
c2.getlistStudents().add(s2); 
System.out.println("学生:" + s1.getName()); 
Iterator<Course> iter1 = s1.getlistCourses().iterator(); 
while (iter1.hasNext()) { 
System.out.println("\t|- " + iter1.next().getName()); 

System.out.println("---------------------------------"); 
System.out.println("课程:" + c2.getName()); 
Iterator<Student> iter2 = c2.getlistStudents().iterator(); 
while (iter2.hasNext()) { 
System.out.println("\t|- " + iter2.next().getName()); 



4、总结 
1Collection(保存单个对象) 
 List:允许有重复元素,拥有更多的操作方法 
|- ArrayList:新的、异步处理 
|- Vector:旧的, 同步处理,支持IteratorEnumeration两种输出 
|- Stack:入栈、出栈 
 Set:不允许有重复元素,靠hashCodeequals方法来区分重复元素 
|- HashSet:无序 
|- TreeSet:有序、按照Comparable指定的规则排序 
 常用方法:add()iterator()remove 
2Map(保存一对对象) 
 HashMap:新的类,异步处理 
 Hashtable:旧的类,同步处理 
|- Properties(属性操作),可以将属性保存在文件之中 
 TreeMap:排序操作类,此类按key排序,使用Comparable完成 
 主要方法:putgetentrySet 
 Map不能直接使用Iterator输出,必须转换成Set,通过Map.Entry分离keyvalue 
3Iterator 
 输出接口,只要是类集都使用此接口输出,一般情况下很少有删除代码出现 
 主要方法: 
|- 判断是否有下一个元素:public boolean hasNext() 
|- 取出当前元素:public Object next() 
 子接口:ListIterator 
|- 双向输出,但是此接口只能通过List实例化 
4Enumeration接口 
 最早的输出接口,现在部分代码上依然使用 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 存钱钱卡住了怎么办 办理身份证指纹录不上怎么办 手指没有指纹了怎么办 签了户口身份证怎么办 生了三胎户口怎么办 双户口注销学历怎么办 户口注销了社保怎么办 科一指纹录不上怎么办 右倒库右边太宽怎么办 手机录不了指纹怎么办 6sp指纹不灵敏怎么办 手指纹汗多怎么办? 手指没指纹怎么办身份证 青岛身份证丢了怎么办 新身份证没激活怎么办 坐轻轨没身份证怎么办 办身份证指纹录不上怎么办 指纹固化剂干了怎么办 指纹解锁没反应怎么办 荣耀v8指纹失灵怎么办 指纹多次不匹配怎么办 华为指纹被禁用怎么办 手脱皮没有指纹怎么办 手脱皮手机指纹怎么办 手脱皮录指纹怎么办 科二指纹打不上怎么办 三星手机无法解锁怎么办 iphone7指纹坏了怎么办 苹果8录不上指纹怎么办 手机套总是粘指纹怎么办 华为p9指纹禁用怎么办 华为p10升级失败怎么办 手机指纹锁没反应怎么办 华为手机指纹禁用怎么办 excel输入值非法怎么办 excel表数字乱码怎么办 excel表格打不开了怎么办 表格中数字乱码怎么办 手机颜色变了怎么办 身份证上的字母怎么办 身份证被盗用贷款怎么办