Java 基础技术
文章平均质量分 58
最常见的 Java 基础技术面试题,带你三分钟搞懂,面试再也不虚。
喵呜刷题
使用 Vx [喵呜刷题],来来来,我们一起组队刷题!
展开
-
你们分库分表使用什么中间件,有什么优点和缺点?
确实之前用的还比较多一些,因为 SQL 语法支持也比较多,没有太多限制,而且目前推出到了 2.0 版本,支持分库分表、读写分离、分布式 id 生成、柔性事务(最大努力送达型事务、TCC 事务)。,运维成本低,不需要代理层的二次转发请求,性能很高,但是如果遇到升级啥的需要各个系统都重新升级版本再发布,各个系统都需要耦合 sharding-jdbc 的依赖;,自己运维一套中间件,运维成本高,但是好处在于对于各个项目是透明的,如果遇到升级之类的都是自己中间件那里搞就行了。如有好的面试知识或技巧期待您的共享!原创 2023-09-05 07:13:30 · 866 阅读 · 0 评论 -
Java中四种引用的概念及应用场景
Java中存在四种引用机制,分别是强引用,软引用,弱引用,虚引用原创 2022-04-27 10:30:24 · 472 阅读 · 0 评论 -
谈谈对反射和动态代理的理解?
什么是反射机制在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。原创 2022-04-27 11:02:22 · 271 阅读 · 0 评论 -
Object类有哪些方法?
Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。原创 2022-04-27 10:30:14 · 7218 阅读 · 0 评论 -
谈谈对内部类的理解?
java中的内部类可以分为普通内部类(成员内部类),静态内部类,局部内部类和匿名内部类。原创 2022-04-27 10:30:04 · 252 阅读 · 0 评论 -
如何初始化final所修饰的成员变量?
final 修饰的成员变量必须的手动初始化原创 2022-04-27 10:29:57 · 311 阅读 · 0 评论 -
Java中变量的初始化顺序是怎样的?
java 的初始化顺序是首先会初始化父类,因为没有父类子类也无从谈起。第一步初始化父类的 静态变量 和 静态代码块初始化子类的 静态变量 和 静态代码块顺序初始化父类普通变量 或者 父类普通变量初始化块 ,然后是构造函数顺序初始化子类普通变量 或者 子类普通变量初始化块 ,然后是构造函数原创 2022-04-27 10:29:48 · 884 阅读 · 0 评论 -
说说你理解的finalize
调用GC并不保证GC实际执行finalize抛出的未捕获异常只会导致该对象的finalize执行退出。用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。原创 2022-04-26 09:00:06 · 261 阅读 · 0 评论 -
Lambda表达式的作用和基本语法
Lambda表达式是Java8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”,即Lambda允许你通过表达式来代替功能接口,即可使用更少的代码来实现同样的功能。原创 2022-04-26 08:59:53 · 413 阅读 · 1 评论 -
谈谈对static关键字的理解?
静态变量和实例变量的概念静态变量:static修饰的成员变量叫做静态变量(也叫做类变量),静态变量是属于这个类,而不是属于是对象。实例变量:没有被static修饰的成员变量叫做实例变量,实例变量是属于这个类的实例对象。static关键字的特性原创 2022-04-26 08:59:41 · 262 阅读 · 0 评论 -
基本数据类型之间是怎么转换的?
Java语言中基本数据类型之间的转换方式:自动类型转换和强制类型转换自动类型转换自动转换,即为当不同级别的数据在一起参加运算时,java将自动的将较低级别的数据转换为较高类型的数据类型。如下所示的转换在java中是允许的。(byte、short、char)--->int--->long--->float--->double原创 2022-04-26 08:59:27 · 92 阅读 · 1 评论 -
说说Cookie和Session的区别
cookie数据存放在客户的浏览器上,session数据放在服务器上.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。设置cookie时间可以使cookie过期。但是使用session-destory,我们将会销毁会话。session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。原创 2022-04-26 08:59:18 · 147 阅读 · 0 评论 -
说说静态变量和实例变量的区别?
可见范围成员变量只能被对象所调用 。静态变量可以被对象调用,也可以被类名调用。静态变量前要加static关键字,而实例变量前则不加。存储不同成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据生命周期不同成员变量与对象共存亡,随着对象创建而存在,随着对象被回收而释放静态变量与类共存亡,随着类的加载而存在,随着类的消失而消失(类不消失一直存在(不考虑回收机制),生命周期长)原创 2022-04-26 08:59:05 · 194 阅读 · 0 评论 -
如何获取父类的名称
很多人的第一反应一定是super.getClass().getName();但是这样其实是不对的,由于getClass()在Object类中定义成了final,子类不能覆盖该方法,调用super.getClass().getName()方法,等效于调用getClass().getName()方法,所以,super.getClass().getName()方法返回的应该是当前类的名称。正确方式:getClass().getSuperClass().原创 2022-04-26 08:58:56 · 311 阅读 · 0 评论 -
深拷贝和浅拷贝区别是什么?
浅拷贝对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。深拷贝对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。原创 2022-04-26 08:58:44 · 97 阅读 · 0 评论 -
Java的SPI机制
SPI 全称为 Service Provider Interface,是一种服务发现机制;SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。原创 2022-04-26 08:58:31 · 222 阅读 · 0 评论 -
说说 NIO 是如何实现的?
NIO也叫Non-Blocking IO 是同步非阻塞的IO模型。Java中的NIO 是new IO的意思。其实是NIO加上IO多路复用技术。普通的NIO是线程轮询查看一个IO缓冲区是否就绪,而Java中的new IO指的是线程轮询地去查看一堆IO缓冲区中哪些就绪,这是一种IO多路复用的思想。IO多路复用模型中,将检查IO数据是否就绪的任务,交给系统级别的select或epoll模型,由系统进行监控,减轻用户线程负担。原创 2022-04-25 10:29:09 · 486 阅读 · 1 评论 -
说说BIO、NIO、AIO 的区别?
Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。其中包括:文件读写、标准设备输出等。BIO、NIO、AIO之间的区别就在于这些操作是同步还是异步,阻塞还是非阻塞。原创 2022-04-25 10:28:58 · 188 阅读 · 0 评论 -
说说Error 和 Exception 有什么区别?
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。原创 2022-04-25 10:28:47 · 669 阅读 · 1 评论 -
判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
两个对象 equals的时候,hashCode必须相等,但hashCode相等,对象不一定equals。原创 2022-04-25 10:28:40 · 536 阅读 · 1 评论 -
说说什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。原创 2022-04-25 10:28:26 · 271 阅读 · 1 评论 -
Java如何检测死锁?
死锁的四个必要条件:1)互斥条件:进程对所分配到的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。2)请求和保持条件:进程已经获得了至少一个资源,但又对其他资源发出请求,而该资源已被其他进程占有,此时该进程的请求被阻塞,但又对自己获得的资源保持不放。3)不可剥夺条件:进程已获得的资源在未使用完毕之前,不可被其他进程强行剥夺,只能由自己释放。4)环路等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被原创 2022-04-25 10:28:16 · 660 阅读 · 0 评论 -
是否可以从一个静态方法内部发出对非静态方法的调用?
区分两种情况,发出调用时是否显示创建了对象实例。1)没有显示创建对象实例:不可以发起调用,非静态方法只能被对象所调用,静态方法可以通过对象调用,也可以通过类名调用,所以静态方法被调用时,可能还没有创建任何实例对象。因此通过静态方法内部发出对非静态方法的调用,此时可能无法知道非静态方法属于哪个对象。2)显示创建对象实例:可以发起调用,在静态方法中显示的创建对象实例,则可以正常的调用。原创 2022-04-26 08:58:17 · 515 阅读 · 0 评论 -
说说Java异常的续承层次结构及关系
在Java中,异常分为受检查的异常,与运行时异常.两者都在异常类层次结构中.下面的图展示了Java异常类的继承关系.原创 2022-04-25 10:28:00 · 981 阅读 · 0 评论 -
说说Java访问权限修饰符
Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符(默认)。原创 2022-04-25 10:27:45 · 332 阅读 · 0 评论 -
说说final, finally, finalize的区别
final修饰属性,方法,类;分别表示属性不可变,方法不可覆盖,类不可继承finally是异常中的关键字,始终要执行的代码放在finally块中finalize是Object的一个方法,是垃圾回收机制,重写此方法可以回收其他资源,如文件关闭。JVM不保证此方法总被调用原创 2022-04-25 10:27:33 · 105 阅读 · 0 评论 -
说说你理解的TreeMap
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。TreeMap 实现了Cloneable接口,意味着它能被克隆。TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。原创 2022-04-25 10:27:18 · 508 阅读 · 0 评论 -
说说什么是序列化,如何实现序列化
序列化机制(包括序列化和反序列化)的本质是用流将对象读到内存和写入外存。序列化机制的意义就是将对象脱离程序运行独立存在。通过网路或跨平台传输对象,传递的参数与返回值都实现序列化机制。实现序列化需要实现Serializable或Externalizable接口,如果某个成员变量是引用数据类型,那么要求该引用类也是可序列化的。如果类中每个成员变量不想被序列化,可以用transient关键字修饰。原创 2022-04-24 15:34:01 · 1312 阅读 · 0 评论 -
说说什么是反射
Java反射是在运行时动态的获取类的信息,其中包括类名、方法等。Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类。在运行时构造任意一个类的对象。在运行时判断任意一个类所具有的成员变量和方法。在运行时调用任意一个对象的方法。原创 2022-04-24 15:33:28 · 504 阅读 · 0 评论 -
使用final修饰的变量是引用不能变,还是引用的对象不能变?
是引用不能变,即对象的指向不能变,但引用的对象即引用里的值是可以变得,因为它又没有用final修饰。原创 2022-04-24 15:32:25 · 2713 阅读 · 1 评论 -
说说==和equals的区别是什么
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;==比较的是两个引用是不是指向同一个内存地址。equals 默认情况下是引用比较,只是很多类重写了 equals 方法。原创 2022-04-24 15:31:36 · 239 阅读 · 0 评论 -
说说&和&&的区别
1&1=1;真&&真=真。1&0=0;真&&假=假。0&1=0;假&&真=假。原创 2022-04-24 12:15:58 · 6537 阅读 · 0 评论 -
说说newInstance 和 new 有什么区别
newInstance是实用类的加载机制,创建类是这个类必须已经加载过且已经连接。new是直接创建一个类,创建类是不需要这个类加载过。从JVM上理解: newInstance实际上是把new这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了我们降耦的手段。原创 2022-04-24 12:15:11 · 2160 阅读 · 0 评论 -
说说Integer与int的区别
Integer是int的包装类,int则是java八大基本数据类型之一Integer变量必须实例化后才能使用,而int变量不需要Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值Integer的默认值是null,int的默认值是0,Integer0代表这个数赋值0,而null代表没接收到这个值原创 2022-04-24 12:14:17 · 409 阅读 · 0 评论 -
说说Integer、Long等包装类的缓存机制
包装类:Byte,Short,Integer,Long,Character他们使用static代码块进行初始化缓存,其中Integer的最大值可以通过high设置;Boolean使用static final实例化的对象;Float和Double直接new的对象没有使用缓存。原创 2022-04-24 12:13:26 · 326 阅读 · 0 评论 -
说说String、StringBuffer与StringBuilder之间区别
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时原创 2022-04-24 12:12:43 · 213 阅读 · 0 评论 -
说说Hashtable、HashMap、TreeMap的区别
HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。它们都同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。存储的内容是基于key-value的键值对映射,不能有重复的key,而且一个key只能映射一个value。HashSet底层就是基于HashMap实现的。原创 2022-04-24 12:11:52 · 1430 阅读 · 1 评论 -
说说ConcurrentHashMap原理与实现
原理与实现主要是锁的原理与实现!我们可以从JDK1.7开始聊起:JDK1.7版本, ConcurrentHashMap内部使用段(Segment), ConcurrentLevel 有16个分段,这16个分段有独立的锁机制,每个独立的机制都是一张表,表的下面是链表,这样就可以支持并发的同时保证每张表的线程安全,大大的题高了效率。JDK1.8版本, ConcurrentHashMap内部使用sychronized + volatile + CAS的实现降低锁的粒度原创 2022-04-23 13:52:40 · 2149 阅读 · 0 评论 -
为什么HashMap数组的长度必须是2的指数次幂
计算机的运行效率:加法(减法)>乘法>除法>取模数组一旦达到容量的阈值的时候就需要对数组进行扩容。那么扩容就意味着要进行数组的移动,数组一旦移动,每移动一次就要重回记算索引原创 2022-04-23 13:52:23 · 335 阅读 · 0 评论 -
说说继承和实现接口的区别
抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式由派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。原创 2022-04-23 13:51:58 · 1078 阅读 · 0 评论