集合(二)Map

    在我们的生活当中有很多时候需要成对存储数据,比如学生姓名和学号,或者一个帐号绑定的手机号,这些都是成对存储的关系。因此,我们引入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));;
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值