Java基础面试
孙LL
这个作者很懒,什么都没留下…
展开
-
计算机——数据库
Buffer PoolMySql的内存区有个Buffer Pool(128MB)里面以数组的形式存储从磁盘中读取的数据我们每次执行Sql语句就会从先检查Buffer Pool中有没有,如果没有再从磁盘中读取,这样的话就可以减少与磁盘IO的次数。同样的,更新也是一样的道理,我们也是读取到内存中,然后在内存中进行修改,修改完了之后再在某个时间段进行持久化。而硬盘中读取之后我们就会从Free链表的控制块中选取一个地址,进行存储,存储完了之后删除该地址块。同样的如果我们更新了一个地址块的内容(因为更新的内容原创 2022-09-20 11:03:28 · 461 阅读 · 0 评论 -
2021-11-01 Java错题集锦
有如下代码:请写出程序的输出结果。public class Test{ public static void main(String[] args) { int x = 0; int y = 0; int k = 0; for (int z = 0; z < 5; z++) { if ((++x > 2) && (++y > 2) && (k++ &g原创 2021-11-01 04:24:18 · 137 阅读 · 0 评论 -
2021-10-27 Java错题集锦
这里涉及到Java的一个优化,就是在编译的时候把字面量合并了,比如String sun = “a”+“b”+“c”会直接被优化成一个单一的字面量“abc”。所以这里也是同理,只有一个对象被创建,“welcometo360”,这一个对象而已。Object里面的方法是叫clone而不是copy,Object没有copy这方法。package的定义必须先于import这些的,而不仅仅是类定义前,当然,在注释后面是无所谓的。Spring中有AOP,但是没有给我们提供AOP实现的日志系统,我们还是要自己.原创 2021-10-27 22:05:16 · 106 阅读 · 0 评论 -
2021-10-24 Java错题集锦
java.exe是JVM,执行编译好的文件javadoc.exe是用来制作Java文档的jdb则是Java调试的工具以下代码执行的结果显示是多少( )?public class Demo { class Super { int flag = 1; Super() { test(); } void test() { System.out.println("Super.test() flag=" + flag); } .原创 2021-10-24 03:37:00 · 80 阅读 · 0 评论 -
2021-10-23 Java错题集锦
取余运算的符号一定与被除数的符号相同。所谓的桥接模式就是桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化比如抽象部分可以有进一步RefinedAbstractor,而实现部分可以有一个父Implementor而进一步继承该类有ImplementorA之类的。这样做的好处就是实现了抽象化和实现的解耦,你抽象变化管你的,我实现变化管我的。在JDBC中,他就提供了统一的接口,所以在切换不同的数据库时,代码基本不需要动,因为接口相同,具体的实现交给了数据库厂商。GenericServ.原创 2021-10-23 03:47:05 · 135 阅读 · 0 评论 -
2021-10-22 Java错题集锦
可以在多个平台运行靠的是JVM,而JVM编译的也不是.java源代码而是.class字节码,将字节码编译为机器码。成员内部类是定义在方法外部的,所以哪怕用private也是有意义的,因为private修饰的话,同一个类中的成员也还是都能访问的。但是局部内部类就没有用修饰符修饰的必要了,因为他是定义在方法体里的,没有一个程序单位能从外部访问到方法内部的局部变量。下面代码的输出是什么?public class Base{ private String baseName = "base";.原创 2021-10-22 03:17:23 · 138 阅读 · 0 评论 -
2021-10-21Java错题集锦
static永远只能调用static的属性,因为static只有在初始化的时候就会被加载,那么可想而知你要是在方法里调用非static的,那这些还没被加载,你直接GG。public class Test { private static int j = 0; private static Boolean methodB(int k) { j += k; return true; } public static void methodA(.原创 2021-10-21 02:11:33 · 91 阅读 · 0 评论 -
2021-10-19 Java错题集锦
先要将字符串转为byte再进行重新编码。只有数据流才能够读取数据finalize是只能被调用一次的,所以不是每次回收都会被调用的。原创 2021-10-19 03:52:19 · 81 阅读 · 0 评论 -
10_12Java错题集锦
y+=z–/++xy=2+(3–/++1) 这里3先参与运算然后才自减,而1是先自加再参与运算,所以就变成y=2+(3/2) 因为是整型,所以3/2=1,所以变成y=2+1=3 public class While {public void loop() {int x= 10;while ( x ) {System.out.print("x minus one is " + (x - 1));x -= 1;}}}Java不同于C,C里面除了0都默认为true,而Java的l.原创 2021-10-12 02:53:52 · 103 阅读 · 0 评论 -
Java错题集锦13
finalize的方法只会被执行一次,比如第一次被执行完后,第二次就不会执行,而是直接等待进行GC回收了。A,你只对写操作操作加锁,也就也可能你在同一事务中写入的时候读数据,你修改的时候读到了A,修改完读到了B,你这读取操作两次就不一致了。B,这是适合读多写少的情况,因为你写少,所以每次复制一份新的副本,在副本上修改,然后再把副本作为新的数据这一过程才不会太消耗时间,但是读写一样多的话,你这种方法就太消耗时间了。C就比较合适了,因为你分段就不太会影响性能了。其实D就是一个数组的数组,A的话,数.原创 2021-10-01 21:52:17 · 83 阅读 · 0 评论 -
Java错题集锦13
下列代码输出的是:public static void main(String args[]) { Thread t = new Thread() {public void run() {pong();}}; t.run();System.out.print("ping"); } static void pong() { System.out.print("pong");}}记住run()方法是执行一下run()方法里面的代码,sta原创 2021-09-30 05:00:05 · 64 阅读 · 0 评论 -
Java错题集锦11
其实第一个赋值里面你写啥都行的,不是非要写个 int var = 2局部内部类是不能用访问修饰符修饰的。原创 2021-09-28 03:53:36 · 86 阅读 · 0 评论 -
Java错题集锦10
我们要知道这些容器类里面存储的都是对象而不能是基本数据类型,之所以你可以直接把0放进来,那是因为自动拆装箱机制,他把你的基本数据类型封装为对象了。原创 2021-09-26 17:35:33 · 82 阅读 · 0 评论 -
Java错题集锦8
如下代码输出的是:package Test;public class Test { private static void test(int[] arr) { for (int i = 0; i < arr.length; i++) { try { if (arr[i] % 2 == 0) { throw new NullPointerException();原创 2021-09-25 04:36:08 · 193 阅读 · 0 评论 -
Java错题集锦6
记住 前缀代表功能,后缀代表父类。与运行时异常(Runtime Exception)所相对应的是Checked Exception,这个在编译的时候就要检查了,所以我们要自己手动使用try catch来进行处理。而运行时异常则是交给虚拟机了。D错误也很明显,你完全可以扔出去交给调用者来处理。单例的构造方法是private的,你只能通过类的静态方法来获取他,不然的话,你其实就可以一直new新的单例出来了,这还叫单例嘛?1、强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋.原创 2021-09-23 03:55:03 · 104 阅读 · 0 评论 -
Java错题集锦3
getClass()无法被重写,所以都是使用Object的方法,他返回的就是包名+类名。类加载器不加载接口注意,这里A选项可以是因为第一行import了这个内部类了。没有成员变量的类天生是线程安全的,因为他们没有共享的资源。...原创 2021-09-04 15:56:43 · 96 阅读 · 0 评论 -
设计模式——工厂模式
抽象工厂和工厂模式我们一般说的工厂模式就是应用在超类和多个子类之间的。比如说ShapeFactory(形状工厂),这是一个实体的类,但是Shape本身只是一个抽象的接口,很多比如说Circle或者Triangle都可以实现这个接口,那么我们就可以将生产形状的职责转移给这个工厂类了。而简单工厂则是没有这个抽象的,比如说CircleFactory(圆形生产工厂)这就是个简单工厂,他就是专注于圆的生产。在这里我们还是可以进一步的提高抽象层级,比如说把工厂也抽象掉,变成AbstractFactory,我们使用Fa原创 2021-07-31 11:17:08 · 63 阅读 · 0 评论 -
BIO,NIO,AIO
BIO 同步阻塞同步阻塞,同步指的是请求端是否参与数据的获取,自己进行IO操作,同步与阻塞并不等同比如说自旋锁,他并不阻塞,但是他是同步的,他持续的死循环不断轮询来达到同步的这一目的。NIO 同步非阻塞这里涉及到一个Select模型你的客户端发送一个请求给服务端,同时也会将你的连接句柄注册到Select模型上,该模型会不断的轮询里面的所有句柄,如果有response了就会通知客户端自己来遍历Select模型然后获得Response。而服务端处理完请求,会将response发回给Select模型原创 2021-07-17 16:30:08 · 62 阅读 · 0 评论 -
JVM垃圾回收器
串行收集器顾名思义,就是串行化的进行标记和清除,不允许其他的线程来干扰。这个垃圾收集器工作期间是需要stop the world的。一般用于年轻代。并行收集器这个也好理解,就是不同线程可以并行的进行标记和清除工作,这个垃圾收集器工作期间也是需要stop the world的。只不过与串行收集器不同的是他允许多个线程一起进行工作。一般用于年轻代。CMS(并发标记与清除)这个垃圾回收器标记的期间是不stop the world的!他是和应用程序共存并发的去标记和清除(有可能)的!但是在标记的过程中如果原创 2021-07-17 14:58:13 · 82 阅读 · 0 评论 -
JMM(Java内存模型)
JMMJava内存模型不是内存结构!(内存结构我们之前已经看到过了,就是堆栈那些)。JMM是对多线程下数据的有序性,可见性和原子性的一种保障。原子性使用synchronized关键字来实现原子性。具体就是我们有一个Monitor 他监视着 Owner,EntryList以及一个WaitSet。一个线程会首先使用Monitorenter,Monitor发现Owner是空的,他就会让线程去Owner,否则就去EntryList。一旦线程任务完成,那么线程就会使用Monitorexit,通知monit原创 2021-06-30 16:11:55 · 88 阅读 · 0 评论 -
运行期优化
JVM运行分5个层次0层:解释执行(这个其实就是我们的解释器做的,将字节码文件一个个的翻译成机器码然后去执行)1层:使用C1即时编译器执行(不带profiling)2层:使用C1即时编译器执行(带基本profiling)3层:使用C1即时编译器执行(带完全的profiling)4层:使用C2即时编译器执行profiling指的是在运行过程中收集一些方法调用的信息比如次数啊什么的。其实我们只要区分Interpreter解释器,C1和C2即时编译器就好了。解释器和即时编译器(JIT)的区别就是:原创 2021-06-30 11:08:21 · 97 阅读 · 0 评论 -
类加载器┗|`O′|┛ 嗷~~
Bootstrap该类加载器由C++编写,主要加载一些核心类,比如resources,charset之类的。我们也可以自己追加一些核心类双亲委派模式打破双亲委派模式,比如我们注册jdbc.driver,他使用的类加载器是BootstrapLoader,但是实际上这个路径下根本没有我们要的driver,注意看ClassLoader.getSystemClassLoader()这里其实我们获得的就是AppClassLoader。这就打破了双亲委派模式...原创 2021-06-29 16:27:56 · 62 阅读 · 0 评论 -
字节码加载
加载我们的字节码文件都是加载到方法区中,而方法区在1.8版本以后就是使用元空间来实现的。而这个文件包括了些什么呢?就是以下(这些东西都是用C++的instanceKlass来描述Java类的)存储在方法区的都是instanceKlass,而我们注意到java_mirror(类镜像),这个才是我们真正的平常时候使用.class所会引用到的对象(java_mirror存储着该instanceKlass在Java堆中.class对象的地址)。我们使用反射的时候会利用对象头里记录的class地址找到堆中的原创 2021-06-28 15:44:52 · 169 阅读 · 0 评论 -
Synchronize 关键字字节码分析
Synchronize 关键字字节码分析其实很简单就是直接dup操作,把你的对象引用复制一份,一份加载到槽中给monitorenter使用,代码执行完了再使用monitorexit拿到这个槽中的引用,然后释放掉。在执行期间只允许持有该引用的...原创 2021-06-28 14:33:05 · 89 阅读 · 0 评论 -
JVM字节码补充知识点
这里解释一下 invokevirtual 指的是调用public的普通方法(动态绑定的,性能较低),像invokespecial则是调用静态方法或者是构造方法或者是final修饰的(这些都是静态绑定的,所以查找效率高)public class Entry { private static int count = 0; { count = 1; } public Entry(){ count=2; }}这里最后count的值就.原创 2021-06-28 11:45:43 · 77 阅读 · 0 评论 -
JVM相关
JVM概述JVM其实就是一套规范,他的实现是有很多种的,我们主要在用的实现就是Hotspot这个就是大概的结构图。接下来我们开始由简入深开始学习。程序计数器做什么的:其实说白了就是存储我们下一条的jvm指令的地址。特点:很显然,这是个线程私有的,因为你记录的是你当前线程的JVM指令呀,你失去了CPU资源,计数器肯定还是保持着下一条指令地址的。不可能大家公有一个,那就乱套了。同时也不存在OOM内存溢出。虚拟机栈虚拟机栈是什么:线程运行时的内存空间,里面存的都是栈帧栈帧是什么:方法运行时原创 2021-06-25 21:21:25 · 221 阅读 · 0 评论 -
高并发(Xmind)
Synchronized和Reentrantlock的区别Synchronized是Java中的关键字,而Reentrantlock则是一个实现类JDK1.6之后Synchronized引入了锁升级的机制,这使他和Reentrantlock的性能几乎相差无几了。Synchronized是不可中断锁,也就说一旦你尝试开始等待获取一个锁,那你就嗯等,等到这个锁被释为止,而Reentrantlock则是可中断锁,他可以使用tryLock(设置Timeout的时间值)来获取锁,一旦超时就不再等待,然后返回F原创 2021-06-09 16:16:33 · 84 阅读 · 0 评论 -
基础多线程
线程,进程和协程的区别首先进程是最大的一个概念,他是操作系统的一个管理内存和程序的容器,比如你打开一个.exe文件,那么就创建这么一个容器,容器中加入各种运行所需要的二进制文件呀或者数据呀。线程则是CPU调度运行的基本单位协程的概念则比较特殊,他是用户态的一个运行单元,因为我们知道线程之间的切换需要在用户态和内核态之间切换,这个是非常耗时,消耗资源的。所以这时候就提出协程这个概念,我们不切换用户态和内核态,我们可以将线程1从执行A协程函数切换到执行B协程函数,这就达到了一个切换的目的,同时由于一致处于原创 2021-06-09 14:33:34 · 145 阅读 · 0 评论 -
软件开发设计模式
设计模式的六大原则单一职责原则一个类应当只有一个职责且应当只有一个引起他变化的原因。这个主要是为了类的高聚合,低耦合,防止牵一发而动全身的现象出现。比如说我们有一个Mobile的接口类,里面有CPU,RAM的属性的Getter和Setter,以及打电话,看视频,听音乐的功能。我们不应该把所有的功能和职责都放一起的,比如说一旦我们加入一个新的属性:像素,那么全部实现该接口的类都会收到影响,所以这个基础上我们可以进一步拆分:MobileProperty接口以及MobileFunction接口,那么如果原创 2021-05-18 22:06:43 · 172 阅读 · 0 评论 -
计算机网络基础
说说ARP协议以及他的工作原理:ARP协议就是地址解析协议,他的功能就是通过IP地址获取到物理MAC地址。为什么我们需要MAC地址呢?一种说法就是MAC地址记录着下一跳的地址的值,IP地址则记录的是终点的值,所以我们需要不断地中转来达到最终地IP地址。工作原理:主机A检查自己的ARP缓存中是否存在该IP对应的MAC地址,如果有的话直接使用缓存中的MAC地址即可。如果没有的话,主机A广播一个数据包(其中包含自己(发送方)的IP地址和MAC地址以及目标地IP地址),本地网络中的所有主机都会收到该数据原创 2021-05-05 18:53:24 · 165 阅读 · 0 评论 -
JVM基础(比较全面)
JVM包含了哪几部分JVM主要包括了4个部分:类加载器(Class Loader)运行时数据区(RunTime Data Area)执行引擎(Execution Engine)本地库接口(Native Interface)类加载器 (Class Loader)类加载器:主要功能就是将硬盘中的.class字节码文件加载到内存中,在这里也可以说成就是加载到运行时数据区(Runtime Data Area)。而这过程中要经历5个阶段:加载:在硬盘的.class字节码文件与运行时数据区中间打开原创 2021-04-28 11:39:50 · 110 阅读 · 0 评论