Java基础知识

面试题汇总Java语言基础篇

JAVA面试题

内存模型

Java基础知识

Object类所有方法详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlo5a9kZ-1599014901709)(https://i.loli.net/2020/03/10/gXTzZqK16Ju4VGc.png)]

反射与注解

  • getClass获取的类的类型。
  • getDeclaredField获取声明字段
  • 调用方法

正则表达式

i++++i的真正区别

在java的执行过程中,i++和++i都直接对i进行了i=i+1的操作,但是不同的是i++得到的是i未进行加法操作的前的值的副本,而++i直接得到计算后的值

面向对象的三大特性

多态

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性

构造器可以被重载,不能被重写

“构造器就是构造方法,能够被重载(同类中不同参数列表的构造器),不能够被重写(子类使用super方法可以调用)。不能说能被继承,因为能够调用,但是不能重写。”

java中==和equals和hashCode的区别

  • 对于==,如果作用于基本数据类型,则直接比较其存储的“值”是否相等,如果作用于引用类型的变量,则比较的是所指向的对象的地址。
  • 对于 equals 方法,注意:equals不能作用于基本数据类型,如果没有对equals进行重写,则比较的是 引用类所指向的地址。如果重写了,比较的就是对象的内容
  • equals相等的两个对象,hashCode一定相等,equals不相等的两个对象,却并不能证明他们的hashCode不相等。equals方法不相等的两个对象,hashCode有可能相等

基础数据类型和引用类型的区别

基本数据类型:byte、short、int、long、float、double、char、boolean
引用类型:类(class)、接口(interface)、数组(array)
基本类型保存的值,引用类型保存了是对象的地址,所有基本类型赋值是按值传递(拷贝赋值),引用类型赋值是按引用传递。

int与integer的区别

int是基本数据类型, Integer是包装类 。int的速度快,Integer的速度慢。int放在栈中,Integer放在堆中。int初始值为0,Integer初始值为null。

抽象类的意义

cookie session和token

接口和抽象类的区别

从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范

  • 抽象类可以提供成员方法的具体实现,而接口只存在用public abstract 修饰的没有方法体的方法
  • 抽象类中的成员变量可以是各种类型的,而接口的成员变量只能是public static final类型
  • 抽象类中可以有静态代码块与静态方法,而接口没有
  • 一个类可以实现多个接口,一个类只能继承一个抽象类
  • 抽象类有默认的方法实现(抽象类不能被实例化),接口没有。

成员内部类:

定义于一个类内部,依附于外部类存在

  • 可访问外部类所有成员变量和成员方法,包括 private 和 static
  • 外部类访问内部类需通过内部类对象的引用。
  • 修饰符 private, protected, public。

局部内部类:

定义于方法或作用域内

  • 不能有修饰符。
  • 只能访问 final 局部变量

匿名内部类:

在实现父类或接口时生成对象,没有构造器

  • 不能有修饰符。
  • 只能访问 final 局部变量

静态内部类:

定义于外部类,有static关键字,不依附于外部类。

内部类和嵌套类的区别

在类的类部可以定义类,叫做内部类。如果这个内部类被static修饰,此时内部的类叫做嵌套类。

  • 内部类可以访问所在类的所有成员,即使该成员是private的。而static嵌套类则不得访问所在类的静态成员
  • 内部类区别于嵌套类,嵌套类不依赖于外部类,可以单独被实例化,但是内部类的实例化必须有外部类的实例;
  • 内部类的实例化必须要有外部类的实例,通过外部类实例点new的方式创建内部类实例;
  • 内部类好像可以屏蔽一些细节,外面的类看不到这些细节。同时内部类实现一些接口我继承一些类从而具有一定的功能,通过这些功能完成对外部类的数据进行操作,而且,内部类的这些功能,外面的内有看不到,这样可以避免一些特定的方法或实现被其他代码调用;
  • 内部类中可以通过外部类点this表示外部类的this。入Outer.this,这就是对外部类的引用;
  • 现在看来内部类就是为了操作外部类的数据而存在的吧,内部类封装了一些特定但是很私有的一些功能。
JDBC连接流程
  • 加载驱动类,注册驱动
    Class.forName(“com.mysql.cj.jdbc.Driver”);
    这个是Java反射中的一种写法,作用是获取当前提供路径的这个类的字节码文件(.class)。
    得到这个字节码文件之后可以进行创建类、获取方法、属性、修饰符…
  • 通过DriverManager,使用url,用户名和密码建立连接(Connection);
  • 通过Connection,使用sql语句打开Statement对象;
  • 执行语句,将结果返回resultSet
  • 对结果resultSet进行处理;
  • 释放资源

能否创建一个包含可变对象的不可变对象?

谈谈对java多态的理解

重写和重载的不同:

  • 方法重写要求参数列表、返回类必须一致,而方法重载要求参数列表必须不一致。
  • 方法重写只能用于子类重写父类的方法,方法重载用于同一个类中的所有方法。
  • 方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
  • 父类的一个方法只能被子类重写一次,而一个方法可以在所有的类中可以被重载多次。
  • 重载是编译时多态,重写是运行时多态
  • 父类方法不是接口和虚函数,子类重写了父类这个方法,编译的时候会把父的方法删掉直接将子类的方法贴在那,这叫重定义
  • 方法的重写 Overriding 和重载 Overloading 是Java多态性的不同表现。
  • 重写 Overriding 是父类与子类之间多态性的一种表现
  • 重载 Overloading 是一个类中多态性的一种表现

是否可以在static环境中访问非static变量?

因为静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员。

”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

static表示静态的意义,它可以修饰一个变量,一个方法,被其修饰的变量被称为类变量,被其修饰的方法成为类方法,其随着类的加载而被加载。
无法重写被private修饰的方法,因为被private修饰的父类方法在子类中是不可见的。
static修饰的方法是静态绑定的,而方法覆盖是为了实现多态,是动态绑定,所以static修饰的方法不需要被覆盖

重写和重载的不同:

  • 方法重写要求参数列表、返回类必须一致,而方法重载要求参数列表必须不一致。
  • 方法重写只能用于子类重写父类的方法,方法重载用于同一个类中的所有方法。
  • 方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
  • 父类的一个方法只能被子类重写一次,而一个方法可以在所有的类中可以被重载多次。
  • 重载是编译时多态,重写是运行时多态
  • 父类方法不是接口和虚函数,子类重写了父类这个方法,编译的时候会把父的方法删掉直接将子类的方法贴在那,这叫重定义
  • 方法的重写 Overriding 和重载 Overloading 是Java多态性的不同表现。
  • 重写 Overriding 是父类与子类之间多态性的一种表现
  • 重载 Overloading 是一个类中多态性的一种表现

是否可以在static环境中访问非static变量?

因为静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员。

”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

static表示静态的意义,它可以修饰一个变量,一个方法,被其修饰的变量被称为类变量,被其修饰的方法成为类方法,其随着类的加载而被加载。
无法重写被private修饰的方法,因为被private修饰的父类方法在子类中是不可见的。
static修饰的方法是静态绑定的,而方法覆盖是为了实现多态,是动态绑定,所以static修饰的方法不需要被覆盖

请简述一下线程的sleep()方法和yield()方法有什么区别?

  • sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会
  • 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态
  • sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常

String、StringBuffer、StringBuilder区别

  • stringbuffer是线程安全的stringbuilder是非线程安全的 底层实现上的话,StringBuffer其实就是比StringBuilder多了Synchronized修饰符
  • 运行速度stringbuilder > StringBuffer > string
  • string不可变,其他可变

throw和throws的区别

  • Throw用于方法内部,Throws用于方法声明上
  • Throw后跟异常对象,Throws后跟异常类型
  • Throw后只能跟一个异常对象,Throws后可以一次声明多种异常类型

反射的原理,反射创建类实例的三种方式是什么。

反射中ClassLoader.loadClass和class.ForName区别

  • forName()会初始化类,将.class文件加载到jvm中,还会执行类中的static块,还会执行给静态变量赋值的静态方法
  • loadClass()只将class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块

java当中的四种引用

深拷贝和浅拷贝的区别是什么?

对象要克隆需要实现 Cloneable 接口。

浅拷贝只复制了对象本身,使得对象内部的引用可能指向同一个对象;

深拷贝将拷贝对象内部引用的对象也都复制一遍

静态代理和动态代理的区别,什么场景使用?

一个非常显著的优点是动态代理可以在自定义调用处理器统一处理委托类的方法,而不必一个个编写。

而动态代理有一个缺点,那就是只能代理基于接口的类,而无法代理没有接口的委托类

静态代理类优缺点
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

动态代理优点:
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强

所以基本上可以总结出 Spring AOP 中的代理使用逻辑了:如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理实现 AOP;如果目标对象没有实现了接口,则采用 CGLIB 库,Spring 会自动在 JDK 动态代理和 CGLIB 动态代理之间转换。

说说你对Java反射的理解

先讲反射机制,反射就是程序运行期间JVM会对任意一个类洞悉它的属性和方法,对任意一个对象都能够访问它的属性和方法。依靠此机制,可以动态的创建一个类的对象和调用对象的方法。其次就是反射相关的API,只讲一些常用的,比如获取一个Class对象。Class.forName(完整类名)。通过Class对象获取类的构造方法,class.getConstructor。根据class对象获取类的方法,getMethod和getMethods。使用class对象创建一个对象,class.newInstance等。最后可以说一下反射的优点和缺点,优点就是增加灵活性,可以在运行时动态获取对象实例。缺点是反射的效率很低,而且会破坏封装,通过反射可以访问类的私有方法,不安全。

分布式全局唯一ID生成策略

  • UUID本地生成,没有网络消耗。不易存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
  • 雪花算法,雪花ID生成的是一个64位的二进制正整数,然后转换成10进制的数。64位二进制数由如下部分组成:简单高效,生成速度快。
    时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序递增。灵活度高,可以根据业务需求,调整bit位的划分,满足不同的需求。缺点依赖机器的时钟,如果服务器时钟回拨,会导致重复ID生成。在分布式环境上,每个服务器的时钟不可能完全同步,有时会出现不是全局递增的情况
  • 数据库自增ID机制,主要思路是采用数据库自增ID + replace_into实现唯一ID的获取。简单。充分借助数据库的自增ID机制,可靠性高,生成有序的ID。缺点:ID生成依赖数据库单机的读写性能。依赖数据库,当数据库异常时整个系统不可用。

什么是Synchronized

sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.
在修饰代码块的时候需要一个reference对象作为锁的对象.
在修饰方法的时候默认是当前对象作为锁的对象.
在修饰类时候默认是当前类的Class对象作为锁的对象.

synchronized会在进入同步块的前后分别形成monitorenter和monitorexit字节码指令.在执行monitorenter指令时会尝试获取对象的锁,如果此没对象没有被锁,或者此对象已经被当前线程锁住,那么锁的计数器加一,每当monitorexit被锁的对象的计数器减一.直到为0就释放该对象的锁.由此synchronized是可重入的,不会出现自己把自己锁死.

什么是ReentrantLock

以对象的方式来操作对象锁.相对于sychronized需要在finally中去释放锁,需要手动释放。

synchronized 和 ReentrantLock有什么区别

除了synchronized的功能,多了三个高级功能.
等待可中断,公平锁,绑定多个Condition.

  • 等待可中断:在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. tryLock(long timeout, TimeUnit unit)
  • 公平锁:按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁. new RenentrantLock(boolean fair)
  • 绑定多个Condition:
    通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();

JAVA两个字符串如何比较大小

compareTo() 的返回值是int, 它是先比较对应字符的大小(ASCII码顺序)

JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。

string和stringbuff区别

反射与注解

  • getClass获取的类的类型。
  • getDeclaredField获取声明字段
  • 调用方法
JDBC连接流程
  • 加载驱动类,注册驱动
    Class.forName(“com.mysql.cj.jdbc.Driver”);
    这个是Java反射中的一种写法,作用是获取当前提供路径的这个类的字节码文件(.class)。
    得到这个字节码文件之后可以进行创建类、获取方法、属性、修饰符…
  • 通过DriverManager,使用url,用户名和密码建立连接(Connection);
  • 通过Connection,使用sql语句打开Statement对象;
  • 执行语句,将结果返回resultSet
  • 对结果resultSet进行处理;
  • 释放资源

IO要注意的地方

  • 要关闭
  • 捕获异常
  • 有对象的时候要序列号,
  • 还要解编码

JWT和Oauth2的区别

OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app)

JWT是用在前后端分离, 需要简单的对后台API进行保护时使用.(前后端分离无session, 频繁传用户密码不安全)

OAuth2是一个相对复杂的协议, 有4种授权模式, 其中的access code模式在实现时可以使用jwt才生成code, 也可以不用. 它们之间没有必然的联系.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值