java基础笔试面试题总结(三)

本系列是本人在学习java基础部分,刷牛客网1000+题以及参加各种笔试面试后所总结之精华,希望对大家有所帮助,有兴趣的可以加我好友,大家共同学习进步!

六、异常
throw和throws的区别:
1、throws出现在方法头,throw出现在方法体 2、throws表示出现异常的一种可能性,并不一定会发生异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。 3、两者都是消极的异常处理方式,只是抛出或者可能抛出异常,是不会由函数处理,真正的处理异常由它的上层调用处理。

七、常用类
1.System.out.println(Math.ceil(-0.4));
输出结果是-0.0)(ceil方法上有这么一段注释,如果参数小于0且大于-1.0,结果为-0.0)

2.Math.round(11.5)=12 Math.round(-11.5)=-11
Math.round 表示四舍五入,但源码中实现四舍五入的方法是,取与参数相近的整数,若一样近,则参数加上0.5,然后再取与参数最近的整数。

a.从代码的角度看,想知道一个类能不能被继承,打开源码看一下有没有finnal修饰就行
b.从理解的角度说,需要开发人员自定义的类才会被写成能继承的。向像Math这种工具类JDK已经写好了,程序员只管用就行(工具类、封装类不能被继承,Number类可以被继承,Integer,Float,Double等都继承自Number类)

java基础笔试面试题总结(三)
只要有一个int,==比较时就会自动拆箱,因此AD为true
第一和第三行执行都是先看堆中有没有int59的封装类,如果没有就创建,有就直接引用,因此B为true

5.实现抽象方法(或重写方法)的两同两小一大原则: 方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型, (如果是void 或是基本数据类型 则必须一致 如果是引用类型 ,也子类方法的返回值必须与父类方法返回值相同或是父类方法返回值的子类)
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。

九、容器
1 泛型的本质就是“数据类型的参数化”。 我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
java基础笔试面试题总结(三)
2. java基础笔试面试题总结(三)
3. 整理容器中需要记忆的点:
容器与数组的区别:1.数组大小定义时就已经确定,而容器大小可变
2.容器只能存放引用类型。

List、Set是Collection的子接口,而Map接口与Collection是同一级别的接口。List是有序、可重复的容器.
List的实现类:
1.需要线程安全时,用Vector。
2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。

1.HashMap: 线程不安全,效率高。允许key或value为null。
2. HashTable: 线程安全,效率低。不允许key或value为null。
(Hashtable与TreeMap允许的键值对可以为"",但是不能为null.)

TreeMap是红黑二叉树的典型实现。TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。HashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap。

Set是无序,不可重复的,常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet

十一、多线程

1.线程的停止有三种方式:1调用stop()方法(不建议使用,容易导致死锁)
2.线程执行完成,
3.异常抛出。而休眠和阻塞不能停止线程
tips2.启动线程是调用start方法。若直接调用run(),就把线程的run方法当普通方法

1.sleep()方法
在指定时间内让当前正在执行的线程暂停执行sleep()使当前线程进入阻塞状态,在指定时间内不会执行。不释放锁

2.wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

在Java对象中,有两种池
琐池-----------------------synchronized
等待池---------------------wait(),notify(),notifyAll()
如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
wait中的线程是不会去竞争对象锁的。

3.yield方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级或更高优先级的线程有执行的机会。
和sleep一样不释放锁,和sleep的区别在于sleep可能让任何优先级的进程取得执行的机会。

4.join方法
等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
join与synchronize的区别:
join在内部使用wait()方法进行等待,底层用wait()来实现。所以join释放锁。