哈希表和有序表的简单使用

哈希表有两种形式

HashSet和HashMap

HashSet只有key,HashMap中有key和value。结构都是一样的,没有区别。

public static void main(String[] args) {
		
		
		
		HashSet<Integer> hashSet1 = new HashSet<>();
		hashSet1.add(2);
		System.out.println(hashSet1.contains(2));
		hashSet1.add(new Integer(3));
		System.out.println(hashSet1.contains(3));
		hashSet1.remove(2);
		System.out.println(hashSet1.contains(2));
		
		HashMap<Integer,String> map = new HashMap<>();
		map.put(1, "yf");
		map.put(1,"yf1");//put方法既是新增也是更新。
		map.put(2, "yf2");
		System.out.println(map.containsKey(1));
		System.out.println(map.get(1));
		System.out.println(map.get(4));
		
		
	}

重要的是哈希表中增删改查的时间都是常数级别的,和数据量没有关系。但是这个常数时间比较大。

如果是基础数据类型,哈希表内部是按照值传递,就是将put进哈希表中的数据拷贝一份。

如果是自定义类,哈希表内部是按照应用传递,拷贝的是put进哈希表对象的地址。一律只占八字节。

有序表

TreeSet和TreeMap

有序表要求Key一定是可以比较的,

有序表Tree比哈希表性能要差点,是logN级别的,但是也很优秀了。

放入有序表中的基本类型是值传递

放入有序表中的不是基础类型就需要定义比较器,内部按照引用传递。

例如

	public static class Node{
		public int value;
		public Node next;
		public Node(int value) {
			this.value = value;
		}
	}

	public static void main(String[] args) {
		Node nodeA = new Node(1);
		Node nodeB = new Node(2);
		Node nodeC = new Node(3);
		
		TreeSet<Node> set = new TreeSet<>();
		try {
			set.add(nodeA);
			set.add(nodeB);
			System.out.println("success");
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		
	}

这样的代码由于没有提供比较器,是一定会报异常的。

public class Day09 {
	
	public static class Node{
		public int value;
		public Node next;
		public Node(int value) {
			this.value = value;
		}
	}
	
	public static class NodeComp implements Comparator<Node>{

		@Override
		public int compare(Node o1, Node o2) {
			// TODO Auto-generated method stub
			return o1.value-o2.value;
		}
		
	}
	public static void main(String[] args) {
		Node nodeA = new Node(1);
		Node nodeB = new Node(2);
		Node nodeC = new Node(3);
		
		TreeSet<Node> set = new TreeSet<>(new NodeComp());
		try {
			set.add(nodeA);
			set.add(nodeB);
			System.out.println("success");
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		
	}
}

加入比较器之后就不会再报异常了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值