Java四年面试总结

1.为什么工作中常用String拼接字符串,而不用StringBuffer/StringBuilder?

2.string是不可变对象,在后面拼接字符串不会重新创建对象;而用StringBuffer的话,太多就会占用过多的内存,特别是循环添加时,主要是考虑JVM内存才用的String。 读取一个有100万条数据的文件,并且把着100万条数据插入数据库需要注意些什么?

1)JVM是否可以承受住这么大的数据量;
2)每当放入1000条数据就提交一次,然后重新new一个Table,赋值给原来的变量、再继续放入下一个1000条记录;
3)先取消数据库表的索引、外键和触发器等会加大写入的速度。

3.数组(arrayList)与链表(linkedList)的优缺点和区别

1.数组数组:是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组
2链表:中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表。

4.&和&&区别

相同点:就是二者执行最后的结果是一样的,但是执行的过程有区别,
对于&:无论&左边是否为false,他都会继续检验右边的boolean值。
对于&&:只要检测到左边Boolean值为false时,就会直接判断结果,不会在检验右边的值,效率更高。

5.HashMap的存储结构及原理以及怎么解决hash冲突的

这里HashMap用了一个算法。
map.put(key,value) //存储key
int hash=key.hashCode(); //获取key的hashCode,这个值是一个固定的int值
int index=hash%Entry[].length;//获取数组下标:key的hash值对Entry数组长度进行取余
Entry[index]=value;
添加元素操作步骤:
以下是具体的 put 过程(JDK1.8)
对 Key 求 Hash 值,然后再计算下标
如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的 Hash 值相同,需要放到同一个 bucket 中)如果碰撞了,以链表的方式链接到后面
如果链表长度超过阀值(TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
如果节点已经存在就替换旧值
如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)

注意:如果两个key通过hash%Entry[].length得到的index相同,会不会覆盖?(hash冲突)
链表法: 是不会的。Entry类有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next =A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。
***开放定址法:***一旦产生了冲突(该地址已有其它元素),就按某种规则(上面的算法)去寻找另一空地址。

6.hashcode和equals区别

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,因为重写的equal里一般比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

那么hashCode()既然效率这么高为什么还要equal()呢?因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠。
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

7.读取一个有100万条数据的文件,并且把着100万条数据插入数据库需要注意些什么?

1)JVM是否可以承受住这么大的数据量;
2)每当放入1000条数据就提交一次,然后重新new一个Table,赋值给原来的变量、再继续放入下一个1000条记录;
3)先取消数据库表的索引、外键和触发器等会加大写入的速度。

8.Mysql有哪些引用函数?

When、Then、If、Concat、Field、Format、Lower、ABS等。

9.Mysql什么情况下会造成表锁死?

1)alter table 大表操作会死锁;
2)高并发插入可能会死锁;
3)多个事务同时锁定一个资源时也会造成死锁。

10.用Redis怎么做一个排名?

用Redis的排序集合类型Sortset()实现排行榜。

11.IO与NIO区别

NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道。管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征。
1、IO是面向流的,NIO是面向块(缓冲区)的。
2、IO是阻塞的,NIO是非阻塞的。
3、IO是面向流的,NIO是面向块(缓冲区)的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值