Java基础面试必备知识:经典问题解析

需积分: 50 9 下载量 147 浏览量 更新于2024-09-09 3 收藏 50KB DOC 举报
"Java基础面试题的集合,涵盖了私有main方法、参数传递方式、equals与hashCode的关系、Java跨平台原理、main方法的关键字解析以及==与equals的区别。" Java编程语言的基础知识在面试中至关重要,以下是这些经典面试题所涉及的详细知识点: 1. **私有main方法**:如果将main方法声明为`private`,虽然代码能够正常编译,但是由于`private`访问修饰符限制了其外部访问,因此在尝试运行时,Java虚拟机(JVM)无法找到公共的入口点,会提示“main方法不是public的”。Java程序的标准入口点应该是`public static void main(String[] args)`。 2. **传引用与传值**:在Java中,对象作为参数传递时,实际上是传递对象的引用,而非对象的副本。这意味着,当一个方法修改了传入的对象,原始对象的状态也会改变。而基本类型则按照值传递,传入的是基本类型变量的副本,方法内对副本的修改不会影响到原始变量。 3. **重写equals方法与hashCode**:在覆盖`equals`方法时,通常也需要重写`hashCode`方法,以保持一致性。因为`equals`方法用于比较两个对象是否相等,`hashCode`方法则返回对象的哈希值。如果两个对象根据`equals`判断相等,那么它们的`hashCode`值也应相同。违反这一原则可能导致某些数据结构(如HashMap)的行为不正确。 4. **Java的跨平台性**:“一次编写,处处运行”(Write Once, Run Anywhere,WORA)的特性是通过Java虚拟机(JVM)实现的。Java源代码被编译成平台无关的字节码,然后由JVM负责解释执行。JVM在不同操作系统上实现了字节码的本地化,使得Java程序可以在任何支持JVM的平台上运行。 5. **main方法的关键字解析**: - `public`:表示main方法对所有类都是可见的,因此JVM可以在任何地方调用它。 - `static`:意味着main方法属于类本身,而非类的实例,因此在运行时无需创建类的实例就可以调用。 - `void`:表明main方法没有返回值,仅执行其内部的代码。 - `String[] args`:这是main方法的参数,表示从命令行传递给程序的参数,类型为字符串数组。 6. **==与equals的区别**: - `==`运算符比较两个对象的引用,即它们在内存中的位置是否相同。如果两个对象指向同一内存位置,`==`返回`true`,否则返回`false`。 - `equals`方法用于比较对象的内容。默认情况下,`equals`与`==`行为一致,除非对象的类或其超类重写了`equals`方法。例如,`String`类重写了`equals`,比较的是两个字符串的内容是否相等,而不关心它们是否是同一个对象。 在示例代码中,我们看到了不同情况下的`==`与`equals`比较。`Strings1 == s5`返回`true`是因为它们引用的是同一对象,而`Strings3.equals(s4)`返回`true`是因为它们虽然不是同一个对象,但内容相同。注意,`new String("abc")`会创建新对象,即使内容相同,引用也是不同的。
2016-10-12 上传
绝对想你所想,超乎想象!够详细,够给力! 目录 1. Jvm内存空间结构是什么样的? 1 程序计数器 1 Java栈 1 本地方法栈 2 堆 2 方法区 3 2. Jvm堆内存的划分结构和优化 3 2.1. 原理 6 2.1.1. 年轻代 6 2.1.2. 年老代 6 2.1.3. 持久代 7 2.2. 参数说明 8 2.3. 疑问解答 9 2.4. 垃圾回收器选择 10 2.4.1. 串行收集器 10 2.4.2. 并行收集器(吞吐量优先) 10 2.4.3. 并发收集器(响应时间优先) 11 2.4.4. 其它垃圾回收参数 11 2.5. 辅助信息参数设置 12 2.6. 关于参数名称等 13 3. JVM服务参数调优实战 14 3.1. 大型网站服务器案例 14 3.2. 内部集成构建服务器案例 15 4. 常量池在jvm的哪个空间里边? 17 5. jvm垃圾回收是什么时候触发的? 17 5.1. 那究竟GC为我们做了什么操作呢? 17 5.1.1. Jvm怎么判断对象可以回收了? 18 5.2. 下面我们来看一下几种垃圾收集算法 18 5.2.1. 在JDK1.2之前,使用的是引用计数器算法, 18 5.2.2. 根搜索算法 19 5.2.3. 引用的分类 19 5.3. 方法区也是会被回收的 20 5.4. 下面我们来逐一介绍一下每个垃圾回收器。 22 5.4.1. 1、 Serial收集器 22 5.4.2. 2、 ParNew收集器 23 5.4.3. 3、 ParallelScavenge 23 5.4.4. 4、 ParallelOld 24 5.4.5. 5、 SerialOld 24 5.4.6. 6、CMS 24 5.4.7. 7、 GarbageFirst(G1 ) 26 6. 常量池如何触发的垃圾回收? 28 7. 垃圾回收从哪里开始检测树进行回收?根节点是什么? 28 7.1. 目前java中可作为GC Root的对象有 29 8. Redis怎么判断对象可以清理了? 29 9. Redis怎么提高命中率? 29 10. Finalize中调用垃圾回收方法,再调用方法会回收么? 29 11. Int进行自增操作,如何保证线程安全? 30 12. Int a=1是原子方法,布尔类型进行赋值是原子方法么? 30 12.1. 多线程原子操作的安全性 31 13. Cas怎么实现unsafe? 32 13.1. Unsafe 32 13.2. CAS 32 13.3. 由CAS分析AtomicInteger原理 33 13.4. CAS的缺点 35 14. Map数据结构? 35 14.1. 一、定义 36 14.2. 二、构造函数 36 14.3. 三、数据结构 36 14.4. 四、存储实现:put(key,vlaue) 38 14.5. 五、读取实现:get(key) 41 15. 一百万数据放Arraylist数组,怎么放? 在哪个代? 42 15.1.1. 调整数组容量 42 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 43 17. 数据库组合索引,储存在一个叶子节点还是多个? 44 17.1. 索引的利弊与如何判定,是否需要索引: 44 17.1.1. 索引的好处 44 17.1.2. 索引的弊端 44 17.1.3. 如何判定是否须要创建索引 44 17.2. 复合索引优化 45 17.3. 下面是一些常见的索引限制问题 45 17.3.1. 使用不等于操作符(<>, !=) 45 17.3.2. 使用 is null 或 is not null 45 17.3.3. 使用函数 45 17.3.4. 比较不匹配的数据类型 46 17.4. 关于索引的排序 46 18. 数据库没有orderby默认如何排序。 46 19. 分布式事务如何实现。 46 19.1. 1 事务/分布式事务 47 19.1.1. 1.1 事务 47 19.1.2. 1.2 分布式事务与 XA 规范 47 19.2. 2 两阶段提交协议 47 19.2.1. 2.1 预提交阶段 48 19.2.2. 2.2 提交阶段 48 19.3. 3 分布式事务应用框架 48 19.3.1. 3.1 角色 48 19.3.2. 3.2 交互时序 49 19.3.3. 3.3 关键点 50 19.3.4. 参考 50 20. Jvm底层源码 51 21. 二叉树怎么实现的? 51 22. Executourservice 数据结构。哪种只能执行一个线程。 Cache怎么实现的 fixed线程如果中断,线程回自己销毁么? 51 23. 栅栏的原理和实现。 51 23.1. 1. CyclicBarrier简介 51 23.2. 2. CyclicBarrier数据结构 52 23.3. 3. CyclicBarrier源码分析(基于JDK1.7.0_40) 52 23.3.1. 3.1 构造函数 52 23.3.2. 3.2 等待函数 53 23.4. 4. CyclicBarrier的使用示例 57 23.4.1. 示例1 57 23.4.2. 示例2 59 24. Blockingqueue有几种形式?各自的编码方式。 72 24.1. Queue接口 72 24.2. BlockingQueue接口 73 24.2.1. ArrayBlockingQueue 74 24.2.2. LinkedBlockingQueue 78 24.2.3. LinkedBlockingDeque(双向并发阻塞队列) 84 24.2.4. PriorityBlockingQueue(优先阻塞队列) 85 24.2.5. 总结一下阻塞队列 90 25. Tomcat 如何管理servlet? 90 26. Servlet生命周期 90 27. 没有缓存,如何实现领券并发操作? 92