Java面试:基础篇

1、重载、重写的区别

重载:发生在同一个类中,方法名相同,参数列表、返回值不同;
重写:发生在继承、实现关系中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类;

2、String、StringBuffer、StringBuilder区别,String为什么是不可变的

首先String被final修饰,所以是不可变的
StringBuffer、StringBuilder都继承AbstractStringBuilder类,StringBuffer对方法加了同步锁,所以是线程安全的
StringBuider是非线程安全的

3、==与equals

==:判断两个对象地址是否相等,引用类型判断内存地址
equals:如果覆盖了equals方法,引用类型判断存储的值
String的equals方法是被重写过的

4、Java中的异常

Error、Exception两种类型,都继承Throwable
Error:程序无法处理的错,比如程序终止,宕机等等
Exception:程序本身可以处理的异常
try-catch-finally:捕获异常,catch匹配异常,finally一定执行
finally不执行的情况:finally代码中异常,执行finally之前退出程序,程序所在线程死亡,CPU关闭
throw:抛出异常

5、接口、抽象类的区别

1、抽象类可以有非抽象的方法
2、一个类可以实现多个接口,只能继承一个类
3、实现接口需要实现所有方法,抽象类不一定

6、JVM调优、内存泄露

VisualVM:JDK自带工具
调优关注点:
查看堆空间分配大小
提供即时垃圾回收功能
垃圾监控
查看堆内类、对象信息(数量、类型)
内存泄露:如果使用的堆大小越来越大,则堆空间可能会被无法回收的垃圾对象占满
对比垃圾回收前后,对象引用情况分析,基本上可以找到泄露点

7、JVM内存管理

PC寄存器:
记录线程运行位置,每个线程独有,线程阻塞恢复挂起等操作都需要用到
虚拟机栈:
创建线程时创建,用于存储栈帧,存储方法运行时临时数据、中间结果

用于存储对象
方法区
存储静态变量,运行时常量池
运行时常量池
本地方法栈
支持natvie方法

分带算法:
新生代:活不了多久,例如局部变量
老年代:生命周期长的对象
永久代:class这些,无法回收,存储在方法区

8、集合部分

8.1、ArrayList、LinkedList异同

1、数据结构不同,ArrayList数组结构,LinkedList是双向链表结构
2、ArrayList查询效率高,LinkedList插入、删除效率高

8.2、线程安全的集合

Vector、CurrentHashMap、Hashtable

8.3、HashMap

数据结构:数组、链表、红黑树,链表长度大于8,转为红黑树结构
链表结构为了解决哈希冲突
concurrentHashMap实现线程安全:使用synchronized和cas实现

9、Java多线程

9.1、synchronized、volatile

synchronized为了解决多线程之间访问资源同步性,用它修饰方法、代码块能保证在任意时间只能由一个线程执行此代码
volatile只能用于变量,主要解决变量在多个线程中可见性,不保证数据的原子性,synchronized主要是解决多线程访问资源的同步性

9.2、线程池

优点:降低资源消耗、提高响应速度、提高线程的管理性;
如何创建?
ThreadPoolExecutor:
核心线程、最大线程数、工作队列、非核心线程存活时间、拒绝策略
执行流程:出现新的线程任务,分配一个空闲线程执行,如果没空闲线程,如果当前线程数 < 核心线程,创建一个新线程处理任务,达到核心线程数,工作队列未满,放入工作队列等待,工作队列满了,存货线程不大于最大线程,创建新线程,达到最大线程数,使用拒绝策略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值