java面试(更新中)

目录

javaSE

1.java基础数据类型

2.变量和方法 

成员变量和局部变量的区别??声明位置、作用域、生命周期、默认值

3.类和对象

面向对象和面向过程的区别??

多态的理解:  

 编译时多态与运行时多态的区别。 P5

 接口和抽象类的区别??

访问权限修饰符:

static 和 final的区别:

重载和重写:

浅拷贝和深拷贝:(浅拷贝复制的是对象的引用,而深拷贝是复制对象的引用的对象)

this 和 super

方法区,堆区,栈区

String

String、StringBuffer、StringBuilder的区别

String常见的操作方法

字符串常量池概念

new String("abc")和String a = "abc"的区别

Object

“==”和equals的区别

hashCode()和equals()的关系

异常

throws用在方法声明上,throw用在手动抛出异常中。

编译异常(受检异常)必须被全部声明(throws),否则编译器会发出错误提醒。

try-catch-finally

子类重写父类带有throws的方法时

异常与线程

Exception 和 Error 有什么区别?

泛型

泛型的背景

反射

反射过程

反射的应用场景


javaSE

java语言特点:面向对象(封装,继承,多态)、平台无关性--》一次编写,到处执行(jvm实现,解释型语言),支持多线程。

jvm + 核心类库 --》jre  +   开发工具---》jdk

字节码文件由十六进制值组成,jvm以两个为一组,即以字节为单位。

switch不支持  long型数据

访问修饰符 private,default(默认),protected,public的区别?    |||default和protected不能修饰类。

static静态方法不可以引用非静态资源。static变量会被多个类的实例共享。

1.java基础数据类型

基本数据类型直接存储数据值,在栈上分配内存;而包装类型是对象动态分配内存,在堆上创建。

2.变量和方法 

成员变量和局部变量的区别??声明位置、作用域、生命周期、默认值

**默认值 

成员变量: 如果不显式初始化,会有默认值(例如,整数默认为 0 ,对象引⽤默认为 null 等)。
局部变量: 不会⾃动初始化,必须在使⽤之前显式初始化。

3.类和对象

面向对象和面向过程的区别??
多态的理解:  
因为⼦类其实是⼀种特殊的⽗类,因此 Java 允许把⼀个⼦类对象直接赋给⼀个⽗类引⽤变量,⽆须任何类型转换, 或者被称为向上转型,向上转型由系统⾃动完成。
当把⼀个⼦类对象直接赋给⽗类引⽤变量时,例如 BaseClass obj = new SubClass(); ,这个 obj 引⽤变量的 编译时类型是 BaseClass ,⽽运⾏时类型是 SubClass ,当运⾏时调⽤该引⽤变量的⽅法时,其⽅法⾏为总是表 现出⼦类⽅法的⾏为特征,⽽不是⽗类⽅法的⾏为特征,这就可能出现:相同类型的变量、调⽤同⼀个⽅法时呈现 出多种不同的⾏为特征,这就是多态。

 !!!注

运行时是后者的类型LinkedList为什么,list会报错,如下

List<Integer> list = new LinkedList<>();
list.addFirst(1);

在这种情况下,虽然list的运行时类型是LinkedList,但由于编译时类型是List,编译器只能根据List接口中定义的方法来进行类型检查,因此不能直接调用LinkedList特有的方法。

 编译时多态与运行时多态的区别。 P5
 接口和抽象类的区别??

构造方法不能重写。(子父类的构造方法名不可能相同,重写要求方法名相同)

访问权限修饰符:
    在 Java 中,访问权限通过访问修饰符来控制。主要的访问修饰符有四个: public protected default (默 认修饰符)和 private 。这些修饰符可以⽤于类、变量、⽅法和构造⽅法。
        修饰符 public 表示对所有类可⻅。⼀个类如果被声明为 public ,那么它可以被其他任何类访问。
        修饰符 protected 表示对同⼀包内的类和所有⼦类可⻅。⼦类可以访问⽗类中声明为 protected 的成员, ⽽不管⼦类与⽗类是否在同⼀包中。
        如果没有使⽤任何访问修饰符(即没有写 public protected private ),则默认为包级别访问。这意 味着只有同⼀包中的类可以访问。
        修饰符 private 表示对同⼀类内可⻅。私有成员只能在声明它们的类中访问。

static关键字:静态,不需实例化。

static 和 final的区别:
        当 final ⽤于修饰变量、⽅法或类时,表示它是不可变的。对于变量,⼀旦赋值后就不能再修改;对于⽅ 法,表示⽅法不能被⼦类重写;对于类,表示类不能被继承。
重载和重写:
 重载是在同⼀个类中定义多个⽅法,⽅法名相同但参数列表不同。
 重写是在⼦类中重新定义⽗类中已有的⽅法,⽅法名和参数列表必须相同。
 重载与返回类型和访问修饰符⽆关,⽽重写要求⽅法签名相同。
 重载是编译时多态,⽽重写是运⾏时多态。
浅拷贝和深拷贝:(浅拷贝复制的是对象的引用,而深拷贝是复制对象的引用的对象)
浅拷⻉复制对象,包括对象的引⽤,两者共享引⽤对象。
深拷⻉复制对象及其引⽤的对象,两者不共享引⽤对象,即引⽤对象也会被复制。
Java 中,浅拷⻉通常通过 clone ⽅法实现,深拷⻉可以通过⼿动实现 clone ⽅法、序列化和反序列化,或 者使⽤第三⽅库来实现。
this 和 super
this 可以作为当前对象的引⽤,但是 super 却不可以作为⽗类对象的引⽤
方法区,堆区,栈区
方法区存放静态不变的资源,如class文件
栈区存放引用和方法
堆区存放new 出来的对象
String
Java 中⽤双引号括起来的字符串,如: "abc" "def" ,都是直接存储在 ⽅法区 字符串常量池 当中的。
String底层用的什么?
JDK1.9 以后,底层是 byte 类型的数组,之前是char数组。
String、StringBuffer、StringBuilder的区别
String 不可变  StringBuffer 可变,线程安全 StringBuilder 可变,线程不安全
String常见的操作方法
字符串常量池概念
Java 中,字符串是不可变的,这就意味着⼀旦创建了⼀个字符串对象,它的值就不能被修改。为了提⾼性能和减少内存占⽤,Java 使⽤了字符串常量池的概念。
当程序中创建字符串常量时,这些字符串常量会被存储在字符串常量池中。如果后续的代码中创建了相同内容的字 符串常量,Java 不会再创建新的对象,⽽是直接引⽤已经存在的字符串常量。这就意味着多个引⽤可以指向相同的字符串。
new String("abc")String a = "abc"的区别

???

Object

“==”和equals的区别
hashCode()equals()的关系

如果两个对象相等,则它们必须有相同的哈希码。
如果两个对象有相同的哈希码,则它们未必相等。
equals默认比较引用,要比较内容需要自己重写。

异常

Java的异常都是派⽣于Throwable类的⼀个实例,所有的异常都是由Throwable继承⽽来的

throws用在方法声明上,throw用在手动抛出异常中。
编译异常(受检异常)必须被全部声明(throws),否则编译器会发出错误提醒。
try-catch-finally
finally ⼀般⽤来关闭所占⽤的资源。如果代码抛出异常,就会终⽌剩余代码的处理,并且退出这个⽅法。 这样可能会导致⼀些程序占⽤的系统并不能被正确的释放。
子类重写父类带有throws的方法时
其声明的异常范围必须要在⽗类的⽀持范围内,即范围不能⽐⽗类⼤。 只能保持范围不变或者更精确,不能变⼤。如果⽗类没有throws ,那么⼦类也不能有 throws ,受检异常必须在⼦类内部捕获处理。
异常与线程
Java 中的异常是线程独⽴的,线程的问题应该由线程⾃⼰来解决,⽽不要委托到外部,
也不会直接影响到其它线程的执⾏
Exception Error 有什么区别?

泛型

泛型的背景

反射

反射过程
反射的基本步骤包括获取 Class 对象、获取类的信息(构造函数、⽅法、字段等),然后通过
Constructor Method Field 等类的实例进⾏具体的操作。
反射的应用场景
Spring/Spring Boot MyBatis 等等框架中都⼤量使⽤了反射机制。 这些框架中也⼤量使⽤了动态代理,⽽动态代 理的实现也依赖反射。
Spring 框架就是通过反射和注解来实现依赖注⼊

集合

Collection

list set queue

Map

概述

所有的集合都位于 java.util 包下, Java 集合的基本接⼝是 Collection 接⼝和 Map 接⼝,所有的实现类都是这两个接⼝派⽣出来的。
Collection ⼀次存⼀个元素,是单列集合, Map ⼀次存⼀对元素,是双列集合。 Map 存储的⼀对元素:键 值,键 (key )与值 (value) 间有对应 ( 映射 ) 关系。

Hash 和 tree 区别

  • 哈希表适合快速查找,适用于需要快速存取数据的场景。
  • 树适合维护有序数据、支持范围查找、以及需要顺序遍历数据的场景

集合框架图

集合框架底层的数据结构:

集合框架底层使用了什么数据结构

线程安全不安全

List集合

ArrayList 和 Array 的区别?
ArrayList 和 LinkedList 的区别
ArrayList扩容机制

Set 集合

不同Set区别

LIst、Map 和 Set 区别

Queue集合

Map集合

map接口的实现类
hashmap 和 hashtable 的区别
hashmap 和 hashset 的区别

多线程

进程线程基础

什么是进程和线程

线程的创建方式

继承Thread类

实现runnable接口

使用Executor框架 (线程池)

线程的生命周期
run 和 start 的区别?

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值