Java常见面试题(1)
| 本文已参与「新人创作礼」活动,一起开启掘金创作之路。 | |
|---|---|
介绍一下Object类中的方法
getClass:返回该对象的运行时类
equals:判断对象是否相等
hashCode: 返回该对象的哈希值
toString:返回的是字符串
clone:得到当前对象的副本
还提供了一些其他的方法:wait(), notify(), notiAll(),来控制线程的暂停与运行。
说一说hashCode()和equals()的关系
hashCode 用于获取哈希值,equals 用于比较两个对象是否相等
如果两个对象相等,那么他们必须有相同的哈希值相等。
如果两个对象有相同的哈希值。则未必相等。
==和equals()有什么区别?
== 比较基本数据类型的值,引用数据类型的地址值。
equals:没有重写:比较的是地址值,重写后的 equals,比较两个对象的内容是否相等。
String类有哪些方法?
charAt:返回指定索引处的字符
substring:截取zifuchuan
split:分割字符串
trim:去除两端空格
replace:替换
indexof:返回字符 在字符串中首次出现的索引
startsWith:判断此字符串是否以指定的前缀开头
toUpperCase:字符串中所有的字符大写
toLowerCase:字符串中所有的字符小写
String 和 StringBuffer,StringBuilder 的区别是什么
相同点:三个类都是处理字符串的类;
不同点:
从安全上来说,
String 中的对象是不可变的,也就可以理解为常量
StringBuffer 对方法加了同步锁,所以是线程安全的,效率比较低,适合多线程。
StringBuilder 并没有对方法进行加同步锁,线程不安全的,效率高适合单线程。
创建线程的方式
1.继承Thread类,或者直接实现Runnable接口,然后再重写下run方法就行了。启动线程的方式就是调用类里边的 start方法。
2.实现 Callable 接口,他的执行代码的方法是call方法,可以有返回值
3.通过线程池来实现,线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可。节省了开辟子线程的时间,提高代码执行效率。
线程都有哪些方法
wait方法呢就是线程等待,调用这个方法之后,线程进入等待状态,只有等待通知notify或者notifyAll才会继续执行,会释放锁,释放cpu资源。
sleep线程睡眠,让当前线程休眠,此时线程处于阻塞的状态,时间到了之后,线程继续向下执行,不会释放锁,不会解除cpu占用
yield线程让步,意思是释放CPU资源,让其他线程抢夺CPU资源
join线程插队,就是让当前线程先运行,其他线程先等待
interrupt线程中断,就是中断当前线程的意思
你了解java中有哪些线程池
1.newCachedThreadPool创建一个可缓存线程池程
2.newFixedThreadPool 创建一个定长线程池
3.newScheduledThreadPool 创建一个周期性执行任务的线程池 4.newSingleThreadExecutor 创建一个单线程化的线程池
线程池的工作原理?
1.当提交一个新任务到线程池时,线程池判断corePoolSize线程池是否都在执行任务,如果有空闲线程,则从核心线程池中取一个线程来执行任务,直到当前线程数等于corePoolSize;
2。如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;
3.如果阻塞队列满了,那就创建新的线程执行当前任务,直到线程池中的线程数达到maxPoolSize,这时再有任务来,由饱和策略来处理提交的任务
类的加载过程
类的加载分为五个阶段:加载-检查-准备-解析-初始化
加载:根据查找路径找到相应的 class 文件然后导入;
检查:检查加载的 class 文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:将常量池中的符号引用替换成直接引用。
符号引用就理解为一个标示,而直接引用是直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
目录传送门