※JavaSE 常见面试题

目录

1.通过字面量创建字符串和new一个字符串对象有什么区别?那什么是常量池呢?

2. String适合做字符串拼接吗?String,StringBuffer和StringBuilder有什么区别?

3.子类重写父类方法的要求

4. final,finally,finalize有什么区别?

5.List集合和Set集合的区别是什么?

 6.集合中的泛型有什么用?

7.常见的List集合有哪些?有什么区别 

8.什么是队列,什么是栈? 

9.HashMap的初始长度是多少?在什么时候进行扩容?

10.HashMap的底层数据结构是什么?那什么时候变为红黑树呢?

11.HashMap,HashTable,ConcurrentHashMap有什么区别? 

12.什么是CAS算法?

13. 我们能否使用任何类作为HashMap的key?

14. 你能说说 sleep wait notify notifyAll的作用吗?

15. 创建线程有哪些方法?

16.Java的线程池有哪些?那你最常用的线程池是哪个?


1.通过字面量创建字符串和new一个字符串对象有什么区别?那什么是常量池呢?

内存的分配方式不一样:

-- 通过字面量创建的字符串对象会分配到常量池

-- 通过new创建的字符串对象会分配到

常量池:

-- 它存在于方法区(元空间中),使用字面量创建的字符串会直接缓存到常量池中,若再次使用该字面量创建新字符串时,不再创建新对象,而是从常量池中获取

2. String适合做字符串拼接吗?String,StringBuffer和StringBuilder有什么区别?

String是只读字符串,不适合

jdk1.8之后字符串拼接底层就是创建了一个StringBuilder,然后调用append方法,最后调用toString转化成String

1 、数据可变和不可变
①  String 底层使用一个不可变的字符数组,由final修饰, 所以它内容不可变
②  StringBuffer StringBuilder 都继承了 AbstractStringBuilder 底层使用的是可变字符数
2 、线程安全
StringBuilder 是线程不安全的,效率较高;而 StringBuffer 是线程安全的,效率较低。

通过他们的 append() 方法来看, StringBuffer 是有同步锁,而 StringBuilder 没有

3、 相同点

StringBuilder 与 StringBuffer 公共父类 AbstractStringBuilder 

3.子类重写父类方法的要求

方法重写的具体要求:
    1.方法名和形参列表一样。
    2.返回值类型一样或更小。
    3.修饰符权限相同或者更大。
    4.抛出的异常一样或者范围数量更小。

方法重写的规范:
    1.加上@Override注解。
    2.建议“申明不变,重新实现”

4. final,finally,finalize有什么区别?

final用于修饰类,变量,方法

1.final修饰类,类不能被继承了。
2.final可以修饰方法,方法就不能被重写了。
3.final修饰变量总规则:变量有且仅能被赋值一次。

finally用于try-catch捕获异常,无论代码是否发生异常,finally中的代码一定会被执行,通常用来关闭资源

finalize属于Object类中的一个方法,当对象被回收的时候,会调用此方法

5.List集合和Set集合的区别是什么?

List集合是可重复集合,且有序

Set集合是不可重复集 ,且无序

 6.集合中的泛型有什么用?

集合中的泛型是用来约束元素类型的 

7.常见的List集合有哪些?有什么区别 

ArrayList 底层是数组,查询快,增删慢

LinkedList 底层是链表,增删快,查询慢

Vector 底层是数组,是线程安全

8.什么是队列,什么是栈? 

是用于存储数据的数据结构

队列  遵循先进先出原则

栈      遵循先进后出原则

9.HashMap的初始长度是多少?在什么时候进行扩容?

HashMap的初始长度是16

当容量达到加载因子0.75的时候进行扩容

扩容后的大小一定是2的N次方 

10.HashMap的底层数据结构是什么?那什么时候变为红黑树呢?

 在JDK1.7的时候是数组+链表;

在JDK1.8的时候是数组+链表+红黑树;

当链表的长度大于8的时候,就会变成红黑树

11.HashMap,HashTable,ConcurrentHashMap有什么区别? 

HashMap是线程不安全的;

HashTable是线程安全的,其内部使用了synchronize关键字进行加锁;

ConcurrentHashMap结合了HashMap和HashTable,是线程安全的,

JDK1.7,其内部使用了分段锁的思想来进行加锁

JDK1.8,其内部是用来CAS+synchonized来保证并发安全

12.什么是CAS算法?

 全称为CompareAndSwap,比较和更新,是能保证当前操作安全性和原子性的算法

Java并发包中的很多类都使用了CAS技术,如ConcurrentHashMap,AtomicInteger原子操作类等等.

CAS操作涉及到三个操作值:当前内存中的值,预估值,即将修改的新值.

当且仅当预估值等于内存中的值得时候,才将新的值保存到内存中,否则什么都不做.

CAS是从乐观的角度出发:
    总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
    CAS这种机制我们也可以将其称之为乐观锁。综合性能较好!

13. 我们能否使用任何类作为HashMap的key?

可以

需要注意的是,如果类重写了equals方法,我们应当连同重写hashcode方法;因为hashcode的值应当与equals的结果相对应,两个对象若equals比较为true,hashcode值应当相同.两个对象若equals比较结果为false.hashcode值最好不同.若依然相同,那么作为key存入HashMap中时会产生链表现象,影响HashMap查询性能. 

14. 你能说说 sleep wait notify notifyAll的作用吗?

sleep方法是Thread类的静态方法

调用sleep方法可以让当前正在运行的线程进入睡眠状态,即暂时停止运行指定的单位时间。并且该线程在睡眠期间不会释放对象锁

wait是Object提供的一个方法

调用wait方法可以让当前线程进入等待唤醒状态并释放锁。该线程会处于等待唤醒状态直到另一个线程调用了object对象的notify方法或者notifyAll方法。

notify也是Object提供的一个方法

当其它线程调用该对象的notifyAll()方法(唤醒所有wait线程)或notify()方法(只随机唤醒一个wait线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去公平竞争该对象锁。

15. 创建线程有哪些方法?

(1)直接定义一个类继承Thread类,重写run()方法,创建线程对象
    调用线程对象的start()方法启动线程。
(2)定义一个线程任务类实现Runnable接口,重写run()方法,创建线程任务对象,把
    线程任务对象包装成线程对象, 调用线程对象的start()方法启动线程。
(3)实现Callable接口。
(4)使用线程池创建

16.Java的线程池有哪些?那你最常用的线程池是哪个?

newCachedTheadPool 动态的线程池

newFixedThreadPool 固定线程数的线程池

newSingleThreadExecutorPool 固定只有一条线程的线程池

newSCheduledThreadPool 以固定频率执行的线程池

一般来说,这四种线程池都不使用,一般使用ThreadPoolExecutor来自定义线程池

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值