诺瓦星云一面(java开发)
面试时间30min(开始觉得为撒面的这么快,后来整理面试题的时候才发现是自己面的太差了但是真的忘完了,有没有牛牛可以讲一下如何刷八股吗?##面经#)
1、面向对象的特点?
继承、封装、多态
继承:继承是指使用已存在的类的定义作为基础新建立类的技术,新类的定义可以增加新的数据或新的功能。也可以用父类的功能,但不能选择性地继承父类。
子类拥有父类对象地所有属性和方法(包括私有属性和方法),但是父类中的私有属性和方法子类是无法访问的,只是拥有。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
封装:封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。
多态:一个对象具有多种形态,具体表现为父类的引用指向子类的实例。
多态的特点:对象类和引用类之间具有继承/实现的关系。
引用类型变量发出的方法调用的到底是那个类的方法,必须在程序运行期间才能确定;
多态不能调用只在子类存在但在父类中不存在的方法
如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写 父类的方法则执行的是父类的方法。
2、接口和抽象类?
相同点:
实例化:接口和抽象类都不能直接被实例化,只能被实现或继承(抽象类)
抽象方法:接口和抽象类都包含抽象方法。抽象方法没有方法体,必须在子类或实现类中实现。
区别:
设计目的:接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
继承和实现:一个类只能继承一个类(包括抽象类),因为 Java 不支持多继承。但一个类可以实现多个接口,一个接口也可以继承多个其他接口。
成员变量:接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值。抽象类的成员变量可以有任何修饰符(private, protected, public),可以在子类中被重新定义或赋值。
方法:
- Java 8 之前,接口中的方法默认是 public abstract ,也就是只能有方法声明。自 Java 8 起,可以在接口中定义 default(默认) 方法和 static (静态)方法。 自 Java 9 起,接口可以包含 private 方法。
- 抽象类可以包含抽象方法和非抽象方法。抽象方法没有方法体,必须在子类中实现。非抽象方法有具体实现,可以直接在抽象类中使用或在子类中重写。
3、你用过哪些集合?
集合为三类:list、set以及map
list:
arrayList:数组
LinkedList:双向链表
Set:
hashSet:无序内部是通过hashmap实现的
LinkedHashSet:内部是通过LinkedHashMap来实现的
TreeSet:有序(自平衡二叉树)
Map:
Hashmap:数组加链表(链表是为了解决hash冲突)
hashtable:数组加链表
4、Mysql优化?
5、如何加索引?
6、JVM如何实现线程同步?
方法 优点 缺点 适用场景
使用synchronized关键字 - 简单易用
- 内置的锁机制
- 自动释放锁 - 不可中断
- 无法设置超时时间
- 只能使用一把锁 - 单一资源的同步
- 简单的同步需求
使用ReentrantLock类 - 可重入锁
- 可以实现公平性
- 可以设置超时时间 - 需要手动释放锁
- 代码复杂一些 - 复杂的同步需求
- 需要更灵活的同步控制
使用wait()、notify()和notifyAll()方法 - 线程间协作和通信
- 可以唤醒等待的线程 - 需要手动管理等待和唤醒的顺序
- 只能在同步代码块中使用 - 多个线程间的合作和协调
- 生产者消费者模式
使用CountDownLatch和CyclicBarrier - 线程间同步和等待
- 灵活的等待方式 - CountDownLatch只能使用一次
- CyclicBarrier需要重置后才能再次使用 - 一组线程间的同步和等待
- 多个线程间达到某个状态后再继续执行
7、如何设置线程池?
8、线程池的核心参数?
5个
核心线程池数,最大线程池数,等待队列,拒绝策略,存活时间
9、类加载的过程?
加载->连接->初始化
连接过程:验证->准备->解析
加载:
1. 通过全类名获取定义此类的二进制字节流。
2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构。
3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口。
连接:
验证:
1. 文件格式验证(Class 文件格式检查)
2. 元数据验证(字节码语义检查)
3. 字节码验证(程序语义检查)
4. 符号引用验证(类的正确性检查)
准备:
这时候进行内存分配的仅包括类变量( Class Variables ,即静态变量,被 static 关键字修饰的变量,只与类相关,因此被称为类变量),而不包括实例变量。实例变量会在对象实例化时随着对象一块分配在 Java 堆中。
从概念上讲,类变量所使用的内存都应当在 方法区 中进行分配。不过有一点需要注意的是:JDK 7 之前,HotSpot 使用永久代来实现方法区的时候,实现是完全符合这种逻辑概念的。 而在 JDK 7 及之后,HotSpot 已经把原本放在永久代的字符串常量池、静态变量等移动到堆中,这个时候类变量则会随着 Class 对象一起存放在 Java 堆中。相关阅读:《深入理解 Java 虚拟机(第 3 版)》勘误#75open in new window
这里所设置的初始值"通常情况"下是数据类型默认的零值(如 0、0L、null、false 等),比如我们定义了public static int value=111 ,那么 value 变量在准备阶段的初始值就是 0 而不是 111(初始化阶段才会赋值)。特殊情况:比如给 value 变量加上了 final 关键字public static final int value=111 ,那么准备阶段 value 的值就被赋值为 111。
解析:
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。
初始化:
初始化阶段是执行初始化方法 <clinit> ()方法的过程,是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。
10、TCP协议?
11、在项目中角色?
12、你喜欢看技术博客吗?
13、你如何处理压力大的情况?
14、反问(面试有哪些不足,如果能入职的话,将是那种工作方式?下一次的面试时间?)
1、面向对象的特点?
继承、封装、多态
继承:继承是指使用已存在的类的定义作为基础新建立类的技术,新类的定义可以增加新的数据或新的功能。也可以用父类的功能,但不能选择性地继承父类。
子类拥有父类对象地所有属性和方法(包括私有属性和方法),但是父类中的私有属性和方法子类是无法访问的,只是拥有。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
封装:封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。
多态:一个对象具有多种形态,具体表现为父类的引用指向子类的实例。
多态的特点:对象类和引用类之间具有继承/实现的关系。
引用类型变量发出的方法调用的到底是那个类的方法,必须在程序运行期间才能确定;
多态不能调用只在子类存在但在父类中不存在的方法
如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写 父类的方法则执行的是父类的方法。
2、接口和抽象类?
相同点:
实例化:接口和抽象类都不能直接被实例化,只能被实现或继承(抽象类)
抽象方法:接口和抽象类都包含抽象方法。抽象方法没有方法体,必须在子类或实现类中实现。
区别:
设计目的:接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
继承和实现:一个类只能继承一个类(包括抽象类),因为 Java 不支持多继承。但一个类可以实现多个接口,一个接口也可以继承多个其他接口。
成员变量:接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值。抽象类的成员变量可以有任何修饰符(private, protected, public),可以在子类中被重新定义或赋值。
方法:
- Java 8 之前,接口中的方法默认是 public abstract ,也就是只能有方法声明。自 Java 8 起,可以在接口中定义 default(默认) 方法和 static (静态)方法。 自 Java 9 起,接口可以包含 private 方法。
- 抽象类可以包含抽象方法和非抽象方法。抽象方法没有方法体,必须在子类中实现。非抽象方法有具体实现,可以直接在抽象类中使用或在子类中重写。
3、你用过哪些集合?
集合为三类:list、set以及map
list:
arrayList:数组
LinkedList:双向链表
Set:
hashSet:无序内部是通过hashmap实现的
LinkedHashSet:内部是通过LinkedHashMap来实现的
TreeSet:有序(自平衡二叉树)
Map:
Hashmap:数组加链表(链表是为了解决hash冲突)
hashtable:数组加链表
4、Mysql优化?
5、如何加索引?
6、JVM如何实现线程同步?
方法 优点 缺点 适用场景
使用synchronized关键字 - 简单易用
- 内置的锁机制
- 自动释放锁 - 不可中断
- 无法设置超时时间
- 只能使用一把锁 - 单一资源的同步
- 简单的同步需求
使用ReentrantLock类 - 可重入锁
- 可以实现公平性
- 可以设置超时时间 - 需要手动释放锁
- 代码复杂一些 - 复杂的同步需求
- 需要更灵活的同步控制
使用wait()、notify()和notifyAll()方法 - 线程间协作和通信
- 可以唤醒等待的线程 - 需要手动管理等待和唤醒的顺序
- 只能在同步代码块中使用 - 多个线程间的合作和协调
- 生产者消费者模式
使用CountDownLatch和CyclicBarrier - 线程间同步和等待
- 灵活的等待方式 - CountDownLatch只能使用一次
- CyclicBarrier需要重置后才能再次使用 - 一组线程间的同步和等待
- 多个线程间达到某个状态后再继续执行
7、如何设置线程池?
8、线程池的核心参数?
5个
核心线程池数,最大线程池数,等待队列,拒绝策略,存活时间
9、类加载的过程?
加载->连接->初始化
连接过程:验证->准备->解析
加载:
1. 通过全类名获取定义此类的二进制字节流。
2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构。
3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口。
连接:
验证:
1. 文件格式验证(Class 文件格式检查)
2. 元数据验证(字节码语义检查)
3. 字节码验证(程序语义检查)
4. 符号引用验证(类的正确性检查)
准备:
这时候进行内存分配的仅包括类变量( Class Variables ,即静态变量,被 static 关键字修饰的变量,只与类相关,因此被称为类变量),而不包括实例变量。实例变量会在对象实例化时随着对象一块分配在 Java 堆中。
从概念上讲,类变量所使用的内存都应当在 方法区 中进行分配。不过有一点需要注意的是:JDK 7 之前,HotSpot 使用永久代来实现方法区的时候,实现是完全符合这种逻辑概念的。 而在 JDK 7 及之后,HotSpot 已经把原本放在永久代的字符串常量池、静态变量等移动到堆中,这个时候类变量则会随着 Class 对象一起存放在 Java 堆中。相关阅读:《深入理解 Java 虚拟机(第 3 版)》勘误#75open in new window
这里所设置的初始值"通常情况"下是数据类型默认的零值(如 0、0L、null、false 等),比如我们定义了public static int value=111 ,那么 value 变量在准备阶段的初始值就是 0 而不是 111(初始化阶段才会赋值)。特殊情况:比如给 value 变量加上了 final 关键字public static final int value=111 ,那么准备阶段 value 的值就被赋值为 111。
解析:
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。
初始化:
初始化阶段是执行初始化方法 <clinit> ()方法的过程,是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。
10、TCP协议?
11、在项目中角色?
12、你喜欢看技术博客吗?
13、你如何处理压力大的情况?
14、反问(面试有哪些不足,如果能入职的话,将是那种工作方式?下一次的面试时间?)
全部评论
面试过了吗兄弟
跟我问的差不多
佬你现在状态是啥
有没有人有结果,到现在了还是一面进行中😓😓😓
相关推荐