Java面试一

一、Integer a = 10; Integer b = 10;

   a==b是否相等。
   int缓存池,相等。

二、equals和hashcode方法?

equals(): 反映的是对象或变量具体的值,即两个对象里面包含的值–可能是对象的引用,也可能是值类型的值。
hashCode(): 计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。
  之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如HashTable。
  两个obj,如果equals()相等,hashCode()一定相等。
  两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
所以:
可以考虑在集合中,判断两个对象是否相等的规则是:
  第一步,如果hashCode()相等,则查看第二步,否则不相等;
  第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。

  1、首先equals()和hashcode()这两个方法都是从object类中继承过来的。
  equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。
  hashCode()是一个本地方法,它的实现是根据本地机器相关的。

  2、Java语言对equals()的要求如下,这些要求是必须遵循的:

  A 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
  B 反射性:x.equals(x)必须返回是“true”。
  C 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
  D 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
  任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

  3、equals()相等的两个对象,hashcode()一定相等;
  反过来:hashcode()不等,一定能推出equals()也不等;
  hashcode()相等,equals()可能相等,也可能不等。

三、HashMap的实现原理

  数组+链表(红黑树),数组中的位置是根据hashCode来计算的,hashCode怎么计算,JDK1.7和2的N次方做异或,JDK1.8是右移动16位

四、mysql的索引是用的是什么原理?有什么优点?

B+树,B+树的优点
  1. B+树中只有叶子节点会带有指向记录的指针
  2. B+树中所有叶子节点都是通过指针连接在一起
  3. B±tree的磁盘读写代价更低,减少了IO操作
  4. B±tree的查询效率更加稳定 由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引
  5. B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。

五. select * from A where name = 1;什么时候索引不生效?innodb是非聚集索引还是聚集索引?

首先区分什么聚集索引,什么是非聚集索引。
  innodb是聚集索引,Myisam是非聚集索引。
  聚集索引:数据库表行中数据的物理顺序和键值的逻辑顺序相同,叶子节点本身存放数据,同时增加一个指向相邻节点的指针,形成顺序访问的B+树;
  非聚集索引:叶子节点存放的是访问数据内存地址,会增加一次IO操作。
   innodb中如果查询的是非主键索引和主键索引本身不包含的数据,会从辅助索引先查,辅助索引也是一个B+树,叶子节点保存的是对应的主键ID,查到主键ID后再到主键索引的B+树上查寻对应的数据;Myisam中使用到的是非聚集索引,该引擎在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。.frm 用于存储表的定义;.MYD 用于存放数据;.MYI 用于存放表索引,主键索引和辅助索引效果一样,叶子节点存放的都是数据内存地址,先从.MYI文件中的索引数据获取到内存地址,然后从.MYD中获取对应的数据。
举例:
聚集索引clustered index(id), 非聚集索引index(username)。
   使用以下语句进行查询,不需要进行二次查询,直接就可以从非聚集索引的节点里面就可以获取到查询列的数据。
   select id, username from t1 where username = ‘小明’
   select username from t1 where username = ‘小明’
   但是使用以下语句进行查询,就需要二次的查询去获取原数据行的score:
   select username, score from t1 where username = ‘小明’。

   再回答索引上面的select * from A where name = 1;什么时候不生效,应该是一直生效吧?我试了重复数据多也一直生效,只是这种样子会导致聚集索引和非聚集索引之间来回切换,耗时很久。

六、事物的隔离级别?innodb默认的隔离级别?

   隔离级别:读未提交(另一个事物未提交的修改在当前事物中也能看到),读已提交,可重复读(同时开启的事物,另一事物的修改已提交,当前事物看不到),串行
   默认是可重复读,oracle是读已提交。
   explain SELECT * FROM biz_white_list WHERE white_value in (“13301100103”, “13301100100”) AND hahah = “11”;
   explain结果:
   id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
   select_type: SELECT 查询的类型.
   table: 查询的是哪个表
   partitions: 匹配的分区
   type: join 类型
   possible_keys: 此次查询中可能选用的索引
   key: 此次查询中确切使用到的索引.
   ref: 哪个字段或常数与 key 一起被使用
   rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
   filtered: 表示此查询条件所过滤的数据的百分比
   extra: 额外的信息

七、最左匹配原则

   如果user_id重复数据过多,使用in的时候,mysql查询优化器认为全表扫描时如果速度大于使用索引,就会不用索引。
   select * from A where user_id in (2, 3) and user_name = “a”;和select * from A where user_id > 10 and user_name = “a”;如果有联合索引user_id和user_name,索引生效吗?
   这两种情况,索引都是生效的。

八、JVM介绍下?平常你们使用的垃圾回收器?

方法区:存放虚拟机加载类的相关信息,如类、静态变量和常量。
程序计数器:保存当前线程运行正在执行的字节码指令地址。
虚拟机栈:先进后出的数据结构,栈帧,当前线程执行所需的数据,指令和返回地址。包含:局部变量表,操作数栈,动态链接,出口等。
本地方法栈:保存的native相关的调用信息。
堆:堆内存存放具体的对象信息。
String a = “123456”; a在虚拟机栈,123456在堆中。
垃圾回收器:CMS,G1等,我没用过。
CMS回收器的缺点主要在三方面:1、占用一部分CPU资源,导致吞吐量下降;2、由于并发过程是回收和程序运行交替进行,会产生一些新垃圾进入年老代而未被清理 ,当年老代满时引起Full GC(因此一般年老代要预留一部分空间供程序使用);3、标记-清理的缺点——空间碎片,因此要适时进行压缩。

http://www.importnew.com/26383.html

九、spring事物

class A {
void save() {
save();
B.update();
}
update(){

}
class B {
void update() {
}
}
怎么在B出现异常时A不回滚,回答try catch是错的,spring的事物内部实现是用AOP实现,aop是基于动态代理,spring内部已经标记了要回滚,即使是try catch了也会将callback。
如果A中save()调用的this.update(),这个try catch会生效。因为this指的是被代理的对象,这个时候事物的切面还没生效之前try catch先生效。

Java面试二

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值