Java面试笔试常见题目(2022.04——2022.06)

一、Java

1.封装、继承和多态

这也是面向对象语言的三大特征。

1.1 封装:封装就是隐藏对象的属性和实现细节,仅对外开放接口,控制程序中属性读和修改的访问级别,将对象和操作封装成一个抽象得类,形成一个整体。

封装的目的:增强安全性、简化编程,使用者不必了解其内部细节,只需要通过外部接口来使用类的成员。

1.2 继承(extends关键字): 就是子类继承父类的特征和行为,即可以使用现有类的特征和功能,但无需重新编写原来类的情况下进行功能的扩展。

在多个类的情况下,一个类作为子类只能有一个父类;作为父类可以有多个子类。但是可以多级继承,如a类继承b类,b类继承c类,形成一条长链。

1.3 多态:可以说成同一个行为,居有多个表现形式和形态的能力。。

多态的实现方法有重写和重载。重写就是子类重新定义父类中的方法;重载则是允许存在多个名字相同的方法,但是这些方法参数列表不同,那么调用时只需要输入不同的参数,java会自动选择构造函数。由此可见,多态实在继承的基础上进行。

2.static关键字

主要意义:创建独立于具体对象的域变量或方法,这样一来即使没有创建对象也可以使用变量或方法,(如类名.静态方法)来调用。

static还可以用来形成静态代码块以优化程序性能,因为static代码块只会在类加载的时候执行一次。

static方法只能被继承不能被重写。

3.接口与抽象类的区别

接口:
构造方法:没有构造方法
成员变量:只能是常量。默认修饰符为public static final
成员方法:jdk1.7只能是抽象的。默认修饰符为public abstract 

抽象类:
构造方法:有构造方法,用于子类实例化使用。
成员变量:可以是变量,也可以是常量。
成员方法:可以是抽象的,也可以是非抽象的。
抽象类不能用static、final关键字修饰

        抽象类与普通类的区别如下:
        包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
  2)抽象类不能用来创建对象;
  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
在其他方面,抽象类和普通的类并没有区别。

类与类只能单继承或者多级继承,但接口可以多实现。接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法

在使用抽象类和接口类的依据是:抽象类是这个对象是什么,接口类是这个对象能做什么。。

4. 多线程创建的三种方式

4.1 继承Thread类
自定义一个类,继承java.lang包下的Thread类;
重写run方法,将要执行的代码写在run方法里面;
创建自定义类的对象,调用start方法启动线程。

4.2 实现Runable接口
自定义一个类,实现java.lang包下的Runable接口;
重写run方法,将要执行的代码卸载run方法里面;
创建自定义类的对象,创建Thread对象;
将上述自定义类对象作为参数传入Thread方法中,调用start方法启动线程。

4.3 实现Callable接口
自定义一个类,实现java.util.concurrent包下的Callable接口;
重写Call方法,将要执行的代码卸载Call方法中;
创建线程池,将自定义对象加入线程池中;
获取线程返回结果。

5. 进程和线程的区别
进程:并发执行的程序在执行过程中管理中分配和管理资源的基本单位,是竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,负责当前进程中程序的执行,线程也是处理机调度的基本单元。一个进程至少一个线程,一个进程可以拥有多个线程,多个线程可以共享数据。

区别:
(1) 地址空间:同一进程之间的线程共享地址空间,不同进程之间的线程则是独立的地址空间。
(2) 共享资源:同一进程之间的线程共享资源,不同进程之间的资源则是独立的。
(3) 一个进程崩溃不会影响到其他的进程,但是一个线程崩溃会导致整个进程崩溃,所以多进程比多线程健壮。

6.JDK和JRE

JDK:Java开发工具包,是程序员使用java语言编写Java程序所需的开发工具包。
JRE:Java运行环境,包含Java虚拟机,Java类库,是运行Java程序所需的环境

如果需要编写Java程序,需要安装jdk;如果只需要运行java程序,只需要安装jre,一般是提供给用户。

7.== 和 equals的区别

7.1 == (不能用于比较布尔类型)
如果比较的是基本数据类型变量,那么就是看两个变量的数值是否相等;
如果比较的是引用数据类型变量,那么比较的就是两个变量的地址是否相等。

7.2 equals
        一般来说equals都是需要重写的,Strng、Data、File、包装类都重写了Object类中的equals。如果重写了就比较内容是否相等,如果没有重写就比较地址是否相等。
        重写了equals就要重写HashCode?
                
因为在你需要使用HashMap的情况下,hashCode为的是提高效率,HashMap底层是先根据hashCode比较,如果不相等才根据equals去比较,所以为了保证两者的配合关系重写了equals就要重写HashCode;全部用equals比较久非常低效。

8. 两个对象的hashcode()相同,那么equals()也一定相同吗?

        首先要区分hashcode指的是对象在hash表中的位置,而不是对象的物理地址。通过对象的物理地址转化成一个整数,然后经过hash函数的算法就得到了hashcode()。hashcode()的存在可以快速地根据hash函数确定数据在表中的位置。

得出结论:
        (1)如果两个对象的equals相同,那么它们的hashcode一定相同。
        (2)如果两个对象的hashcode相同,那么它们的equals不一定相同,只能说它俩在散列存储结构中的存储位置相同。

另外,HashMap底层


9. HashMap底层实现原理

存储结构:JDK1.8以前是用数组+链表的结构存储;但是当链表的长度特别长的时候,查询效率将直线下降,因此,JDK1.8把他设计为达到特定的阈值之后就会将链表转化成红黑树。

红黑树:
(1)每个节点只有两种颜色:红色或者黑色2根节点必须是黑色
(2)根节点以及每个叶子节点(NIL)都是黑色的空节点
(3)从根节点到叶子节点,不能出现两个连续的红色节点
(4)从任一节点出发,到它下边的子节点的路径包含的黑色节点数目都相同


10. final在Java中的作用

final的特征就是凡是被final修饰的地方都不能修改。

(1)修饰类,表示该类不能被继承
(2)修饰方法,表示该方法不能被重写
(3)修饰变量:
                如果是基本数据类型,表示该变量不能被更改;如果修饰的是形式参数,表示一旦被赋值则不能更改。
                如果是引用数据类型,也就是修饰对象时,引用在初始化后将永远地指向一个内存地址,不可修改。但是内存地址中保存的对象是可以修改的。

11. java 中的 Math.round(-1.5) 等于多少?

Math的round方法是四舍五入,如果参数是负数,则往大的数如,Math. round(-1.5)=-1,如果是Math.round(1.5)则结果为2

这里要注意整数和负数的区别,有人会发现对于负数四舍五入可能不适用,那么试试五舍六入
也就是将参数加上0.5再向下取整。


12. Java中操作字符串都有哪些类,它们都有哪些区别?

        java.lang.String类、java.lang.StringBuffer类、java.lang.StringBuild类

String:final修饰,不可变字符序列,对String修改都会产生新的对象,效率低。
StringBuffer:可变字符序列,并且该类的方法都加了synchronized,线程安全,效率低
Stringbuild:可变字符串序列,线程不安全,可以调用append、replace、delete等方法修改字符串

因此多线程使用StringBuffer,保证线程安全;单线程使用StringBuild提高效率;如果几乎不对字符串进行修改可以直接使用String,因为不调用new关键字声明对象就不会在堆内存中创建对象,而是直接指向String常量池,提高效率。


13.如何将字符串反转?

(1)StringBuild().reverse()方法:
 

 (2)利用数组逆序放入字符串


14.  java 中 IO 流分为几种?BIO, NIO, AIO有什么区别?

 Reader,Writer,InputStream,OutputStream 分别是字符输入流、字符输出流、字节输入流、字节输出流。

同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

15.java中涉及金额,应该用什么数据类型?

浮点数(double,float)因为精度问题,容易出现不精确的计算结果。
java中Math函数java.math.BigDecimal

16.JVM是如何判断一个java对象是否可以回收?

(1)引用计数算法
引用计数算法就是添加一个引用计数器,当有地方引用这个java对象时,引用计数器的值就加1;当引用失效时,引用计数器的值就减1;当引用计数器的值为0时这个java对象就被jvm回收。
有个问题:当对象相互指向时,那么两个对象计数器的值都会加1,那么这两个对象都不会失效,jvm就无法进行回收。

(2)可达性分析算法
定义个名为“GC Roots”的对象作为起始点,从这些节点开始,通过引用关系向下开始搜寻,搜寻走过的路径被称为“引用链”,如果某个对象到GC Roots没有任何引用链相连,就说明该对象不可达,该对象就可以回收。

17. java中sleep()和wait()的区别。

(1)sleep()是线程类Tread的方法,括号里是毫秒为单位,调用会暂停此线程指定的时间,它会主动释放CPU(CPU可以去做其他任务),但监控会依然保持,不会释放对象锁;wait()是Object类的方法,它会放弃对象锁,进入等待队列,只有调用notify()/notifyAll()才会被唤醒进入锁池,再次获得对象才会进入运行状态。
(2)sleep()方法在哪儿都能使用,wait()方法只能在方法区或代码块中使用。


        Thread.Sleep(1000)的意思实在未来的1000毫秒内本线程不会参与CPU的竞争,1000毫秒之后根据实际情况:线程优先级CPU重新分配或者等待操作系统进行CPU分配。
        Thread.Sleep(0)的作用是出发操作系统重新进行一次CPU的竞争。

        

18. 说一说java集合

1)、在java集合框架中定义的所有的接口和类都存储在java.util包中。
  2)、java集合框架中的所有具体类都实现了java.lang.Cloneable和java.io.Serializable接口。所以,他们的实例都可以复制且可序列化的。
  3)、Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
  4)、java集合框架支持三种主要类型的集合:规则集(Set)、线性表(List)和队列(Queue)。
      a、Set的实例用于存储一组不重复的元素。问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
      b、List的实例用于存储一个元素构成的有序集合。访访问集合中的元素可以根据元素的索引来访问。
      c、Queue的实例用于存储用先进先出方式处理的对象。
 1、Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。Collection包含了List和Set两大分支。
    1)List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。List的实现类有LinkedList, ArrayList, Vector, Stack。
    2)Set是一个不允许有重复元素的集合。Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。
  2、Map是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。Hashtable虽然继承于Dictionary,但它实现了Map接口。
  3、接下来,再看Iterator。它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。ListIterator是专门为遍历List而存在的。
  4、再看Enumeration,它是JDK 1.0引入的抽象类。作用和Iterator一样,也是遍历集合;但是Enumeration的功能要比Iterator少。在上面的框图中,Enumeration只能在Hashtable, Vector, Stack中使用。
  5、最后,看Arrays和Collections。它们是操作数组、集合的两个工具类。

(1)集合和数组的区别
数组长度固定,集合长度可变;数组元素可以是基本数据类型或引用数据类型,集合元素只能是引用数据类型;

(2)collection集合

注意区分collections,collections是一个工具类/帮助类,提供一些静态方法,为集合中的元素进行排序、检索以及线程安全的一些操作。
colletion集合下面有list接口和set接口
        list接口:元素按先后顺序保存,元素可以重复;
                LinkedList接口实现类,链表,没有同步,线程不安全。
                ArrayList接口实现类,数组,随机访问,没有同步,线程不安全。
                Vectotr接口实现类,数组,同步,线程安全。

                        list转化为数组,toArray()方法即可
                        数组转化为list,Array.asList()方法

        set接口:仅接受一次不可重复,重复的元素会覆盖;
                HashSet使用hash表(数组)存储元素。
                TreeSet底层实现为二叉树,元素排好序。

(3)Map集合
Map用于保存具有映射关系的数据,Map里保存两组数据:key和value,两者均可使用引用数据类型,key不可重复。根据key可以找出value
        实现类:HashMap、HashTable、LinkHashMap、TreeMap
                TreeMap能得到有序结果
                HashMap的达到的是无需结果,但是性能更好

        HashMap和HashTable的区别?
                
HashMap不支持线程同步,使用多线程处理数据可能导致结果不一致。HashMap可以让空值作为一个表key或value值(key只能有一个为null,但是value可以有无数个)

                HashTable支持线程同步,一些方法有synchronized修饰,线程安全;不能让空值作为key和value的值;

        注意两者用作key的对象必须实现HashCode和equals方法。 

19. 迭代器Iterator

迭代器是一种对象,他用来遍历标准模板库容器中的部分或者全部元素,优点是隔离容器的底层原理和实现细节(只需传入对象,不必关心底层是数组、树还是图。。),缺点是增加集合类会增加迭代器对象,成对增加。

怎么用?
· 使用方法iterator()要求容器返回一个lterator。第一次调用lterator的next()方法时,它返回序列的第一个元素。
· 使用next()获得序列中的下一个元素。使用hasNext()检查序列中是否还有元素。使用remove()将迭代器新返回的元素删除。
· 注意: iterator()方法是java.lang.lterable接口,被Collection继承。
· lterator是Java迭代器最简单的实现,为List设计的Listlterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

特点:
(1)在迭代器迭代元素的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法操作。
(2)如果使用了集合对象改变集合中的元素个数那么就会报错:不改变个数即可,替换也可以的。
(3)迭代器的生存周期为创建到使用结束的时段。
(4)foreach : lterator的封装变形,变得比lterator更简单。但是他也需要知道数组或集合的类型。并且,lterator需要注意的,foreach同样需要注意。
                foreach语法:
                       
for(元素类型 元素名称 :要遍历的数组或者集合){

                        }

20.如何确保集合中的元素不可修改?

首先需要注意的是用final修饰引用数据类型只是保证引用数据类型指向的地址不可修改,但是集合中的元素还是可以修改的。

因此我们应该用java中Collections包下的unmodifiableMap方法,通过这个方法返回的map,是不可以修改的。他会报java.lang.UnsupportedOperationException错。

二、多线程

1. 并行和并发的区别?
       
并发:两个或多个事件在同一时刻发生
        并行:两个或多个事件在同一事件间隔发生

2. 守护线程是什么?
        守护线程:指程序运行时,在后台提供的一种通用服务的线程。JVM退出的前提是所有用户线程都结束时,此时也会结束所有的守护线程,即只要有任何非守护线程正在运行,程序都不会终止。

        设置守护线程:在调用start()启动线程之前滴哦阿勇对象的setDaemon(true)方法,若将以上参数设置为false,则表示的是用户进程模式,需要注意的是,当一个守护线程中产生了其他的线程,那么这些新产生的线程还是 守护线程,用户线程也是如此。

3. 线程有哪些状态?
        新建状态:在程序中用new操作符创建一个新线程时,该线程就是一个新建状态。
        就绪状态:新建线程对象后,调用start()方法就可以以启动线程,随即进入就绪状态。
        运行状态:当就绪状态的线程被调用并获得处理器资源时,进入运行状态,此时自动调用对象的run()方法执行方法体中代码。
        阻塞状态:一个运行状态下的线程在某些特殊的状态下,如:被人为挂起或需要执行耗时的输入输出操作时,将让出CPU并暂时终止。调用sleep()、suspend()、wait()等方法,线程都将进入阻塞状态。注意:阻塞时并不能进入排队队列,只有当引起阻塞的原因被消除后,线程转入就绪状态并重新排队等待。
        
死亡状态:线程调用stop()方法、destory()方法或run()方法执行结束后,线程处于死亡状态。

获取线程当前状态的方法:getState()

4. notify()和notifyAll()有什么区别?
        
notify()可能导致死锁,notifyAll()不会。它们都是用来唤醒调用wait()方法进入瞪大索梓源队列的线程,区别在于notify()唤醒正在等待对象监视器的单个线程,如果有多个线程在等待则随机唤醒一个。notifyAll()唤醒所有。

5. 一般线程池的流程
       
(1)设置最大存活线程数n,当线程请求数大于n时,将多余的请求放到请求对列里。
       (2)请求数变小时,回收多余的线程
       (3)当请求数超过最大等待对列数时,抛出异常

        创建线程池的几种方式:
                (1)newCachedThreadPool(),可缓存线程池,如果线程池的容量超过了任务数,自动回收空闲线程,任务增加时可以自动添加新线程,它是用来处理大量短时间工作任务的线程池。
                (2)newFixedThreadPool(int nThreads),定长线程池,每提交一个任务就创建一个线程,直到线程池的最大数量,这时线程数量不再变化。重用指定数目nThreads的线程。
                (3)newSingleThreadExecutor(),单线程的线程池,线程异常结束会床架一个新的线程,能确保任务按提交顺序执行。
                (4)newSingleThreadScheduledExecutor(),单线程可执行周期性任务的线程池。
                (5)newWorkStealingPool(),任务窃取线程池,不保证执行顺序,适合任务耗时差异较大的情况。

6. 什么是死锁?
        
指两个或两个以上的进程在执行过程中,互相竞争资源或相互通信中造成阻塞,若无外力干预,它们都将无法进行下去。此时称系统处于死锁状态。
        死锁不仅会造成大量的资源浪费,还会造成整个系统崩溃。
        死锁产生的四个必要条件:
(1)(资源)互斥使用
(2)不可抢占
(3)请求和保持:资源在请求其他资源的同时保持对原有资源的占有
(4)循环等待,如P1占有P2的资源、P2占有P3的资源、P3占有P4的资源

破坏四个必要条件之一就可以预防死锁!

7. Synchronized底层实现原理
       
Synchronized(重量级锁)是通过对象内部的一个叫做监视器锁(monitor)来实现的,监视器锁本质有事依赖于底层操作系统的Mutex Lock(互斥锁)来实现的。操作系统实现线程之前的切换需要从用户态转换到核心态,成本高耗时长,因此Synchronized效率低。

8. 说一说关键字volatile

(1)概念:java虚拟机提供的轻量级的同步机制。该关键字最重要的特性是保证了volatile修饰的变量对所有线程的可见性(该特性基于Java语言的的先行性规则)

        可见性:当一个线程修改了变量的值,该值会立刻同步到主内存当中,因此,当其他线程读取这个变量的时候,会读取该变量的最新值。

(2)volatile并不能保证变量的原子性
        因此使用情况为:

                需求的结果并不依赖于变量的当前值,或者能够确保只有单一的线程修改变量的值。

                变量不需要与当前变量共同参与与其他变量的共同约束。

volatile与synchronized的区别?
        (1)volatile只能作用于变量、使用范围小。synchronized可以用在变量、方法、类、同步代码块等地方,使用范围较大。
        (2)volatile只能保证可见性和有序性,不能保证原子性。
        (3)volatile不会造成线程阻塞;synchronized可能会造成线程阻塞。

三、反射

1. 什么是反射?
       
反射:主要指程序可以访问、检测和修改他本身状态和行为的一种能力
        java反射:在java运行时,对于任意一个类可以通过反射知道这个类中的属性和方法;对于任意一个对象,通过反射可以知道调用它的方法

       Java反射机制主要提供了以下功能:
(1)在运行时判断任意一个对象所属的类。
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时调用任意一个对象的方法。

在JDK中,主要由以下类来实现Java反射机制,这些类(除了第一个)都位于java.lang.reflect包中
Class类:代表一个类,位于java.lang包下。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

2. 什么是java序列化?什么时候需要序列化?
序列化:将Java对象转换成字节流的过程
反序列化:将字节流转换成Java对象的过程

当java对象需要在网络中传输或者持久化存储到文件中时,就需要对java对象进行序列化处理

序列化的实现:类实现Serializable接口,这个接口没有需要实现的方法。实现Serializable接口是未来告诉jvm这个类的对象可以被序列化。

注意:
        若一个类可以被序列化,其子类也可以被序列化。
        生命为static和transient的成员变量,不能被序列化。
        反序列化读取序列化对象的顺序要保持一致

3. 什么是动态代理?
动态代理:当想要给实现某个接口的类中的方法,加一些额外的处理。如加日志、加事务等。可以给这个类创建一个代理,顾名思义就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了一个额外处理的新类。这个代理是动态生成的,灵活、扩展性强。

动态代理的应用:Spring的AOP、加事务、加权限、加日志

四、对象拷贝

1. 深拷贝和浅拷贝的区别?

五、MySQL

1. 说一说数据库中的事务

数据库中的事务就是一个对数据库操作的有序序列,它是一个不可分割的工作单位,只要有一个操作不执行,整个事务中的操作都不会执行,要么就全部执行。
事务的特性:原子性、一致性、持久性、隔离性

2. char和varchar的区别?

定长与变长的区别。
对于char,如果插入长度小于定义长度时,多余的用空格插入;对于varchar,插入多长就存储多长。char存取速度更快,属于空间换时间。
存储容量varchar更大

3. 数据库的三范式是什么?

第一范式:列不可再分
        每一列属性都是不可再分的属性值,确保每一列的原子性
        两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

第二范式:属性完全依赖于主键
        第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。

第三范式:属性不依赖与其他非主属性,而是直接依赖于主键
        数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系

4. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

表类型如果是MyISAM,那么id就是8
表类型如果时候InnoDB,那么id就是6

InnoDB表只会把自增主键的最大id记录在内存中,所以重启会导致最大id丢失

5. 说一下ACID是什么?

Atomicity(原子性)︰一个事务(transaction)中的所有操作,或者全部完成,或者全部不能完成,不会结束在中间的某个环节,就像事务从来没有执行过一样。即,事务不可分割。
Consistency (一致性)︰在事务开始之前和事务结束之后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有预设约束、触发器、级联回滚等。
lsolation (隔离性)︰数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务的隔离分为不同的级别,包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(repeatableread)和串行化 (Serializable)
Durability(持久性)︰事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
 

6. float和double的区别是什么?

float最多存储8位的十进制数,并在内存中占4字节
double最多可以存储16位的十进制数,并在内存中占8字节。

7. mysql的内连接、左连接、右连接有什么区别?

内连接关键字:inner join;返回的是两个表的交集部分。
左连接关键字:left join;左表的信息全部展示出来,右表只会展示符合搜索条件的额信息,不足的地方纪委NULL
右连接关键字:right join;与左连接相反

8. mysql索引是怎么实现的?

Mysql中索引分三类:B+树索引、Hash索引、全文索引
InnoDB存储引擎中用的是B+树索引

B+树是对B树的进化,其不同:
1)B+树非叶子节点不存储数据,仅存储键值,B树则存储键值和数据(为什么这么做?数据库中页的大小是固定的,InnoDB中默认是16KB,如果不存数据,就可以存更多的键值,树的阶数会更大,树就会更矮胖,查找数据进行磁盘lO的次数就会减少,查询效率快)。一般根节点是常驻内存的。2)B+树索引的所有数据存储在叶子节点,而且数据是按照顺序排列的(使得范围查找、排序查找、分组查找及去重查找很简单,而B树因为数据分散在各个节点,实现这一点很不容易),B+树的叶子节点中的数据通过单向链表连接,各个页之间通过双向链表连接。
通过上图可以看到,在InnoDB中,我们通过数据页之间通过双向链表连接以及叶子节点中数据之间通过单向链表连接的方式可以找到表中所有的数据。

9. 怎么验证mysql的索引是否满足需求?

10. 说一下数据库的事务隔离?

事务的隔离性:当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。

不考虑事务的隔离性会发生的几种问题:
(1)脏读:一个事务处理过程中读取了另一个未提交的事务中的数据
(2)不可重复读:对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
(3)幻读:一个事务在前后两次查询同一个范围的时候,后一次查询看到前一次查询没有看到的行。

四个事务隔离级别:
Read uncommitted(读未提交):最低级别,以上问题均无法解决。
Read committed(读已提交):读已提交,可避免脏读情况发生。
Repeatable Read (可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
Serializable(串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。
 

11. 说一下mysql常用的引擎

12. 说一下mysql的行锁和表锁

13. 说一下乐观锁和悲观锁?

14. mysql问题排查都有哪些手段?

15. 如何做mysql的性能优化?

六、JVM

1. 说一下 jvm 的主要组成部分?及其作用?

2. 说一下 jvm 运行时数据区?

3. 说一下堆栈的区别?

4. 队列和栈是什么?有什么区别?

5. 什么是双亲委派模型?

6. 说一下类加载的执行过程?

7. 怎么判断对象是否可以被回收?

8. java 中都有哪些引用类型?

9. 说一下 jvm 有哪些垃圾回收算法?

10. 说一下 jvm 有哪些垃圾回收器?

11. 详细介绍一下 CMS 垃圾回收器?

12. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

13. 简述分代垃圾回收器是怎么工作的?

14. 说一下 jvm 调优的工具?

15. 常用的 jvm 调优的参数都有哪些?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(空白格)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值