在我们的生活当中有很多时候需要成对存储数据,比如学生姓名和学号,或者一个帐号绑定的手机号,这些都是成对存储的关系。因此,我们引入Map的使用。
Map就是用来存储“键(Key)-值(value)对”的,Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。常用的方法如下图:
entrySet()方法://对Map中的key-value这个键值对进行遍历:Map中的内部接口:Entry
Set<Entry<Integer, String>> entrySet = m.entrySet();
for(Entry<Integer, String> en:entrySet){
System.out.println(en.getKey()+"-----"+en.getValue());
}
keySet() 方法://对Map中的key进行遍历:
Set<Integer> keySet = m.keySet();
for(Integer i:keySet){
System.out.println(i+"====="+m.get(i));
}
values()方法://对Map中的value进行遍历:
Collection<String> values = m.values();
for(String s:values){
System.out.println(s);
}
HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。
HashMap与Hashtable的区别
1. HashMap: 线程不安全,效率高。允许key或value为null。JDK1.2
2. Hashtable: 线程安全,效率低。不允许key或value为null。JDK1.0
注意:HashSet使用了HashMap的原理。如果想让输出和输入顺序一样创建LinkedeHashMap();对象。
TreeMap:TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap。
常用的遍历集合的方法:
【示例一】遍历List方法一:普通for循环
1
2
3
4
|
for
(
int
i=
0
;i<list.size();i++){
//list为集合的对象名
String temp = (String)list.get(i);
System.out.println(temp);
}
|
【示例二】遍历List方法二:增强for循环(使用泛型!)
1
2
3
|
for
(String temp : list) {
System.out.println(temp);
}
|
【示例三】遍历List方法三:使用Iterator迭代器(1)
1
2
3
4
|
for
(Iterator iter= list.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
|
【示例四】遍历List方法四:使用Iterator迭代器(2)
1
2
3
4
5
6
|
Iterator iter =list.iterator();
while
(iter.hasNext()){
Object obj = iter.next();
iter.remove();
//如果要遍历时,删除集合中的元素,建议使用这种方式!
System.out.println(obj);
}
|
【示例五】遍历Set方法一:增强for循环
1
2
3
|
for
(String temp:set){
System.out.println(temp);
}
|
【示例六】遍历Set方法二:使用Iterator迭代器
1
2
3
4
|
for
(Iterator iter = set.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
|
【示例9-21】遍历Map方法一:根据key获取value
1
2
3
4
5
|
Map<Integer, Man> maps =
new
HashMap<Integer, Man>();
Set<Integer> keySet = maps.keySet();
for
(Integer id : keySet){
System.out.println(maps.get(id).name);
}
|
【示例七】遍历Map方法二:使用entrySet
1
2
3
4
|
Set<Entry<Integer, Man>> ss = maps.entrySet();
for
(Iterator iterator = ss.iterator(); iterator.hasNext();) {
Entry e = (Entry) iterator.next();
System.out.println(e.getKey()+
"--"
+e.getValue());
|
Collections类:不能被new创建对象---private修饰的构造方法
类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
2. void shuffle(List) //对List容器内的元素进行随机排列。
3. void reverse(List) //对List容器内的元素进行逆续排列 。
4. void fill(List, Object) //用一个特定的对象重写整个List容器。
5. int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
Test {
public
static
void
main(String[] args) {
List<String> aList =
new
ArrayList<String>();
for
(
int
i =
0
; i <
5
; i++){
aList.add(
"a"
+ i);
}
System.out.println(aList);
Collections.shuffle(aList);
// 随机排列
System.out.println(aList);
Collections.reverse(aList);
// 逆续
System.out.println(aList);
Collections.sort(aList);
// 排序
System.out.println(aList);
System.out.println(Collections.binarySearch(aList,
"a2"
));
Collections.fill(aList,
"hello"
);
System.out.println(aList);
}
}
|
public class TestCollections {
public static void main(String[] args) {
ArrayList<String> al=new ArrayList<String>();
al.add("apple");
al.add("banana");
al.add("java");
System.out.println(al);
//addAll(Collection<? super T> c, T... elements)
Collections.addAll(al, "merry","lili","abc");
System.out.println(al);
Collections.addAll(al, new String[]{"nihao","jsp"});//可变参数相当于数组
System.out.println(al);
//binarySearch(List<? extends Comparable<? super T>> list, T key)
System.out.println(Collections.binarySearch(al, "lili"));//发现不准确 为什么?因为要对排序后的查找
Collections.sort(al);
System.out.println(al);
System.out.println(Collections.binarySearch(al, "abc"));//发现不准确 为什么?因为要对排序后的查找---返回索引
System.out.println(Collections.binarySearch(al, "aaaa"));//找不到 返回负数
//copy(List<? super T> dest, List<? extends T> src)
ArrayList<String> sl=new ArrayList<String>();
Collections.addAll(sl, "a","b","c","d","e","a","b","c","d","e");
System.out.println("==");
System.out.println(al);
System.out.println(sl);
Collections.copy(sl, al);//sl的长度必须大于al的长度的时候在可以进行赋值替换
System.out.println(al);
System.out.println(sl);//其实相当于替换
//fill(List<? super T> list, T obj)
System.out.println(al);
// Collections.fill(al, "java");
System.out.println(al);
//
System.out.println(Collections.max(al));;
}
}