常见问题学习1

105 阅读7分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天。

1、java中 == 和equals

最大区别:==是运算符,比较的是内存的地址,equal是方法,比较的是内容

以下几种情况:

  • java基本类型
  • 比较包装类型
  • 比较String类型
  • 比较对象

java基本类型

比如:short,int,long,float,char

比较基本类型,只能用 == ,不能用equal,这里 == 比较的是两个变量的值

比较包装类型

== 比较的是内存地址,如果new一个a,和一个b,这是两个不同的对象,那么存储的地址肯定不一样,返回false。而equal比较的是地址上对应的数值,返回true。

比较String类型

== 比较的是内存地址,equal比较的是值

1650776353837

  • 第一个s1 == s2,因为 == 比较的是内存地址,s2是new出来的新对象,所以说s1 == s2肯定是false,s1定义一个常量是放在常量池中,s2new一个对象是放在堆中
  • s1和s5,字符串相加的本质是创建StringBuilder对象,进行append操作,然后将拼接的StringBuilder对象进行toString处理,将处理生成的自负放在字符串池中找有无相同值的字符,如果有,将引用S5直接连到已有的字符串地址,所以s1和s5地址相同
  • s1=s3+s4,这个的原理是涉及到类加载时初始化的问题,s3和s4的结果无法在编译期间确定,如果把s3和s4定义为final类型,结果就是true了,java在编译时,就知道“Program”+"ming"="Programming"了,但却是在运行时才知道s3+s4="Programming"

比较对象

==和equal比较的都是内存地址,因为equal没有被重写,没有被重写的equal都是object的equal方法

2、HashCode

常见的Hash函数

  • 平方取余法
  • 乘数取余法
  • 平凡取中法

HashCode就是通过hash函数得到的,目的就是,通过一种算法,得到的在hash表中对应的位置, hashcode是什么呢?就是在hash表中对应的位置。

HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)

为什么hashcode就查找的更快,比如:我们有一个能存放1000个数这样大的内存中,在其中要存放1000个不一样的数字,用最笨的方法,就是存一个数字,就遍历一遍,看有没有相同得数,当存了900个数字,开始存901个数字的时候,就需要跟900个数字进行对比,这样就很麻烦,很是消耗时间,用hashcode来记录对象的位置,来看一下。

hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到100个数字,hash表中8个位置会有很多数字了,1中可能有20个数字,存101个数字时,他先查hashcode值对应的位置,假设为1,那么就有20个数字和他的hashcode相同,他只需要跟这20个数字相比较(equals),如果每一个相同,那么就放在1这个位置,这样比较的次数就少了很多,实际上hash表中有很多位置,这里只是举例只有8个,所以比较的次数会让你觉得也挺多的,实际上,如果hash表很大,那么比较的次数就很少很少了。

equal和hashCode的关系

用个例子说明:上面说的hash表中的8个位置,就好比8个桶,每个桶里能装很多的对象,对象A通过hash函数算法得到将它放到1号桶中,当然肯定有别的对象也会放到1号桶中,如果对象B也通过算法分到了1号桶,那么它如何识别桶中其他对象是否和它一样呢,这时候就需要equals方法来进行筛选了。

  • 如果两个对象equals相等,那么这两个对象的HashCode一定也相同
  • 如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

3、索引

索引,或者说“目录”,是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能。索引的数据节点中有这个实际文件的地址,在查找式根据索引的规则可以快速查找到对应数据的节点,从而达到快速查找的效果。

原理

没有索引的情况下,去访问数据,顺序查找,根据数据顺序依次匹配,最坏的情况下,查找最后一个的数据,需要全部匹配一遍,效率低。

如果利用额一个平衡二叉树,索引,平衡二叉树的建立和二分法是相同的,不需要全部匹配一遍,查找效率大大提升。数据量越大,效果越明显。

索引的类型

  • 普通索引
  • 唯一索引
  • 组合索引
  • 主键索引

普通索引

普通索引是最基本的作用,没有任何的限制

唯一索引

他与前面的普通索引类似,不同的是,索引列的值必须唯一,但允许有空值,如果是组合索引,则列的值必须唯一。

主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引 。

组合索引

组合索引最多包含16列

创建组合索引后:name_city_age

根据最左匹配原则,这一个组合索引其实相当于三个组合索引:

name

name,city

name,city,age

从表记录的排列顺序和索引的排列顺序是否一致来划分

  • 聚集索引,表的排列顺序和索引的排列顺序一致,聚集索引的叶子节点存储的是表中的数据,要查询的信息,通过索引可以直接查询到
  • 非聚集索引,表记录的排列顺序和索引的排列顺序不一致,非聚集索引在叶子节点存储的是主键和索引列,要通过查到的主键再去查找要找的数据,这就是回表

索引失效

  • 违反最左匹配原则
  • 范围查询
  • 在索引列上做操作
  • 使用不等于
  • select *
  • like中以通配符开头%
  • 字符串不加引号
  • or连接索引

4、bean的生命周期

5、String和StringBuffer

简单地说,就是一个变量和常量的关系.StringBuffer对象的内容可以修改;而字符串对象一旦产生后就不可以被修改,重新赋值其实是两个对象

StringBuffer的类中的方法要偏重于对字符串的变化例如追加,插入和删除等,这个也是StringBuffer的和字符串类的主要区别。

6、git status

git status命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有

7、 ArrayList

ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承了AbstractList,实现了List,RandomAccess,Cloneable,java.io.Serializable这些接口。

ArrayList继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能;

ArrayList实现了RandomAccess接口,即提供了随机访问功能。RandomAccess是Java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象,这就是快速的随机访问;

ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆;

ArrayList实现java.io.Serializable接口,这就意味着ArrayList支持序列化,能通过序列化去传输