JDK CHM文档
1.1、主要集合概述
Java集合主要有3种重要的类型:
- List:是一个有序集合,可以放重复的数据(底层是数组)
- Set:是一个无序集合,不允许放重复的数据(底层是map的key)
- Map:是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复,值对象可以重复(身份证号—姓名)
![PQ}VFY78S]RW0[1Q%(HTL.png](https://cdn.nlark.com/yuque/0/2022/png/23145762/1648288002597-b98e43e7-2e8b-4df4-a1e1-69d894090ecd.png#clientId=u46bddb6f-70cf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=357&id=ue5a2f7f5&margin=%5Bobject%20Object%5D&name=PQ%7DVFY78S%5DRW0%5B1Q%25%28HTL.png&originHeight=446&originWidth=821&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27771&status=done&style=shadow&taskId=u9f5a00e6-4208-4479-b2a7-c3c831ac880&title=&width=656.8)
1.2、Collection和Iterator
Collection是List和Set的父接口,在Collection中定义了一些主要方法
boolean | add(E o) 确保此 collection 包含指定的元素(可选操作)。 |
---|---|
boolean | addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 |
void | clear() 移除此 collection 中的所有元素(可选操作)。 |
boolean | contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 |
boolean | containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 |
boolean | equals(Object o) 比较此 collection 与指定对象是否相等。 |
int | hashCode() 返回此 collection 的哈希码值。 |
boolean | isEmpty() 如果此 collection 不包含元素,则返回 true。 |
Iterator |
iterator() 返回在此 collection 的元素上进行迭代的迭代器。 |
boolean | remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
boolean | removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
boolean | retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
int | size() 返回此 collection 中的元素数。 |
Object[] | toArray() 返回包含此 collection 中所有元素的数组。 |
toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
关于Iterator接口说明,Iterator称为迭代接口,通过此接口可以遍历集合中的数据,此接口主要方法为:
boolean | hasNext() 如果仍有元素可以迭代,则返回 true。 |
---|---|
E | next() 返回迭代的下一个元素。 |
1.3、List接口
1.3.1、List接口概述
List接口下面主要有两个实现ArrayList和LinkedList,他们都是有顺序的,也就是放进去是什么顺序,取出来还是什么顺序,也就是基于线性存储,可以看作是一个可变数组.
- ArrayList:查询数据比较快,添加和删除数据比较慢(基于可变数组)
数组查找是基于下标的物理查找,所以比较快
- LinkedList:查询数据比较慢,添加和删除数据比较快(基于链表数据结构)
- Vector:和ArrayList类似的,都是数组,只不过是线程安全的,加了synchronized ```java import java.util.*;
public class ArrayListTest01 {
public static void main(String[] args) {
//最好不要这样写,这样属于面向具体编程了
//无法达到灵活互换
//最好面向接口编程
ArrayList arrayList = new ArrayList();
//采用面向接口编程
//使用Collection会更灵活,如果List不能满足要求
//那么可以采用HashSet,因为HashSet也实现了该接口
Collection c = new ArrayList();
//面向接口编程
//采用list接口可以使用Collection里的方法
//也可以使用list接口扩展的方法
List l = new ArrayList();
//自动装箱,适合于jdk1.5
l.add(1);
l.add(3);
//jdk1.5以前,必须如下使用
l.add(new Integer(2));
l.add(new Integer(4));
//可以加入重复数据
l.add(2);
//不能加入字符串
//在强制转换时会出现ClassCastException错误
//l.add("sadfdsfs");
//可以采用List接口的中get()方法依次取得元素
//输出结果为,不会打乱顺序
/*
1
3
2
4
2
*/
for (int i=0; i<l.size(); i++) {
//将Object强制转换为Integer
Integer e = (Integer)l.get(i);
System.out.println(e);
}
System.out.println("");
//调用remove删除集合中的元素
//如果元素重复会remove掉第一个匹配的
l.remove(2);
//采用Iterator遍历数据(while循环)
//Iterator是一种模式,主要可以统一数据结构的访问方式
//这样在程序中就不用关心各个数据结构的实现了
//使对不同数据结构的遍历更加简单了,更加统一了
Iterator iter = l.iterator();
while (iter.hasNext()) {
Integer v = (Integer)iter.next();
System.out.println(v);
}
System.out.println("");
//采用Iterator遍历数据(for循环)
for (Iterator iter1=l.iterator(); iter1.hasNext();) {
Integer v = (Integer)iter1.next();
System.out.println(v);
}
//在集合中是否包含3,输出为:true
System.out.println(l.contains(3));
//集合是否为空,输出:false
System.out.println(l.isEmpty());
System.out.println("");
//转换成对象数组
Object[] oArray1 = l.toArray();
for (int i=0; i<oArray1.length; i++) {
Integer v = (Integer)oArray1[i];
System.out.println(v);
}
System.out.println("");
//运行时自动创建相应类型的数组
Integer[] iArray = new Integer[l.size()];
l.toArray(iArray);
for (int i=0; i<iArray.length; i++) {
int v = iArray[i];
System.out.println(v);
}
}
}
<a name="Jz5Uw"></a>
### **1.3.2、LinkedList**
用法同ArrayList
```java
import java.util.*;
public class LinkedListTest01 {
public static void main(String[] args) {
//最好不要这样写,这样属于面向具体编程了
//无法达到灵活互换
//最好面向接口编程
LinkedList arrayList = new LinkedList();
//采用面向接口编程
//使用Collection会更灵活,如果List不能满足要求
//那么可以采用HashSet,因为HashSet也实现了该接口
Collection c = new LinkedList();
//面向接口编程
//采用list接口可以使用Collection里的方法
//也可以使用list接口扩展的方法
//List l = new ArrayList();
//因为LinkedList和ArrayList都实现了List接口,所以我们可以灵活互换
//直接修改为LinkedList,对我们的程序没有任何影响
List l = new LinkedList();
//自动装箱,适合于jdk1.5
l.add(1);
l.add(3);
//jdk1.5以前,必须如下使用
l.add(new Integer(2));
l.add(new Integer(4));
//可以加入重复数据
l.add(2);
for (int i=0; i<l.size(); i++) {
Integer e = (Integer)l.get(i);
System.out.println(e);
}
System.out.println("");
l.remove(2);
Iterator iter = l.iterator();
while (iter.hasNext()) {
Integer v = (Integer)iter.next();
System.out.println(v);
}
System.out.println("");
for (Iterator iter1=l.iterator(); iter1.hasNext();) {
Integer v = (Integer)iter1.next();
System.out.println(v);
}
System.out.println(l.contains(3));
System.out.println(l.isEmpty());
System.out.println("");
Object[] oArray1 = l.toArray();
for (int i=0; i<oArray1.length; i++) {
Integer v = (Integer)oArray1[i];
System.out.println(v);
}
System.out.println("");
Integer[] iArray = new Integer[l.size()];
l.toArray(iArray);
for (int i=0; i<iArray.length; i++) {
int v = iArray[i];
System.out.println(v);
}
}
}
修改为HashSet实现类,重点了解面向接口编程的好处
import java.util.*;
public class LinkedListTest02 {
public static void main(String[] args) {
//采用面向接口编程
//使用Collection会更灵活,如果List不能满足要求
//那么可以采用HashSet,因为HashSet也实现了该接口
//Collection c = new LinkedList();
//可以修改为HashSet
Collection c = new HashSet();
//不能改为HashSet,因为HashSet不是List产品
//List l = new HashSet();
//自动装箱,适合于jdk1.5
c.add(1);
c.add(3);
//jdk1.5以前,必须如下使用
c.add(new Integer(2));
c.add(new Integer(4));
//可以加入重复数据
c.add(2);
/*
for (int i=0; i<c.size(); i++) {
//不能采用get,因为get是List接口扩展的
//父类不能看到子类扩展的功能
//反过来子类可以看到父类的功能,因为子类继承了父类
Integer e = (Integer)c.get(i);
System.out.println(e);
}
*/
System.out.println("");
Iterator iter = c.iterator();
while (iter.hasNext()) {
Integer v = (Integer)iter.next();
System.out.println(v);
}
System.out.println("");
for (Iterator iter1=c.iterator(); iter1.hasNext();) {
Integer v = (Integer)iter1.next();
System.out.println(v);
}
System.out.println(c.contains(3));
System.out.println(c.isEmpty());
System.out.println("");
Object[] oArray1 = c.toArray();
for (int i=0; i<oArray1.length; i++) {
Integer v = (Integer)oArray1[i];
System.out.println(v);
}
System.out.println("");
Integer[] iArray = new Integer[c.size()];
c.toArray(iArray);
for (int i=0; i<iArray.length; i++) {
int v = iArray[i];
System.out.println(v);
}
}
}
1.3.3、Vector
//Vector的用法
Vector vv=new Vector();
AEmp emp1=new AEmp("1","aa",1.2f);
AEmp emp2=new AEmp("2","bb",1.2f);
AEmp emp3=new AEmp("3","cc",1.2f);
vv.add(emp1);
vv.add(emp2);
vv.add(emp3);
//遍历
for(int i=0;i<vv.size();i++){
AEmp emp=(AEmp)vv.get(i);
System.out.println(emp.getName());
}
ArrayList和Vector的区别
相同点:都是java的集合类,都可以用来存放java对象
不同点:
1、同步性 (Vector是线程同步的,ArrayList则是线程异步的)
2、数据增长
1.4、Set接口
1.4.1、哈希表
哈希表是一种数据结构,哈希表能够提供快速存取操作。哈希表是基于数组的,所以也存在缺点,数组一旦创建将不能扩展。
正常的数组,如果需要查询某个值,需要对数组进行遍历,只是一种线性查找,查找的速度比较慢。如果数组中的元素值和下标能够存在明确的对应关系,那么通过数组元素的值就可以换算出数据元素的下标,通过下标就可以快数定位数组元素,这样的数组就是哈希表。
一张哈希表:
元素值 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|
元素下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
以上我们的示例元素值和下标的关系为:
元素下标=元素值-10,此时的示例hashcode就是和数组下标一致了,取得hashcode方法如下:
//取得hashCode
pubic int hashCode(int value) {
return value – 10;
}
有了hashCode后,我们就可以快速的定位相应的元素,查找到相应的信息
1.4.2、HashSet
HashSet中的数据是无序的不可重复的。HashSet按照哈希算法存取数据的,具有非常好性能,它的工作原理是这样的,当向HashSet中插入数据的时候,他会调用对象的hashCode得到该对象的哈希码,然后根据哈希码计算出该对象插入到集合中的位置。
import java.util.*;
public class HashSetTest01 {
public static void main(String[] args) {
//它是无序的,不重复
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
//输出是无序的
for (Iterator iter=set.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
//加入重复数据
set.add("a");
System.out.println("");
for (Iterator iter=set.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 equals s2 ," + s1.equals(s2));
//equals相等,hashcode一定是相等的
System.out.println("s1.hashCode=" + s1.hashCode());
System.out.println("s2.hashCode=" + s2.hashCode());
String s3 = "ddddd";
System.out.println("s1 equlas s3," + s1.equals(s3));
System.out.println("s3.hashCode=" + s3.hashCode());
}
}
1.4.3、equals和hashCode
import java.util.*;
public class HashSetTest02 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
Set set = new HashSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
System.out.println("p1.hashCode=" + p1.hashCode());
System.out.println("p2.hashCode=" + p2.hashCode());
System.out.println("p3.hashCode=" + p3.hashCode());
}
}
class Person {
String name;
int age;
}
加入了重复的数据,因为hashCode是不同的,所以会根据算出不同的位置,存储格式
Person{张三,20} | Person{李四,30} | Person{张三,40} |
---|---|---|
7699183 | 14285251 | 10267414 |
进一步完善,覆盖equals
import java.util.*;
public class HashSetTest03 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
System.out.println("p1 equals p2," + p1.equals(p2));
System.out.println("p1 equals p3," + p1.equals(p3));
Set set = new HashSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
System.out.println("p1.hashCode=" + p1.hashCode());
System.out.println("p2.hashCode=" + p2.hashCode());
System.out.println("p3.hashCode=" + p3.hashCode());
}
}
class Person {
String name;
int age;
//覆盖equals
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Person) {
Person p = (Person)obj;
return this.name.equals(p.name);
}
return false;
}
}
以上仍然存在重复数据,在Person中覆盖了hashCode方法,能够正确的比较出两个Person是相等的还是不等的,但是为什么HashSet中还是放入了重复数据?因为Person对象的hashCode不同,所以它就换算出了不同的位置,让后就会把相关的值放到不同的位置上,就忽略equlas,所以我们必须覆盖hashCode方法
Person{张三,20} | Person{李四,30} | Person{张三,40} |
---|---|---|
7699183 | 14285251 | 10267414 |
【代码示例】,只覆盖hashCode,不覆盖equals
import java.util.*;
public class HashSetTest04 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
System.out.println("p1 equals p2," + p1.equals(p2));
System.out.println("p1 equals p3," + p1.equals(p3));
Set set = new HashSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
System.out.println("p1.hashCode=" + p1.hashCode());
System.out.println("p2.hashCode=" + p2.hashCode());
System.out.println("p3.hashCode=" + p3.hashCode());
}
}
class Person {
String name;
int age;
//覆盖hashCode
public int hashCode() {
return (name==null)?0:name.hashCode();
}
}
以上示例,张三的hashCode相同,当两个对象的equals不同,所以认为值是以不一样的,那么java会随机换算出一个新的位置,放重复数据
Person{张三,20} | Person{李四,30} | Person{张三,40} |
---|---|---|
774889-1 | 14285251 | 774889-2 |
【代码示例】,进一步改善,覆盖equals,覆盖hashCode
import java.util.*;
public class HashSetTest05 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
System.out.println("p1 equals p2," + p1.equals(p2));
System.out.println("p1 equals p3," + p1.equals(p3));
Set set = new HashSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
System.out.println("p1.hashCode=" + p1.hashCode());
System.out.println("p2.hashCode=" + p2.hashCode());
System.out.println("p3.hashCode=" + p3.hashCode());
}
}
class Person {
String name;
int age;
//覆盖hashCode
public int hashCode() {
return (name==null)?0:name.hashCode();
}
//覆盖equals
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Person) {
Person p = (Person)obj;
return this.name.equals(p.name);
}
return false;
}
}
以上输出完全正确的,因为覆盖了equals和hashCode,当hashCode相同,它会调用equals进行比较,如果equals比较相等将不加把此元素加入到Set中,但equals比较不相等会重新根据hashCode换算位置仍然会将该元素加入进去的。
Person{张三,20} | Person{李四,30} | |
---|---|---|
774889 | 842061 |
注意:特别是向HashSet或HashMap中加入数据时必须同时覆盖equals和hashCode方法,应该养成一种习惯覆盖equals的同时最好同时覆盖hashCode
Java要求:
两个对象equals相等,那么它的hashcode相等
两个对象equals不相等,那么它的hashcode并不要求它不相等,但一般建议不相等
hashcode相等不代表两个对象相等(采用equals比较)
1.4.4、TreeSet
TreeSet可以对Set集合进行排序,默认自然排序(即升序),但也可以做客户化的排序
import java.util.*;
public class TreeSetTest01 {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(9);
set.add(2);
set.add(5);
set.add(1);
//不能放入重复数据
set.add(5);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Integer v = (Integer)iter.next();
System.out.println(v);
}
}
}
以上没有输出重复的,是按自然顺序排序的(升序)
import java.util.*;
public class TreeSetTest02 {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(9);
set.add(2);
set.add(5);
set.add(1);
//不能放入重复数据
set.add(5);
//不能加入abc,加入后无法排序
//排序只能对一种类型排序
//set.add("abc");
for (Iterator iter=set.iterator(); iter.hasNext();) {
//Integer v = (Integer)iter.next();
//System.out.println(v);
System.out.println(iter.next());
}
}
}
【代码示例】,对Person进行自然排序
import java.util.*;
public class TreeSetTest03 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
Set set = new TreeSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
}
}
class Person {
String name;
int age;
}
出现错误,因为放到TreeSet中TreeSet会对其进行排序,那么必须实现Comparable接口,而我们的Person没有实现,所以出现了错误,如:基本类型的包装类和String他们都是可以排序的,他们都实现Comparable接口
1.4.5、实现Comparable接口完成排序
import java.util.*;
public class TreeSetTest04 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Set set = new TreeSet();
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
}
}
class Person implements Comparable {
String name;
int age;
//如果覆盖了equals,最好保证equals和compareto在
//相等情况下的比较规则是一致的
public int compareTo(Object o) {
if (o instanceof Person) {
Person p = (Person)o;
//升序
//return (this.age - p.age);
//降序
return (p.age-this.age);
}
throw new IllegalArgumentException("非法参数,o=" + o);
}
}
1.4.6、实现Comparator接口完成排序
import java.util.*;
public class TreeSetTest05 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
Comparator personComparator = new PersonComparator();
Set set = new TreeSet(personComparator);
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
}
}
class Person {
String name;
int age;
}
//实现Person的比较器
//Comparator和Comparable的区别?
//Comparable是默认的比较接口,Comparable和需要比较的对象紧密结合到一起了
//Comparator可以分离比较规则,所以它更具灵活性
class PersonComparator implements Comparator {
public int compare(Object o1, Object o2) {
if (!(o1 instanceof Person)) {
throw new IllegalArgumentException("非法参数,o1=" + o1);
}
if (!(o2 instanceof Person)) {
throw new IllegalArgumentException("非法参数,o2=" + o2);
}
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.age - p2.age;
}
}
1.4.7、采用匿名类完成Comparator的实现
import java.util.*;
public class TreeSetTest06 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张三";
p1.age = 20;
Person p3 = new Person();
p3.name = "张三";
p3.age = 40;
Person p2 = new Person();
p2.name = "李四";
p2.age = 30;
//采用匿名类实现比较器
Set set = new TreeSet(new Comparator() {
public int compare(Object o1, Object o2) {
if (!(o1 instanceof Person)) {
throw new IllegalArgumentException("非法参数,o1=" + o1);
}
if (!(o2 instanceof Person)) {
throw new IllegalArgumentException("非法参数,o2=" + o2);
}
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return p1.age - p2.age;
}
});
set.add(p1);
set.add(p2);
set.add(p3);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println("name=" + p.name + ", age=" + p.age);
}
}
}
class Person {
String name;
int age;
}
1.4.8、Comparable和Comparator的区别?
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。
用Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
1.5、Map接口
Map中可以放置键值对,也就是每一个元素都包含键对象和值对象,Map实现较常用的为HashMap,HashMap对键对象的存取和HashSet一样,仍然采用的是哈希算法,所以如果使用自定类作为Map的键对象,必须复写equals和hashCode方法。
1.5.1、HashMap
import java.util.*;
public class HashMapTest01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("1001", "张三");
map.put("1002", "李四");
map.put("1003", "王五");
//采用entrySet遍历Map
Set entrySet = map.entrySet();
for (Iterator iter=entrySet.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
System.out.println(entry.getKey() + ", " + entry.getValue());
}
System.out.println("");
//取得map中指定的key
Object v = map.get("1003");
System.out.println("1003==" + v);
System.out.println("");
//如果存在相同的条目,会采用此条目替换
//但map中始终保持的是不重复的数据
//主要依靠key开判断是否重复,和value没有任何关系
map.put("1003", "赵柳");
//采用keySet和get取得map中的所有数据
for (Iterator iter=map.keySet().iterator(); iter.hasNext();) {
String k = (String)iter.next();
System.out.println(k + ", " + map.get(k));
}
}
}
1.5.2、HashMap,采用自定义类作为key
import java.util.*;
public class HashMapTest02 {
public static void main(String[] args) {
IdCard idCard1 = new IdCard();
idCard1.cardNo = 223243244243243L;
Person person1 = new Person();
person1.name = "张三";
IdCard idCard2 = new IdCard();
idCard2.cardNo = 223243244244343L;
Person person2 = new Person();
person2.name = "李四";
IdCard idCard3 = new IdCard();
idCard3.cardNo = 223243244243243L;
Person person3 = new Person();
person3.name = "张三";
Map map = new HashMap();
map.put(idCard1, person1);
map.put(idCard2, person2);
map.put(idCard3, person3);
for (Iterator iter=map.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
IdCard idCard = (IdCard)entry.getKey();
Person person = (Person)entry.getValue();
System.out.println(idCard.cardNo + ", " + person.name);
}
}
}
class IdCard {
long cardNo;
//.........
}
class Person {
String name;
}
加入了重复的数据,因为HashMap的底层实现采用的是hash表,所以Map的key必须覆盖hashcode和equals方法
1.5.3、HashMap,覆盖IdCard的equals和hashCode方法
import java.util.*;
public class HashMapTest03 {
public static void main(String[] args) {
IdCard idCard1 = new IdCard();
idCard1.cardNo = 223243244243243L;
Person person1 = new Person();
person1.name = "张三";
IdCard idCard2 = new IdCard();
idCard2.cardNo = 223243244244343L;
Person person2 = new Person();
person2.name = "李四";
IdCard idCard3 = new IdCard();
idCard3.cardNo = 223243244243243L;
Person person3 = new Person();
person3.name = "张三";
Map map = new HashMap();
map.put(idCard1, person1);
map.put(idCard2, person2);
map.put(idCard3, person3);
for (Iterator iter=map.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
IdCard idCard = (IdCard)entry.getKey();
Person person = (Person)entry.getValue();
System.out.println(idCard.cardNo + ", " + person.name);
}
}
}
class IdCard {
long cardNo;
//.........
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof IdCard) {
IdCard idCard = (IdCard)obj;
if (this.cardNo == idCard.cardNo) {
return true;
}
}
return false;
}
public int hashCode() {
return new Long(cardNo).hashCode();
}
}
class Person {
String name;
}
以上没有加入重复的数据,因为覆盖了equals和hashCode方法
1.5.4、TreeMap
treeMap可以对Map中的key进行排序,如果map中的key采用的是自定类那么需要实现Comaprable或Comparator接口完成排序
import java.util.*;
public class TreeMapTest01 {
public static void main(String[] args) {
Map map = new TreeMap();
map.put("1003", "王五");
map.put("1001", "张三");
map.put("1002", "李四");
for (Iterator iter=map.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
System.out.println(entry.getKey() + ", " + entry.getValue());
}
}
}
1.6、Collections工具类
Collections位于java.util包中,提供了一系列实用的方法,如:对集合排序,对集合中的内容查找等
import java.util.*;
public class CollectionsTest01 {
public static void main(String[] args) {
List l = new ArrayList();
l.add(5);
l.add(1);
l.add(4);
l.add(2);
for (Iterator iter=l.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
System.out.println("");
Collections.sort(l);
for (Iterator iter=l.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
System.out.println("");
Set set = new HashSet();
set.add(10);
set.add(1);
set.add(4);
set.add(9);
//不能直接对set排序
//Collections.sort(set);
List setList = new ArrayList(set);
Collections.sort(setList);
for (Iterator iter=setList.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
System.out.println("");
int index = Collections.binarySearch(setList, 9);
System.out.println("index=" + index);
System.out.println("");
Collections.reverse(setList);
for (Iterator iter=setList.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
}
}