- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Java基础知识面试题及答案
1.说说JDK、JRE、JVM的区别?实际开发中你会装哪个?
答案:
简单说就是“包含关系”:JDK包含JRE,JRE包含JVM。
JVM是Java跨平台的核心(虚拟机,负责解释字节码),但光有JVM跑不了程序,得有类库支持;
JRE(Java运行时环境)=JVM+核心类库(比如java.lang包),用户跑Java程序只需要装JRE;
JDK(Java开发工具包)=JRE+开发工具(比如javac编译器、jdb调试工具),所以我们开发时必须装JDK,不然没法编译代码。
实际开发里我装JDK,而且会注意版本兼容,比如项目用JDK8,就不会装JDK17,避免出现语法或API不兼容的问题(比如JDK9开始的模块机制,会影响旧项目的类加载)。
2.封装的作用是什么?举个实际开发中的例子
答案:
封装核心是“隐藏细节,暴露接口”,有两个主要用:
保护数据安全,防止外部随意修改对象属性(比如不能让用户直接把年龄设成负数);
降低耦合,外部不用关心内部实现,只要调用接口就行,后续改内部逻辑也不影响外部。
比如开发用户模块时,User类的password字段肯定要封装:用private修饰,不让外部直接访问,然后提供setPassword()方法,在方法里加校验(比如密码长度至少6位),再提供getPassword()方法(实际项目里get可能还要加密,避免明文泄露)。这样外部只能通过setPassword()设密码,就保证了密码的合法性。
3.为什么说String是不可变的?实际开发中用String有什么要注意的?
答案:
String不可变是因为它的底层是privatefinal的char数组(JDK9后是byte数组),而且没有提供修改数组的方法。比如你写Strings=a;s+=b;,看似改了s,其实是新建了一个ab的String对象,原来的a还在常量池里没动。
实际开发要注意两点:
频繁拼接字符串别用String,比如循环里拼接,会创建大量临时对象,浪费内存,这时候用StringBuilder(单线程)或StringBuffer(多线程,线程安全但慢);
存敏感信息(比如密码)别用String,因为不可变意味着一旦创建,直到GC回收前都在内存里,容易被内存dump泄露,改用char数组,用完能手动清空。
4.ArrayList和LinkedList的区别?什么时候选前者,什么时候选后者?
答案:
核心区别在底层结构,导致操作效率不一样:
ArrayList:底层是动态数组,查改快(通过索引直接定位,O(1)),增删慢(尤其是中间位置,要移动数组元素,O(n));
LinkedList:底层是双向链表,查改慢(要从头/尾遍历找元素,O(n)),增删快(只要改前后节点的指针,O(1))。
实际选择:
如果是“查多改少”的场景,比如做数据展示(列表查详情),用ArrayList;
如果是“增删多,查询少”的场景,比如做队列(先进先出,只在首尾操作)、栈(后进先出),用LinkedList。
另外注意:ArrayList初始化时可以指定容量(比如newArrayList(100)),避免频繁扩容(默认扩容是1.5倍,会浪费内存),这个小优化在数据量大的时候很有用。
5.说说checked异常和unchecked异常的区别?实际项目里怎么处理异常?
答案:
最直观的区别是“编译时是否强制处理”:
checked异常(受检异常):编译时就必须处理,要么try-catch,要么throws声明,比如IOException、SQLException,这些都是“可预期的异常”(比如读文件可能没找到);
unchecked异常(非受检异常):编译时不强制处理,运行时才会抛,比如NullPointerException、ArrayIndexOutOfBoundsException,这些大多是“代码bug”(比如没判空就调用方法)。
实际项目处理原则:
别吞异常(比如try里catch了只打印一句“出错了”,不抛也不记录日志,后期没法排查);
按业务分类处理:比如数据库异常可能需要回滚事务,接口调用异常可能需要重试;
自定义异常:比如业务上的“用户不存在”,可以写个UserNotFoundException,比用通用异常更清晰;
finally别写return:比如try里return1,finally里return2,最终返回2,会覆
文档评论(0)