JAVA面试题速记-java基础

简介: 本文系统梳理Java核心知识点:涵盖8种基本数据类型、String/StringBuffer/Builder区别、final/static作用、==与equals差异、Collection接口与Collections工具类对比;详解List/Set/Map集合特性及线程安全方案;解析反射、异常处理(throw/throws)、线程生命周期、同步机制(synchronized/ReentrantLock)、ThreadLocal原理、序列化等关键概念。(239字)
  1. java 基本数据类型有哪些?
    Java有8种基本数据类型byte、short、int、long、float、double、char、boolean
  2. String、StringBuffer、StringBuilder 区别?
    String类代表字符串,其对象一旦创建便不可变。这使得String在多线程环境下天然安全,且适合作为HashMap的键,因其哈希值可以缓存。
    StringBuffer和StringBuilder的对象是可变的。StringBuffer是线程安全的,方法都用synchronized修饰;StringBuilder是非线程安全的,在需频繁修改字符串 避免+号拼接的场景 效率更高。
  3. final和static关键字作用是啥?
    final:修饰类时,该类不能被继承. 修饰变量时,基本类型变量值不可变,引用类型变量地址不可变。
    static:修饰成员变量时,该变量为类变量,被所有类的对象共享;修饰成员方法时,该方法为类方法,可通过类名直接调用,无需创建对象。
  4. == 和 equals 的区别是什么?
    == 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
  5. Collection 和 Collections 有什么区别?
    java.util.Collection 是集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法,Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
    Collections则是集合类的一个工具类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
  6. 介绍下 java 的集合?
    List:一个有序集合,可以包含重复的元素,常用实现类有ArrayList、LinkedList,ArrayList是基于动态数组的实现,查询效率高,插入和删除效率低, 非线程安全;LinkedList基于双向链表实现,插入和删除效率高,查询效率低,非线程安全;
    可以仅在方法中使用这两个集合定义为局部变量,避免出现线程安全问题
    也可以通过Collections.synchronizedList方法将ArrayList或LinkedList转换为线程安全的集合。
    也可以通过ConcurrentLinkedQueue替代LinkedList,它是一个高性能且线程安全的非阻塞队列,采用无锁设计,通过CAS操作保证线程安全性
    Set:一个不允许有重复元素的集合。常用实现类有HashSet、LinkedHashSet和TreeSet。HashSet基于哈希表实现,元素无序且唯一;LinkedHashSet维护元素插入的顺序;TreeSet保证元素处于排序状态
    Map:HashMap 实现 链表+红黑树实现,扩容时容量翻倍, 是非线程安全的,ConcurrentHashMap:线程安全的哈希表,采用CAS + synchronized实现。它允许多个线程同时读,适合高并发场景。
  7. java的是反射?
    在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法,
    Object 类(所有类都继承这个类) 其中有个方法 public final Class getClass() 所有的子类都继承了这个方法,返回了一个Class类;这个Class类中包含了某个类的属性、方法、和构造器等
  8. throw 和 throws 的区别是什么?
    throw 关键字用在方法内部,用来抛出方法或代码块中的异常。
    throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。
  9. final、finally、finalize 有什么区别?
    final:是修饰符,如果修饰类此类不能被继承;如果修饰方法和变量 表示不能在被改变。
    finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行。
    finalize: 是 Object 类的一个方法,在垃圾收回收机制下调用此方法。
  10. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
    finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。
  11. java 线程创建方式
    继承Thread类:定义一个类继承Thread类,重写run方法。这种方式不推荐,因为Java单继承机制会限制该类的复用性。
    实现Runnable接口:定义一个类实现Runnable接口,实现run方法,然后将该类实例作为参数传递给Thread类的构造函数。这种方式更灵活,可让类继承其他类。
    实现Callable接口:与Runnable类似,但Callable的call方法有返回值,可配合FutureTask获取线程执行结果。
    线程池:通过ExecutorService创建线程池来管理线程资源,如ThreadPoolExecutor。使用线程池可避免频繁创建和销毁线程,提高性能。
  12. 线程同步机制
    synchronized关键字:可用于修饰方法或代码块,实现同步。修饰方法时,该方法成为同步方法;修饰代码块时,需指定锁对象。它是一种非公平锁,不可中断。
    ReentrantLock:可重入锁,功能更强大,支持公平锁和非公平锁,可中断,还可使用Condition实现更灵活的条件变量控制。
  13. 线程状态
    线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)等状态。线程在不同场景下会在这些状态间转换。
  14. Thread 类中的start() 和 run() 方法有什么区别?
    start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的
    效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()
    方法才会启动新线程。
  15. 常用的线程池有哪些?
    (1)newSingleThreadExecutor:创建一个单线程池,此线程池保证所有任务的执行顺序按照任务的提交顺序执行
    (2)newFixedThreadPool:是一种固定线程数量的线程池
    特点:核心线程和最大线程数量都是一个固定的值。如果任务比较多工作线程处理不过来,就会加入到阻塞队列
    里面等待。
    (3)newCachedThreadPool:是一种可以缓存的线程池,它可以用来处理大量短期的突发流量
    特点:①最大线程数是Interger.MaxValue②线程存活时间是60秒③阻塞队列用的是SynchronousQueue
    (4)newScheduledThreadPool:具有延迟执行功能的线程池,可以用来实现实时调度
    (5)newWorkStealingPool:Java8里面新加入的一个线程池,它内部会创建一个ForkJoinPool,利用工作窃取的算法并行处理请求
  16. 说说ThreadLocal原理
    (1)ThreadLocal相当于一个线程本地变量,他会在每个线程中都创建一个副本;在线程之间访问内部
    副本变量,就可以做到线程之间互相隔离,相比于synchronized它是在用空间来换时间。
    (2)ThreadLocal中有一个静态内部类ThreadLocalMap,ThreadLocalMap又存在一个Entry数组,Entry具备保存key、value键值对的能力。Entry是一个弱引用,他的key是指向ThreadLocal的弱引用,
    (3)使用弱引用的目的是为了防止内存泄露,如果使用的是强引用的话,除非线程结束否则ThreadLocal对象始终无
  17. 什么是 java 序列化?
    序列化:将对象写入到IO流中
    反序列化:从IO流中恢复对象
    意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
    使用场景:所有可在网络上传输的对象都必须是可序列化的,所有需要保存到磁盘的java对象都必须是可序列化的。通常建议程序创建的每个JavaBean类都实现Serializeable接口。
相关文章
|
2月前
|
缓存 NoSQL Java
JAVA面试题速记-redis知识点
Redis核心简介(240字内): Redis提供5种基础数据结构:String、Hash、List、Set、ZSet,及Geospatial等扩展类型。支持RDB快照与AOF日志双持久化机制,兼顾性能与安全;通过过期策略(定期+惰性+LRU)管理内存。应对缓存击穿/雪崩,采用错峰过期;保障缓存-数据库一致性,推荐异步Binlog监听+可靠MQ删除。分布式锁推荐Redisson(自动续期、原子Lua脚本)。高可用支持哨兵(主从故障转移)与集群(16384槽分片、水平扩展)。BigKey需拆分、异步删除(UNLINK)、lazy-free优化。
327 131
|
2月前
|
人工智能 自然语言处理 机器人
2026零门槛OpenClaw部署指南:阿里云轻量服务器一键落地,7×24小时AI数字员工轻松拥有
在智能办公需求爆发的2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借自然语言指令执行、多工具集成、主流大模型兼容等核心优势,成为个人与轻量团队的“AI数字员工”首选。它打破了普通聊天机器人的功能局限,能真正落地文件处理、日程管理、信息提取、跨工具协同等实操任务,7×24小时不间断运行,大幅降低重复劳动成本。
680 133
|
26天前
|
JavaScript 前端开发
JS技巧:让代码更优雅的5个实用方法
JS技巧:让代码更优雅的5个实用方法
195 65
|
2月前
|
索引 Python
Python 技巧让你的代码更Pythonic
Python 技巧让你的代码更Pythonic
183 124
|
2月前
|
Python
提升Python代码质量的4个实用技巧
提升Python代码质量的4个实用技巧
182 134
|
2月前
|
存储 编译器 Go
Go语言实用技巧:空结构体的妙用
Go语言实用技巧:空结构体的妙用
224 136
|
2月前
|
PHP
PHP开发中的5个实用技巧,让你的代码更优雅
PHP开发中的5个实用技巧,让你的代码更优雅
204 136
|
2月前
|
Python
5个提升效率的Python技巧
5个提升效率的Python技巧
201 135
|
2月前
|
Go
Go技巧:用溢出处理提升代码健壮性
Go技巧:用溢出处理提升代码健壮性
206 136
|
2月前
|
索引 Python
提升Python代码质量的5个实用技巧
提升Python代码质量的5个实用技巧
211 136