本文共 3768 字,大约阅读时间需要 12 分钟。
Java核心技术问题解答
1. ArrayList 和 LinkedList 的区别
ArrayList 是基于数组实现的动态数组,支持快速随机访问。其底层通过自动扩容(初始容量为10,每次扩容为上一次的一半)实现,适合读取操作;而 LinkedList 是基于双向链表实现的,适合插入和删除操作。
2. 重载与重写的区别
重写( Override )适用于不同的类之间,要求方法的签名完全一致。重载( Overload )适用于同一类中的方法,要求方法的参数列表不同。重写的方法不能被重载,且重写的方法不能是 final 方法。
3. && 与 || 的区别
&& 和 || 都可以实现逻辑与,但两者的执行顺序不同。&& 从左到右评估,左边为 false 时,右边不会被评估;而 || 从左到右评估,左边为 true 时,右边不会被评估。&& 更高效,适合多次条件判断。
4. 接口与抽象类的区别
- 抽象类:不能被实例化,作为父类存在。可以有属性、方法和构造方法,抽象方法必须被重写。子类必须实现所有抽象方法。
- 接口:也不能被实例化,作为父接口存在。属性只能是常量值,子类可以实现多个接口。接口比抽象类更抽象,且接口中的成员变量必须是 public。
5. JDBC 操作数据库的步骤
加载驱动:Class.forName("com.mysql.jdbc.Driver") 创建连接:Connection con = DriverManager.getConnection("url", "username", "password") 创建语句:PreparedStatement ps = con.prepareStatement("insert into user values(?)") 执行语句:ResultSet rs = ps.executeQuery() 处理结果:while (rs.next()) { rs.getString(1); } 关闭资源:确保在 finally 块中关闭连接和结果集。 6. Hashtable 与 HashMap 的区别
- Hashtable:线程安全,不能存储 null 键值,效率较低。
- HashMap:线程不安全,允许 null 键值和值,效率更高。
- 主要区别:Hashtable 的方法是线程安全的,而 HashMap 是轻量级实现。
7. 多线程方式及死锁防治
- 创建方式:继承 Thread 或实现 Runnable 接口。
- 死锁产生原因:资源竞争和互斥。
- 防治方法:加锁顺序、加锁时限、死锁检测。
8. StringBuffer、StringBuilder 与 String 的区别
- 运行速度:StringBuilder > StringBuffer > String。
- 线程安全:StringBuilder 是线程不安全的,而 StringBuffer 是线程安全的。
- 应用场景:String 用于字符串常量,StringBuilder 用于字符串变量,适合频繁修改操作。
9. TCP 与 UDP 的区别
- TCP:三次握手协议,连接稳定性高但效率较低。
- UDP:无连接性,效率高但稳定性差。
- 应用场景:TCP 适用于需要可靠连接的场景,UDP 适用于实时性要求高但可靠性不重要的场景。
10. Session 与 Cookie 的区别
- Session:服务器端保存状态,数据存储在服务器,影响性能。
- Cookie:客户端保存状态,数据存储在浏览器,不安全。
- 应用场景:Session 适用于需要高安全性但性能影响较大的场景,Cookie 适用于简单的状态管理。
11. GET 与 POST 请求的区别
- GET:用于从服务器获取数据,不支持修改操作。
- POST:用于向服务器提交数据,支持修改操作。
- 安全性:POST 更安全,但 GET 数据量有限。
- 应用场景:GET 适用于数据查询,POST 适用于数据提交。
12. Redis 数据类型
- String:字符串类型,支持动态字符串操作。
- List:列表类型,支持按序存储元素。
- Set:集合类型,存储唯一元素。
- ZSet:有序集合,支持按优先级存储元素。
- Hash:哈希表,存储键值对。
13. Redis 与 MongoDB 的应用场景
- Redis:适用于数据量较小的高性能操作。
- MongoDB:适用于处理海量数据,提供高效的查询和存储性能。
14. == 与 equals 的区别
- ==:比较内存地址相同。
- equals:比较对象值是否相同。
- 注意事项:对象类型必须一致,且 equals 方法正确实现。
15. List 与 Map 的区别
- List:有序,允许重复元素。
- Map:无序,键不重复。
- 应用场景:List 适用于有序存储,Map 适用于键值对存储。
16. Integer 与 int 的区别
- int:基本数据类型,值为 0。
- Integer:对象类型,值为 null。
- 注意事项:自动拆装箱和装箱,需注意缓存机制。
17. 进程与线程的区别
- 进程:资源分配单元,包含多个线程。
- 线程:CPU调度单元,共享进程资源。
- 创建方式:进程创建调用 fork 或 vfork,线程创建调用 pthread_create。
18. 进程状态
- 就绪状态:已分配资源,等待处理。
- 运行状态:正在执行程序。
- 阻塞状态:等待资源或事件。
- 状态转换:就绪 → 运行 → 就绪 → 阻塞 → 就绪。
19. URL 请求与响应流程
域名解析 TCP 三次握手 客户端发送 HTTP 请求 服务器处理请求 服务器发送响应 TCP 连接关闭 20. HTTP 状态码
- 1:信息性状态码(200: 请求成功,204: 服务器成功但无内容返回)。
- 3:重定向状态码(301: 永久重定向,302: 临时重定向)。
- 4:客户端错误状态码(400: 语法错误,401: 缺少认证信息)。
- 5:服务器错误状态码(500: 服务器错误,503: 服务器超负载)。
21. sleep 与 wait 的区别
- sleep:属于 Thread 类,线程进入睡眠状态,方法不释放锁,需捕获 InterruptedException。
- wait:属于 Object 类,线程进入等待状态,方法释放锁,无需捕获异常。
22. Error 与 Exception 的区别
- Error:系统级错误,通常由 JVM 抛出,不需要程序处理。
- Exception:程序级错误,需程序处理。
- 捕获与抛出:遵循就近原则,捕获异常时应尽量靠近异常源。
23. Java I/O 与 NIO 的区别
- 传统 I/O:基于流,效率低,阻塞型。
- NIO:基于块,效率高,非阻塞型。
- 特点:NIO 通过通道和缓冲区实现高效 IO 操作。
24. 单例模式特征与应用场景
- 特征:私有构造方法、静态引用、公有静态获取方法。
- 应用场景:频繁实例化且销毁资源的对象,工具类对象,数据库连接池等。
25. Java 接口修饰符
- public:允许所有类访问。
- final:不能被重写,适用于不需要重写的接口方法。
- abstract:必须被重写,适用于需要继承实现的接口方法。
26. Java 数据类型与自动拆装箱
- 基本数据类型:byte、short、char、boolean、int、long、float、double。
- 包装类型:Byte、Character、Short、Integer、Long、Float、Double。
- 自动拆装箱:基本类型与包装类型之间的转换。
27. 单例模式实现
- 饿汉式:类装载时创建实例。
- 懒汉式:第一次使用时创建实例。
- 优缺点:饿汉式高效,懒汉式节省内存。
28. 构造器的可重写性与可重载性
- 构造器不能被继承,因此不能重写。
- 可以被重载,不同构造器的参数列表不同。
29. ThreadLocal 随机存取机制
- 特点:线程局部存储,线程私有。
- 使用场景:需要每个线程维护独立的数据。
30. GC 的作用与原因
- 垃圾回收器:管理内存,自动回收无用对象。
- 原因:内存泄漏会导致程序崩溃,GC自动清理内存。
31. Thread synchronization 方法
- wait():让线程等待,释放锁。
- sleep():让线程睡眠,需捕获 InterruptedException。
- notify():唤醒等待的线程。
32. 事务隔离级别与问题
- read uncommitted:最低隔离级别,允许脏读。
- read committed:防止脏读。
- read repeatable:防止不可重复读。
- serializable:防止幻读。
33. 数据库查询效率优化
- 索引使用:避免全表扫描。
- 避免复杂查询:减少索引使用。
- 查询优化:按索引列排序,避免 NOT IN、IS NULL 等操作。
34. 数据库连接池
- 开源连接池:DBCP、C3P0,支持最大最小连接数设置。
- 特点:连接池管理连接,提高数据库吞吐量。
35. Redis 与 MongoDB 的对比
- Redis:适用于小数据量、高性能操作。
- MongoDB:适用于大数据量、高效查询场景。
转载地址:http://urms.baihongyu.com/