按值传递character,short,integer,long, float,double,string,boolean,在java当中哈希表内部以值的形式传递,而不是一地址的形式传递。
例如:
hashmap<integer, string> intmap = new hashmap<>();intmap.put(1234567, "111");integer a = 1234567;integer b = 1234567;system.out.println("a==b = " + (a == b));system.out.println("a.equals(b) = " + a.equals(b));system.out.println("intmap.get(a) = " + intmap.get(a));system.out.println("intmap.get(b) = " + intmap.get(b));
// 输出结果
// a==b = false
// a.equals(b) = true
// intmap.get(a) = 111
// intmap.get(b) = 111
由上边的案例中 a!= b,但是intmap.get(a) == intmap.get(b).我们可以看出,在我们从hashmap里面查询或者操作某些值的话,是以值的形式去传递和匹配的,而不是以内存地址的形式去匹配。
按址传递如果是非原生的类型的话,以内存地址的形式传递。例如:
public static class node { private int value; public node(int value) { this.value = value; }}hashmap<node, string> map = new hashmap<>();node node1 = new node(1);node node2 = new node(1);map.put(node1, "ziop");system.out.println("map.containskey(node1) = " + map.containskey(node1));system.out.println("map.containskey(node2) = " + map.containskey(node2));
//输出结果
//map.containskey(node1) = true
//map.containskey(node2) = false
内存大小比较基础类型,一条记录的内存大小是key的大小加上value的大小。
非基础类型, 一条记录的内存大小是 两个地址的大小, 一个地址8字节,key和value 共16字节
如果是 基础类型和非基础类型的混合类型的话,就是各自按照各自的方式计算
有序表(treemap)有序表会根据key的大小进行 升序排列 ,我们可以用他来做hashmap中的所有操作,并且扩展出了,查找第一个key或者最后一个key的操作,也扩展出了查找小于某个区间的最大值和大于某个区间的最小值
所有操作时间复杂度都是o(logn)级别。
但是如果key是非基础类型的话,并不能直接排序,需要该类型实现了排序接口,有可排序功能。或者在new treemap的时候传入比较方法
存放基础类型操作
treemap<integer, string> treemap = new treemap<>();treemap.put(3,"我是3 ");treemap.put(0,"我是3 ");treemap.put(7,"我是3 ");treemap.put(2,"我是3 ");treemap.put(5,"我是3 ");treemap.put(9,"我是3 ");treemap.put(1,"我是3 ");system.out.println("treemap.containskey(3) = "+treemap.containskey(3));system.out.println("treemap.containskey(6) = "+treemap.containskey(6));system.out.println("treemap.get(3) = "+treemap.get(3));treemap.put(3,"他是3");system.out.println("treemap.get(3) = "+treemap.get(3));treemap.remove(3);system.out.println("treemap.get(3) = "+treemap.get(3));treemap.remove(3);system.out.println("treemap.firstkey() = "+treemap.firstkey());system.out.println("treemap.lastkey() = "+treemap.lastkey());// 返回 小于等于五 并且最近的 keysystem.out.println("treemap.floorkey(5) = "+treemap.floorkey(5));system.out.println("treemap.floorkey(6) = "+treemap.floorkey(6));// 返回 大于等于 4 并且最靠近的值system.out.println("treemap.ceilingkey(4) = "+treemap.ceilingkey(4));
//输出结果如下
//treemap.containskey(3) = true
//treemap.containskey(6) = false
//treemap.get(3) = 我是3
//treemap.get(3) = 他是3
//treemap.get(3) = null
//treemap.firstkey() = 0
//treemap.lastkey() = 9
//treemap.floorkey(5) = 5
//treemap.floorkey(6) = 5
//treemap.ceilingkey(4) = 5
存放非基础类型进行操作
// 存放非基础类型public static void main(string[] args) {treemap<node, integer> treemap1 = new treemap<>();node node3 = new node(3);node node4 = new node(4);treemap1.put(node3, 3);treemap1.put(node4, 4);system.out.println("treemap1.firstentry().getvalue() = " + treemap1.firstentry().getvalue());system.out.println("treemap1.lastentry().getvalue() = " + treemap1.lastentry().getvalue());}public static class node implements comparable<node> {private int value; public node(int value) { this.value = value;} @override public int compareto(node node) { return this.value - node.value; }}
以上就是java哈希表和有序表如何实现的详细内容。
