java面试的100个基础知识(上班第一天给大家准备的大礼包--Java基础面试题整理)
java面试的100个基础知识(上班第一天给大家准备的大礼包--Java基础面试题整理)接口的意义用三个词就可以概括:规范 扩展 回调.简化性:可扩充性:增加新的子类不影响已经存在的类结构.接口性:多态是超类通过方法签名 向子类提供一个公共接口 由子类来完善或者重写它来实现的.灵活性:
面向对象的三个特征封装 继承 多态.这个应该是人人皆知.有时候也会加上抽象.
多态的好处
允许不同类对象对同一消息做出响应 即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:
可替换性:多态对已存在代码具有可替换性.
可扩充性:增加新的子类不影响已经存在的类结构.
接口性:多态是超类通过方法签名 向子类提供一个公共接口 由子类来完善或者重写它来实现的.
灵活性:
简化性:
接口的意义接口的意义用三个词就可以概括:规范 扩展 回调.
抽象类的意义抽象类的意义可以用三句话来概括:
- 为其他子类提供一个公共的类型
- 封装子类中重复定义的内容
- 定义抽象方法 子类虽然有不同的实现 但是定义时一致的
不可变对象指对象一旦被创建 状态就不能再改变 任何修改都会创建一个新的对象 如 String、integer及其它包装类.不可变对象最大的好处是线程安全.
java 创建对象的几种方式java中提供了以下四种创建对象的方式:
new创建新对象
通过反射机制
采用clone机制
通过序列化机制
前两者都需要显式地调用构造方法. 对于clone机制 需要注意浅拷贝和深拷贝的区别 对于序列化机制需要明确其实现原理 在java中序列化可以通过实现Externalizable或者Serializable来实现.
switch中能否使用string做参数?在JDK 1.7之前 switch只能支持byte short char int或者其对应的包装类以及Enum类型.从JDK 1.7之后switch开始支持String类型.但到目前为止 switch都不支持long类型.
java中==和eqauls()的区别?==是运算符 用于比较两个变量是否相等 对于基本类型而言比较的是变量的值 对于对象类型而言比较的是对象的地址.
equals()是Object类的方法 用于比较两个对象内容是否相等.默认Object类的equals()实现如下:
不难看出此时equals()是比较两个对象的地址 此时直接==比较的的结果一样.对于可能用于集合存储中的对象元素而言 通常需要重写其equals()方法.
& 和 &&的区别基础的概念不能弄混:&是位操作 &&是逻辑运算符.需要记住逻辑运算符具有短路特性 而&不具备短路特性.来看看一下代码执行结果?
final finalize()和finally{}的不同之处三者没有任何相关性 遇到有问着问题的面试官就拖出去砍了吧.final是一个修饰符 用于修饰变量 方法和类.如果 final 修饰变量 意味着该变量的值在初始化后不能被改变.finalize()方法是在对象被回收之前调用的方法 给对象自己最后一个复活的机会.但是该方法由Finalizer线程调用 但调用时机无法保证.finally是一个关键字 与 try和catch一起用于异常的处理 finally{}一定会被执行 在此处我们通常用于资源关闭操作.
final有哪些用法?final也是很多面试喜欢问的地方 但我觉得这个问题很无聊 通常能回答下以下5点就不错了:
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变.如果修饰引用 那么表示引用不可变 引用指向的内容可变.
被final修饰的方法 JVM会尝试将其内联 以提高运行效率
被final修饰的常量 在编译阶段会存入常量池中.
除此之外 编译器对final域要遵守的两个重排序规则更好:
在构造函数内对一个final域的写入 与随后把这个被构造对象的引用赋值给一个引用变量 这两个操作之间不能重排序
初次读一个包含final域的对象的引用 与随后初次读这个final域 这两个操作之间不能重排序.
int和Integer的区别?Integer是int的包装类型 在拆箱和装箱中 二者自动转换.int是基本类型 直接存数值;而integer是对象;用一个引用指向这个对象.由于Integer是一个对象 在JVM中对象需要一定的数据结构进行描述 相比int而言 其占用的内存更大一些.
String s = new String("abc")创建了几个String对象?2个.一个是字符串字面常数 在字符串常量池中;另一个是new出来的字符串对象 在堆中.
String StringBuffer和StringBuilder区别?String是字符串常量 final修饰;StringBuffer字符串变量(线程安全);StringBuilder 字符串变量(线程不安全).此外StringBuilder和StringBuffer实现原理一样 都是基于数组扩容来实现的.
String和StringBuffer的区别?String和StringBuffer主要区别是性能:String是不可变对象 每次对String类型进行操作都等同于产生了一个新的String对象 然后指向新的String对象.所以尽量不要对String进行大量的拼接操作 否则会产生很多临时对象 导致GC开始工作 影响系统性能.
StringBuffer是对象本身操作 而不是产生新的对象 因此在有大量拼接的情况下 我们建议使用StringBuffer(线程安全).
需要注意现在JVM会对String拼接做一定的优化 比如
String s="This is only " "simple" "test";
以上代码在编译阶段会直接被优化成会`String s=“This is only simple test”.
垃圾回收简单的解释一下垃圾回收?
JVM中垃圾回收机制最基本的做法是分代回收.内存中的区域被划分成不同的世代 对象根据其存活的时间被保存在对应世代的区域中.一般的实现是划分成3个世代:年轻 年老和永久代.所有新生成的对象优先放在年轻代的(大对象可能被直接分配在老年代 作为一种分配担保机制) 年轻代按照统计规律被分为三个区:一个Eden区,两个 Survivor区.在年轻代中经历了N次垃圾回收后仍然存活的对象 就会被放到年老代中.因此可以认为年老代中存放的都是一些生命周期较长的对象.
方法区也被称为永久代 用于存储每一个java类的结构信息:比如运行时常量池 字段和方法数据 构造函数和普通方法的字节码内容以及类 实例 接口初始化时需要使用到的特殊方法等数据 根据虚拟机实现不同 GC可以选择对方法区进行回收也可以不回收.
对于不同的世代可以使用不同的垃圾回收算法。比如对由于年轻代存放的对象多是朝生夕死 因此可以采用标记-复制 而对于老年代则可以采用标记-整理/清除.
进程 线程相关 说说进程 线程之间的区别?简而言之 进程是程序运行和资源分配的基本单位 一个程序至少有一个进程 一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元 而多个线程共享内存资源 减少切换次数 从而效率更高.线程是进程的一个实体 是cpu调度和分派的基本单位 是比程序更小的能独立运行的基本单位.同一进程中的多个线程之间可以并发执行.在Linux中 进程也称为Task.
生产者消费者模型的作用是什么?(1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用
(2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约
想了解更多原文链接:https://blog.csdn.net/qq_41701956/article/details/86773940