------ >Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将 List 看作是具有数值键的 Map。而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。
Map集合:双列集合,该集合存储键值对,成对存放,而且保证键的唯一性,Collection集合是单列集合,Map集合的常见操作:
存储:put(K key, V value) ,如果重复添加相同的键,后添加的值会覆盖原有键对应值,并且put方法会返回被覆盖的值
putAll(Map<? extends k,? extends V>m)
删除:clear() remove(Object key)
判断: containsValue(Object Value) containsKey(Object Key) isEmpty()
获取: get(Object key) size() values() entrySet() keySet()
通常使用的Map集合有三个:
|-- Hashtable:底层是哈希表数据结构,不可存入null键null值,该集合线程同步,效率低,JDK1.0
|-- HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合不同步,将hashtable替代,效率高,JDK1.2
|-- TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键排序
其实Set底层就是使用了Map集合
Map集合中的元素有两种取出方式,:
1.keySet :将map中所有键存入到Set集合,因为set具备迭代器,所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值,Map集合取出原理:map集合转成set集合,通过迭代器取出,示例代码如下:
import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("03","xiaobai03");
map.put("01","xiaobai01");
map.put("02","xiaobai02");
map.put("04","xiaobai04");
Set<String> keySet=map.keySet(); //先获取map集合的所有键的Set集合,keyset();
Iterator<String> it=keySet.iterator();//有了Set集合,就可以获取其迭代器
while (it.hasNext())
{
String key=it.next(); //有了键,可以通过map集合的get方法获取键对应的值
String value=map.get(key);
System.out.println("key:"+key+"...value:"+value);
}
}
}
第二种取出方式:
Set<Map.Entry<k,v>> entrySet: 将map集合中的映射关系存入到set集合中,这个关系的数据类型就是Map.Entry,示例代码如下:
import java.util.*;
class MapDemo2
{
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("03","xiaobai03");
map.put("01","xiaobai01");
map.put("02","xiaobai02");
map.put("04","xiaobai04");
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while (it.hasNext())
{
Map.Entry<String,String> me =it.next();
String key=me.getKey();
String value=me.getValue();
System.out.println("key:"+key+"value:"+value);
}
}
}
以下代码是通过HashMap取出Map中自定义对象:
需求:自定义对象学生,每一个学生都有对应的归属地,学生Student,地址String,学生属性:姓名,年龄。
姓名和年龄相同的视为同一个学生,保证学生的唯一性。
思路:
1.描述学生;
2.定义Map容器,将学生视为键,地址作为值存入;
3.获取map集合中的元素。
import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode() //hashSet通过hashcode和equals保证元素唯一性
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
class MapTest
{
public static void main(String[] args)
{
HashMap <Student,String> hm=new HashMap<Student,String>();//HashMap,取出结果无序
hm.put(new Student("xiaobai1",27),"beijing");
hm.put(new Student("xiaobai5",21),"shanghai");
hm.put(new Student("xiaobai3",28),"tianjin");
hm.put(new Student("xiaobai6",22),"nanjing");
hm.put(new Student("xiaobai2",26),"luohe");
hm.put(new Student("xiaobai1",27),"zhengzhou"); //和第一个元素键重复,把第一个键的值覆盖
//第一种取出方式 keySet ,
Set<Student> keySet=hm.keySet();
Iterator<Student> it=keySet.iterator();
while (it.hasNext())
{
Student stu=it.next(); //stu是键
String addr=hm.get(stu); //addr是值
System.out.println(stu+"..."+addr);
}
//第二种取出方式 entrySet
Set<Map.Entry<Student,String>> entrySet=hm.entrySet();
Iterator<Map.Entry<Student,String>> iter=entrySet.iterator();
while (iter.hasNext())
{
Map.Entry<Student,String> me =iter.next();
Student stu=me.getKey();
String addr=me.getValue();
System.out.println(stu+"........."+addr);
}
}
}
以下是利用TreeMap实现自定义对象排序的代码:
需求:实现可以对学生对象的年龄和姓名进行升序排序。因为数据是以键值对形式存在,所以要使用可以排序的Map合,TreeMap。
import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode() //hashSet通过hashcode和equals保证元素唯一性
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
class StuNameComparetor implements Comparator<Student> //定义Comparator,按年龄排序
{
public int compare(Student s1,Student s2)
{
int num=s1.getName().compareTo(s2.getName());
if (num==0)
return new Integer(s1.getAge()).compareTo (new Integer(s2.getAge()));
return num;
}
}
class MapTest2
{
public static void main(String[] args)
{
TreeMap <Student,String> tm=new TreeMap<Student,String>(new StuNameComparetor()); //Comparator(比较器)中按姓名排序
// TreeMap <Student,String> tm=new TreeMap<Student,String>(); //Studeng类中按照年龄排序
tm.put(new Student("xiaobai1",27),"beijing");
tm.put(new Student("xiaobai5",21),"shanghai");
tm.put(new Student("xiaobai3",28),"tianjin");
tm.put(new Student("xiaobai6",22),"nanjing");
tm.put(new Student("xiaobai2",26),"luohe");
Set<Map.Entry<Student,String>> entrySet=tm.entrySet();
Iterator<Map.Entry<Student,String>> it=entrySet.iterator();
while (it.hasNext())
{
Map.Entry<Student,String> me =it.next();
Student stu=me.getKey();
String addr=me.getValue();
System.out.println("key:"+stu+"value:"+addr); //TreeMap可以对元素排序,
}
}
}