首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    记一次破解前端加密详细过程

    应工作需要爬过各种各样的航空公司网站,大到B2B平台,小到东南亚某某航空官网,从最初使用webdriver+selenium爬虫到现在利用http请求解析html,经历过各种各样的问题,webdriver+selenium这种办法虽然万能,而且可以用JS写解析脚本方便调试,但是用久了才发现这玩意不管是效率还是稳定性都非常差,放到服务器上动不动就挂掉,两三天就需要重启一次。后面头说让我们改用发http请求(我第一次接触项目的时候就在想为什么不直接用发http请求这种方式,我猜他也是第一次接触爬虫这个技术领域,没什么经验。而我,本来是招JAVA进的公司,后来JAVA、JS、Python写了个遍,emmm... 没事,反正技多不压身 ^_^),这种方式稳定且快,但是用Python编写解析脚本的时候你就知道进行调试有多烦,虽然可以用PyQuery或者BeautifulSoup这种解析库,但是还是不如写JS脚本在浏览器里调试来得舒服。

    02

    hashCode与equals方法之间的关系

    hashCode 顾名思义是一个“散列值码” 散列值,并不能表现其唯一性,但是有离散性,其意义在于类似于进行hashMap等操作时,加快对象比较的速度,进而加快对象搜索的速度。 hashCode 和 equals的关系。 两个对象 equals的时候,hashCode必须相等,但hashCode相等,对象不一定equals。 如果没有重写 hashcode方法,使用Object自带的hashCode,无法保证两个对象equals的时候 hashCode 必须相等的条件。 在Java中,重写equals()方法之后,是否需要重写hashCode()方法,那要看分情况来说明。有些情况下,是建议;有些情况下,是必须重写。 首先说建议的情况:    比如你的对象想放到Set集合或者是想作为Map的key时,那么你必须重写equals()方法,这样才能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。 必须重写hashCode()的情况:     如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。 最后明白两点就行了: 1.hashCode()方法存在的主要目的就是提高效率。 2.在集合中判断两个对象相等的条件,其实无论是往集合中存数据,还是从集合中取数据,包括如果控制唯一性等,都是用这个条件判断的,条件如下:     首先判断两个对象的hashCode是否相等,如果不相等,就认为这两个对象不相等,就完成了。如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,如果相等,那就认为这两个对象相等。     上面的条件对于任何集合都是如此,只要理解上面的条件,你就明白了,为什么在有些情况下建议重写hashCode().有些情况下,是必须要重写的,只有一个目的,就是提高效率,你想想,如果你重写了hashCode(),只要不满足第一个条件,那就直接可以判断两个对象是不等的,也就不用花费时间再去比较equals了。 最后总结一句话就是,hashCode()方法存在的主要目的就是提高效率,但是如果你想把对象放到散列存储结构的集合中时,是必须要重写的。

    03

    为什么HashCode对于对象是如此的重要

    HashMap和Hashtable,虽然它们有很大的区别,如继承关系不同,对value的约束条件(是否允许null)不同,以及线程安全性等有着特定的区别,但从实现原理上来说,它们是一致的。所以,我们只以Hashtable来说明:   在java中,存取数据的性能,一般来说当然是首推数组,但是在数据量稍大的容器选择中,Hashtable将有比数组性能更高的查询速度。具体原因看下面的内容:   Hashtable在存储数据时,一般先将该对象的HashCode和0x7FFFFFFF做与操作,因为一个对象的HashCode可以为负数,这样操作后可以保证它为一个正整数。然后以Hashtable的长度取模,得到该对象在Hashtable中的索引。

    00
    领券