散列表 HashSet Map

一 散列表

1.1 概念

 散列表 : 可以理解为数组保存元素是个链表
 散列表保存的是键值对(K和V)

1.2 hashcode

hashCode : hash算法,是把不定长的数据改变为定长的数据,是一种安全的加密算法,但不保证唯一
           同一个对象生成多次hash值,那么值一定是相同的,
           不同对象也有可能生成相同的hash值
     添加过程 :
            1 先调用添加的K,调用hashCode生成hash值
             2 根据hash值计算数组下标   
             3 判断数组中该下标对应的位置上是否有元素
             3.1 如果没有保存元素,就把该对象放到对应的下标中
             3.2 如果保存了元素,此时调用添加的k的equals方法,和数组中该下标对应的所有数据的key进行比较
             3,3 如果和数组下标对应的链表中的数据都不相等,就把该数据添加到对应链表中
            3.4 如果和链表中的数据一致了,则key不添加,则key不添加,把value值替换(用新的替换原来的)
             4 java1.8新改动,如果该链表中,节点个数大于7,则该链表被转换为红黑树
    在java把 没有散列表这个说法,只是把散列表封装为了HashMap和HashTable,并且HashTable已经过时
       并且 HashMap的默认容量为 16

1.3 HashSet


   HashSet 底层就是一个HashMap,并且只是Map的key部分,没有value

例子:

public class Collection_01_HashSet {
public static void main(String[] args) {
	HashSet<String> set=new HashSet<String>();
	set.add("xx");
	set.add("xx");
	set.add("xx1");
	set.add("xx2");
	set.add("xx3");
	System.out.println(set.size());//4
	System.out.println(set);//[xx, xx1, xx3, xx2]
}
}

二 map

2.1 概念

Map : 无序 ,Key不可重复,Value可重复
Map和Collection不一样,但是操作基本上是一样的
集合保存单个对象,而map保存键值对映射关系

2.2 常用方法

put(K,V) :添加数据
         remote(K) :删除数据
          clear() : 清空
          size() : 个数
          isEmpt() : 判断是否为空
          get(K) : 根据Key获得Value值
          values(): 获取所有的values 返回集合
          containsKey(K) : 判断是否包含莫个K
          containsValue(V) : 判断是否包含某个value
          Set KeySet() : 获取map中所有的key,返回set
          Set entrysSet() : 获取map中的键值对,返回set

例子:

public class Map_03_HashMap {

	public static void main(String[] args) {
		//创建map
		HashMap<String, Integer> map=new HashMap<String, Integer>();
		map.put("a",1);
		map.put("a", 2);
		map.put("A", 21);
		map.put("'A'", 22);
		map.put("65", 122);
		System.out.println(map.size());//4
		// 根据key获取value , 2 因为key重复,value替换
		System.out.println(map.get("a"));//2
		//判断是否含某个key
		System.out.println(map.containsKey("65"));//true
		// 是否包含某个value
		System.out.println(map.containsValue(2));//true
		// 根据key删除该映射关系(K和V都删除,在链表中把该节点删除)
		map.remove("a");
		System.out.println(map.size());//3
		//map不能直接遍历
		//获取所有的value
		System.out.println("==================");
		Collection values=map.values();
		for(Object object:values){
			System.out.println(object);//21 22 122
		}
		System.out.println("============");
		//获取所有的key
		Set<String> set=map.keySet();
		for(String ele:set){
			System.out.println(ele);//A 'A' 65
		}
		System.out.println("================");
		// 将map转换为set,并把key和value封装到了entry类对象中,然后把entry类对象保存到set中即可
		Set<Entry<String, Integer>> set1=map.entrySet();
		for(Entry<String, Integer> ele:set1){
			System.out.println(ele);//A=21  'A'=22   65=122
			// getKey 是获取key,getValue 是获取value
			System.out.println(ele.getKey()+"->"+ele.getValue());//A->21  'A'->22   65->122 
		}
	}

}

2.3 properties

2.3.1 概念

 Properties : key和value强制要求必须是字符串

例子:

public class Map_04_Properties {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Properties p=new Properties();
		//添加数据
		p.setProperty("1", "a");
		p.setProperty("2", "b");
		//获取数据
		System.out.println(p.getProperty("1"));//a
		System.out.println(p.getProperty("2"));//b
		// 不存在的key  得到null
				System.out.println(p.getProperty("3"));
				// 有个方法重载,第二个参数为默认值,假如根据key找不到数据的时候,返回该默认值,而不是null
				// 并不会把该键值对添加进去
				System.out.println(p.getProperty("3","默认值"));
	}

}

2.4  TreeMap

2.4.1概念

TreeMap: 保存的元素可以按一定规则进行排序

2.4.2 排序

1 要添加的元素 实现了Comparable接口
  2 编写比较器类,实现Comparator接口
  treeMap 在添加的时候 会自动调用key对象的compareTo方法,是用key进行比较,而不是value

例子:

public class Map_05_TreeMap {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeMap<Integer, String> map=new TreeMap<Integer, String>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				return o2-o1;
			}
		});
		map.put(1, "a");
		map.put(4, "d");
		map.put(2, "b");
		map.put(3, "c");
		Set<Entry<Integer, String>> set=map.entrySet();
		for(Entry<Integer, String> ele:set){
			System.out.println(ele);//4=d 3=c 2=b 1=a			
		}
	}

}

2.4.3 根据map中value值进行排序

 map转为list进行存储,并且以value进行排序
 因为map没有办法以value值进行排序,因为treeMap中只是按照key排序的,所以想要以value排序,需要转换为list

例子:

public class Map_06_MapToList {
public static void main(String[] args) {
	Map<String, Integer> map = new HashMap<String, Integer>();
	map.put("a", 1);
	map.put("bbb", 2);
	map.put("bcd", 1);
	map.put("a1", 12);
	// 把K和V封装到entry中,然后保存到set中
	Set<Entry<String, Integer>> set = map.entrySet();
	// set转换为list
	List<Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(set);
	System.out.println(list);
	//更改排序规则
	Collections.sort(list, new Comparator<Entry<String, Integer>>() {
		@Override
		public int compare(Entry<String, Integer> o1,
				Entry<String, Integer> o2) {
			// 按照value值进行比较
			return o1.getValue() - o2.getValue();
		}
	});
	System.out.println(list);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值