map的put和get函数原理、二叉树和序列化

1. map的put和get函数原理

map.put(k,v)实现原理:
第一步:先将k,v封装到Node对象当中。

第二步:底层会调用k的hashCodeQ方法得出hash值,
然后通过哈希函数/哈希算法,将hash值转换成数组的
下标,下标位置上如果没有任何元素。就把Node添加
到这个位置上了.如果说下标对应的位置上有链表,此
时会拿着k和链表上每一个节点中的k进行equals,如果
所有的equals方法返回都是false ,那么这个系占点将会
被添加到链表的末尾。如果其中有一个equals返回了
true,那么这个节点的value将会被覆盖。

V = map.get(k)实现原理:
先调用k的hashCode0方法得出哈希值. 通过哈希算法
转换成数组下标,通过数组下标快速定位到某个位置
上,如果这个位置上什么也没有.返回null.如果这个
位置上有单向链表,那么会拿着参数k和单向链表上的
每个节点中的k进行equals ,如果所有equals方法返回
false ,那么get方法返回null ,只要其中有一个节点的k
和参数k equals的时候返回true。那么此时这个节点的
value就是我们要找的value , get方法最终返回这个要
找的value.

为什么哈希表的随机增删,以及查询效率都很高?
增删是在链表上完成。
查询也不需要都扫描。只需要部分扫描。
重点:通过讲解可以得出HashMap集合的key,会先
后调用两个方法。一个方法是hashCode0. -个方法
是equals0 ,那么这两个方法都需要重写。

在这里插入图片描述

2.TreeSet/TreeMap是自平衡二叉树。遵循左小右大原则存放。

存放是要依靠左小右大原则,所以这个存放的时候要进行比较。
2、遍历二叉树的时候有三种方式:
前序遍历:根左右

中序遍历:左根右

后序遍历:左右根
注意
前中后说的是"根”的位置。
根在前面是前序,根在中间
是中序.根在后面是后序。

3、TreeSet集 合/TreeMap集合采用的是:中序遍历方式。
Iterator迭代器采用的是中序遍历方式。左根右。
4、100 200 50 60 80 120 140 130 135 180 666 40 55

5、采用中序遍历取出:
4050556080 100 120 130 135 140 180 200 666

在这里插入图片描述
TreeSet集合中元素可排序的第二种方式:使用比较器的方式。
最终的结论:
放到TreeSet或者TreeMap集合key部分的元素要想做到排序包括两种方式:
第一种:放在集合中的元素实现java. lang. Comparable接口。
第二种:在构造TreeSet或者TreeMap集合的时候给它传- -个比较器对象。

Comparable和comparator怎么选择呢?
当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现comparable接口。
如果比较规则有多个,并且需要多个比较规则之间频繁切换,建议使用Comparator接口。
Comparator接口的设计符合0CP原则。

3. 序列化

  1. //过了很久, Student这个类源代码改动了。 //源代码改动之后,需要重新编译,编译之后生成了全新的字书码文件。.
    //并且class文件再次运行的时候, java虚拟机生成的序列化版本号也会发生相应的改变。

  2. 小鹏编写了一个类: com. bjpowerncde. java. bean.Student implements
    Serializable 胡浪编写了一个类: com. bjpowernode . java . bean . Student
    implements Seriaqizable
    不同的人编写了同一个类,但“这两个类确实不是同一一个类”。这个时候序列化版本就起上作用了。 对于java,虚拟机来说,
    java虚拟机是可以区分开这两个类的,因为这两个类都实现了Serializable接口

  3. // transient关键字表示游离的,不参与序列化。

  4. java语言中是采用什么机制来区分类的? 第一:首先通过类名进行比对,如果类名不一样,肯定不是同一个类。
    第二:如果类名一样,再怎么进行类的区别?靠序列化版本号进行区分。

    Java虚拟机看到Serializable接口之后,会自动生成-一个序列化版本号。 //这里没有手动写出来,
    java虚拟机会默认提供这个序列化版本号。
    //建议将序列化版本号手动的写出来。不建议自动生成

     private static final long serialVersionUID = 1L; 
    

最终结论: 凡是一个类实现了Seria! izable接口,建议给该类提供一个固定不变的序列化版本号。这样,以后这个类即使代码修改了,但是版本号不变, java虚拟机会认为是同一个类。|

4. 属性配置文件properties

以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取。
将来只需要修改这个文件的内容, java代码不需要改动,不需要重新
编译,服务器也不需要重启。就可以拿到动态的信息。
类似于以上机制的这种文件被称为配置文件。
并且当配置文件中的内容格式是:
key1=value
key2=value
的时候,我们把这种配置文件叫做属性配置文件。
java规范中有要求|属性配置文件建议以properties结居,但这不是必须的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值