1.重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分?
1)重载:在同一个类中,方法名相同,参数的个数或者参数的类型不同。 重载对返回类型没有要求,可以相同也可以不相同,故不能通过返回类型是否相同来区分是否为重载。
2)重写:发生在父类与子类之间。方法名,参数列表,返回类型(除过子类中返回类型是父类中返回类型的子类)必须都相同; 子类访问修饰符的权限不能少于父类的; 子类的方法一定不能抛出新的异常或者比父类更加广范的异常。
2.String s = “Hello”;s = s + " world!";这两行代码执行后,原始的 String 对象中的内容到底变了没有?
没有变的,因为String是不可变类;s原先指向一个对象,内容是Hello,后面对s进行了+操作,这时s就指向了另外一个String对象,即内容HelloWorld;原来的那个对象还存在内存中,只不过现在的s不指向他了。
3.Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?
.round()方法:括号中的数加上0.5后,向下取整。 Math.round(11.5)=11.5+0.5=12, 然后向下取整为12.0 Math.round(- 11.5)=-11.5+0.5=-11,然后向下取整为-11.0
扩展问题: 1)Math.ceil求最小的整数,但不小于本身. Math.ceil(11.3)的结果为12 Math.ceil(-11.3)的结果是-11 2)Math.floor求最大的整数,但不大于本身 Math.floor(11.6)的结果为11 Math.floor(-11.6)的结果是-12
4.String 、StringBuilder 、StringBuffer 的区别?
1)String 的值不可变,这就导致每次对String操作都会产生新的String对象,效率低,浪费优先资源。 2)StringBuilder 是可变类,速度更快,但是线程不安全。 3)StringBuffer是可变类,也是线程安全的操作类,每次对他进行操作都不会产生新的对象。每一个StringBuffer都有一定的缓冲区容量。
5.HashMap的底层数据结构是什么(v1.8+), HashMap在什么时候进行扩容,如何扩容?扩容之前的节点是如何挂载到新的扩容数组上的。
1)1.8+的底层结构是数组+链表+红黑树;首先结构是一个数组,数组的类型是链表,当链表中的元素大于8时,它会变成红黑树,当红黑树中的元素小于6时结构会变成链表元素后使用的是尾插法。
2)默认的负载因子(loadFactor)值为0.75; 当数组的 元素数量>默认数组大小(16)X 负载因子0.75 = 阀值(12) 时就会触发扩容,扩容时原来的二倍,就变成了32。------HashMap首次扩容在初始化后刚插入数据时进行第一次的扩容,它是现扩容再插入数据,之后每次插入的数据大于等于阀值的时候进行第二次扩容…,这时候为先插入数据在进行扩容。
6.解释CAS原理。
如果内存值V和预期原值A相同时,处理器会自动将该位置的内存值修改为新值B,否则的话处理器不做任何的处理。 扩展ABA问题: CAS在检查操作值有没有发生变化的过程中,如果没有变化则更新,但是假设如果一个值原先是A,后来变成了B,接着在检查前又变成了A,这时检查结果就是没有发生变化,但是实际上发生变化了。比如链表的头部在变化了两次后又恢复了原值,但是不代表该链表没有发生变化。所以java提供了:AtomicStampedReference/AtomicMarkableReference来处理发生ABA场景的问题。实际上就是在对象中额外增加一个标记来标识对象是否有发生变化过。
7.为什么要使用线程池?常见的线程池有哪些?
1)减少线程的创建次数和销毁次数,每个工作线程都可以被重复的利用,可以执行多个任务。 2)提高速率,当任务到达时,不需要等到线程创建就可以执行。 3)可以自动根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存而导致服务器的崩塌。
常见的线程池: 1)CachedThreadPool: 缓存池线程–线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新的线程。 2)NewSingleThreadPool:单线程线程池—线程池中心只有一个线程,执行完后立即回收。 3)NewFixedThreadPool:定长线程池,可控制线程的并发数。 4)NewScheduleThreadPool:定长线程池(普通线程数量无限),适用于定时及周期性处理任务。
8.java中sleep() 和 wait( ) 的异同。
1)Sleep()方法属于Thread类,通过指定的时间暂停此线程,但是它一直被监视着,Sleep不会释放线程的锁,等到时间到了它会自动的恢复。
2)wait()方法属于Object类,使用wait方法会释放对象锁,一直被停止,线程处于等待状态,直到使用notify()方法将其唤醒。
9.JDK和JRE有什么区别?
JDK是java开发的工具包。JRE是java的运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。
10.写出广度优先(层遍历)代码
public void guangDu(TreeNode root) {
if(root==null) {
return;
}
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()) {
TreeNode tmp = q.poll();
if(tmp.left!=null) {
q.add(tmp.left);
}
if(q.right!=null) {
q.add(tmp.right);
}
}
}
|