超详细——Java面试高频

目录

1.基础题

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

面向过程和面向对象本质的区别:
面向过程是分析解决问题的步骤,并将步骤一步步实现。
面向对象是将构成问题的事物分解成多个对象,这些对象描述解决问题的行为。

面向过程

  • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源
  • 缺点: 没有面向对象易维护、易复用、易扩展

面向对象

  • 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
  • 缺点: 性能比面向过程低

1.2 Java 语言有哪些特点

  • 简单易学;
  • 面向对象(封装,继承,多态);
  • 平台无关性( Java 虚拟机实现平台无关性);
  • 可靠性;
  • 安全性;
  • 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  • .支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
  • 编译与解释并存;

1.3 Java 和 C++的区别

  • 都是面向对象的语言,都支持封装、继承和多态
  • Java 不提供指针来直接访问内存,程序内存更加安全
  • Java 的类是单继承的, C++ 支持多重继承;虽然 Java 的类不可以多
    继承,但是接口可以多继承。
  • Java 有自动内存管理机制,不需要程序员手动释放无用内存

1.6 字符型常量和字符串常量的区别

  • 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
  • 含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
  • 占内存大小 字符常量只占 2 个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在 Java 中占两个字节)

1.7 基本类型

在这里插入图片描述

1.8 构造器 Constructor 是否可被 override

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以
Constructor 也就不能被 override(重写) ,但是可以 overload(重载) ,所以
你可以看到一个类中有多个构造函数的情况。

1.9 重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

1.10 Java 面向对象编程三大特性: 封装 继承 多态

封装
封装是面向对象的核心思想,就是将一个东西封装起来,不给你看,但提供使用的方法。
继承
类和类之间有一定的关系,比如四边形可以分为正方形、长方形、菱形,他们不仅具有四边形的特征,也具有自己的特征,这是继承的关系。
关于继承如下 3 点请记住:

  1. 子类拥有父类非 private 的属性和方法。
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。

多态
指一个实体在不同环境下会有不同的形式。在Java中就是一个对象在不同情况下的体现,如方法的重写和重载、泛型。

1.11 String、StringBuffer 和 StringBuilder 的区别

可变性

  • String 类中使用 final 关键字字符数组保存字符串, private final char value[],所以 String 对象是不可变的。
  • StringBuilder 与StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的

线程安全性

  • String 中的对象是不可变的,也就可以理解为常量,线程安全。
  • StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以
    是线程安全的。 StringBuilder 并没有对方法进行加同步锁,所以是非线程安全
    的。

操作少量的数据 = String
单线程操作字符串缓冲区下操作大量数据 = StringBuilder
多线程操作字符串缓冲区下操作大量数据 = StringBuffer

1.12 自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

1.13在一个静态方法内调用一个非静态成员为什么是非法的

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员

1.14 在 Java 中定义一个不做事且没有参数的构造方法的作用

Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定
的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定
义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类
中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没
有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数
的构造方法。

1.15 import java 和 javax 有什么区别

javax 当时只是扩展API 包来使用,但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准 API 的一部分。实际上 java 和 javax 没有区别。

1.16 接口和抽象类的区别是什么

  • 一个类可以实现多个接口,但最多只能实现一个抽象类
  • 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
  • 抽象类和接口的设计概念不同,抽象类是对根源的抽象,接口是对行为的抽象,抽象类表示的是这个对象是什么,而接口表示的是这个对象能做什么。

1.17 成员变量与局部变量的区别有那些

  • 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;
  • 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存.
  • 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
  • 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。

1.18 创建一个对象用什么运算符?对象实体与对象引用有何不同?

new 运算符, new 创建对象实例(对象实例在堆内存中),对象引用指向对象
实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球) ;一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)

1.20 一个类的构造方法的作用是什么 若一个类没有声明构造方法,该程序能正确执行吗 ?为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明
构造方法也会有默认的不带参数的构造方法。

1.21 构造方法有哪些特性

  • 名字与类名相同;
  • 没有返回值,但不能用 void 声明构造函数;
  • 生成类的对象时自动执行,无需调用

1.22 静态方法和实例方法有何不同

  • 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
  1. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制.

1.23 对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们
指向的内存地址是否相等。

1.24 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

帮助子类做初始化工作。

1.25 == 与 equals(重要)

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。 (基本数据类型比较的是值,引用数据类型比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

  • 情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来判断两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

1.26 hashCode 与 equals(重要)

面试官可能会问你: “你重写过 hashcode 和 equals 么,为什么重写 equals时必须重写 hashCode 方法? ”

  • hashCode() 的作用是获取哈希码,是确定该对象在哈希表中的索引位置。
  • 在java中,equals和hashcode是有设计要求的,equals相等,则hashcode一定相等,hashcod相等,equals不一定相等
  • 因为HashMap是用equals判断键是否相等的,如果两个键 equals相等,而hashcode不等的话,那么就无法保证通过hashcode计算的下标值相等,下标值不等也就意味着相等的两个键却得到了不同的值

1.27 简述线程,程序、进程的基本概念。以及他们之间关系是什么

  • 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
  • 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
  • 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

1.28关于 final 关键字的一些总结

  • 对于一个 final 变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
  • 当用 final 修饰一个类时,表明这个类不能被继承。 final 类中的所有成员方法都会被隐式地指定为 final 方法。
  • 使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的 private 方法都隐式地指定为 final。

1.29 Java 中的异常处理

  • Error(错误) :是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM( Java 虚拟机)出现的问题。例如, Java 虚拟机运行错误( Virtual MachineError),当JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时, Java 虚拟机( JVM)一般会选择线程终止。
  • Exception(异常) :是程序本身可以处理的异常。 Exception 类有一个重要的
    子类 RuntimeException。 RuntimeException 异常由 Java 虚拟机抛出。

1.30 Java 序列化中如果有些字段不想进行序列化 怎么办

  • 序列化是指将对象转换为字节序列(字节流)。
  • 反序列化是指将字节序列恢复为对象。
    对于不想进行序列化的变量,使用 transient 关键字修饰。
    transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和方法。

1.31 final、finally、finalize区别

  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用 System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断

1.32 对象的四种引用

  • 强引用:只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
User user=new User();

只有当 obj 这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式(相当于必不可少的物品)。

  • 软引用 非必须引用,内存溢出之前进行回收,可以通过以下代码实现
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null

这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据(相当于有用但不是必须的对象,如图片缓存,网页缓存)

  • 弱引用 第二次垃圾回收时回收,可以通过如下代码实现
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾

弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued 方法返回对象是否被垃圾回收器标记

  • 虚引用 垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除

虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
虚引用主要用于检测对象是否已经从内存中删除

1.33 Java获取反射的三种方法

通过new对象实现反射机制
通过路径实现反射机制
通过类名实现反射机制

public class Student {
   
private int id;
String name;
protected boolean sex;
public float score;
}

public class Get {
   
	//获取反射机制三种方式
	public static void main(String[] args) throws ClassNotFoundException {
   
	//方式一(通过建立对象)
	Student stu = new Student();
	Class classobj1 = stu.getClass();
	System.out.println(classobj1.getName());
	//方式二(所在通过路径-相对路径)
	Class classobj2 = Class.forName("fanshe.Student");
	System.out.println(classobj2.getName());
	//方式三(通过类名)
	Class classobj3 = Student.class;
	System.out.println(classobj3.getName());
}
}

1.34 Java反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制

1.35 异常分类以及处理机制

  • Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。
  • Throwable又派生出Error类和Exception类。
    • 错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
    • 异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

1.36 solr 的原理?

Solr 是一个全文检索服务器,只需要进行配置就可以实现全文检索服务, Solr 可以独立运行,运行在 Jetty、 Tomcat 等这些 Servlet 容器中, Solr 索引的实现方法很简单,用POST 方法向 Solr 服务器发送一个描述 Field 域名及其内容的 XML 文档, Solr 根据xml 文档添加、删除、更新索引 。 Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回 Xml、 json 等格式的查询结果进行解析,组织页面布局。 Solr 不提供构建 UI 的功能,Solr 提供了一个管理界面,通过管理界面可以查询 Solr 的配置和运行情况。

1.37 Tomcat 怎么优化

  • 去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存
  • 利用缓存和压缩
  • 采用集群
  • 优化 tomcat 参数

1.38 Java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法?

  • 继承 Thread 类,重写 run 函数
  • 实现 Runnable 接口,重写 run 函数
  • 实现 Callable 接口,重写 call 函数
    • Callable 是类似于 Runnable 的接口,实现 Callable 接口的类和实现 Runnable 的类都 是可被其它线程执行的任务。

1.39 系统一使用 utf-8,系统二使用 gdk,怎么实现数据传递?

String s=new String(str.getBytes(“gdk”),”utf-8);

1.40 什么是值传递和引用传递

值传递是对基本型变量而言的,传递的是该变量的一个副本。改变副本当然不影响原变量。 引用传递一般是对于对象型变量而言的。传递的是该对象地址的一个副本。这个地址空间 保存对象的数据,虽然是副本,但地址是唯一的。好比我拿你家地址的原件或复印件都能 找到你家。所以对该地址进行操作会同样改变原对象。 但传递的并不是原对象本身。所以,如果函数内的对象指向新的地址,并不会改变原对象的地址。 其实一般认为, java 内的传递都是值传递。只是传递的内容不同罢了

1.41 set 为什么不可以有重复?

set 是一个特殊的 Map, value 值都是一个 object, key 值就是 set 的值,当 key 一样时, hash 算法会计算到同一个节点,所以不能重复
set添加元素时是将元素作为key值存储在hashMap中,所以set元素不能重复是因为hashmap的key值不能重复

1.42 开发单例应用需要注意什么?为什么要用单例?

  • 单例模式 只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等
  • 单例的缺点 就是不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
  • 单例最大优势就是性能优势。因为每生成一个对象都会产生内存,造成浪费

1.43 float和double的区别是什么?

1、在内存中占的字节数不同,单精度浮点数4位字节,双精度浮点数8位字节
2、位数不同,单精度浮点数有效位数8位,双精度浮点数有效位数16位
3、cpu执行速度不同,单精度浮点数执行速度会更快

1.44 char和varchar的区别是什么?

varchar 与 char 的区别: char 是一种固定长度的类型, varchar 则是
一种可变长度的类型
varchar(50)中 50 的涵义 : 最多存放 50 个字节

1.45 写一个 ArrayList 的动态代理类

final List<String> list = new ArrayList<String>();
List<String> proxyInstance =
(List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(),
list.getClass().getInterfaces(),
new InvocationHandler() {
   
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
return method.invoke(list, args);
}
});
proxyInstance.add("你好");
System.out.println(list);

1.47 ZooKeeper、Eureka和Nacos的区别

Zookeeper保证CP

  • 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。

Eureka保证AP

  • Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。

Nacos就是注册中心+配置中心的组合=Eureka+Config+Bus
Nacos:Naming(Na)+Configuration(co)+Service(s)

2.Mysql数据库

2.1 你说的 NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什么要使用和不使用NoSQL 数据库?说一说 NoSQL 数据库的几个优点?

  • NoSQL 是非关系型数据库, NoSQL = Not Only SQL。
  • 关系型数据库采用的结构化的数据, NoSQL 采用的是键值对的方式存储数据。
  • 在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应动态增加的数据项时可以优先考虑使用 NoSQL 数据库。
  • 在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。

2.2 MySQL 与 MongoDB 之间最基本的差别是什么?

  • MySQL 和 MongoDB 两者都是免费开源的数据库。 MySQL 和 MongoDB 有许多基本差别包括数据的表示(data representation),查询,关系,事务, schema 的设计和定义,标准化(normalization),速度和性能
  • 通过比较 MySQL 和 MongoDB,实际上我们是在比较关系型和非关系型数据库,即数据存储结构不同。

2.5 mysql的索引是什么

索引是种数据结构,通常使用hashMap或者tree结构实现。
索引就像是一本书的目录,可以通过页码快速寻找要查找的内容

2.8 说一下mysql的常用引擎

MyISAM InnoDB MEMORY MERGE
MyISAM

  • 是旧版本mysql的默认引擎,现在默认引擎是InnoDB。MyISAM引擎的主要特点就是快,没有事务处理操作,也不支持外键操作。适合于多读取插入,少更新删除的操作表。
    InnoDB
  • 是新版本mysql的默认引擎,支持事务处理和外键,但是其缺点几就是慢了些。 是由 Oracle 公司开发的 Innobase Oy 事务安全存储引擎。
    MEMORY
  • 数据访问非常快的引擎,存储格式统一放在内存中的一个磁盘文件中
    MERGE
  • 本身是融合的意思,实质是MyISUM表的融合,这些融合的表必须结构完全相同。

2.10 说一下乐观锁和悲观锁

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则执行其他操作,如报错或自动重试

2.11 mysql的问题排查都有哪些手段?

2.12 数据库的三范式是什么?

第一范式:数据库表的每一个字段都是不可分割的。
第二范式:数据库表中的非主属性只依赖于主键。
第三范式:不存在非主属性对关键字的传递函数依赖关系。

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

6

2.14 说一下ACID是什么?

事务具备的4个特征:原子性、一致性、隔离性、永久性

2.15 Mysql 服务器默认端口是什么?

Mysql 服务器的默认端口是 3306。

2.16 与 Oracle 相比, Mysql 有什么优势?

Mysql 是开源软件,随时可用,无需付费。
Mysql 是便携式的
带有命令提示符的 GUI。
使用 Mysql 查询浏览器支持管理

2.17 请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL 标准定义的四个隔离级别为:
read uncommited :读未提交,读到未提交数据,脏读
read committed:读提交,解决了脏读,但可能出现不可重复读
repeatable read:可重读,解决了不可重复读,但可能出现幻读
serializable :序列化,解决了以上问题,但效率很低,事务不能并发执行

2.18 如何获取当前的 Mysql 版本?

SELECT VERSION();用于获取当前 Mysql 的版本

2.19 Mysql 驱动程序是什么?

PHP 驱动程序
JDBC 驱动程序
ODBC 驱动程序
CWRAPPER
PYTHON 驱动程序
PERL 驱动程序
RUBY 驱动程序
CAP11PHP 驱动程序
Ado.net5.mxj

2.20 主键和候选键有什么区别?

表格的每一行都由主键唯一标识,一个表只有一个主键。
主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

2.21 如果一个表有一列定义为 TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

2.22 列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?

它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

2.23 你怎么看到为表格定义的所有索引?

SHOW INDEX FROM

2.24 LIKE 声明中的%和_是什么意思?

%对应于 0 个或更多字符, _只是 LIKE 语句中的一个字符

2.25 列对比运算符是什么?

在 SELECT 语句的列比较中使用=, <>(不等于), <=, <, > =, >, <=>(安全等于), AND, OR 或 LIKE 运算符。

2.26 Mysql 查询是否区分大小写?

不区分

2.27 Mysql 中有哪些不同的表格?

共有 5 种类型的表格:
MyISAM
Heap
Merge
INNODB
ISAM
INNODB是 Mysql 的默认存储引擎。

2.28 ISAM 是什么?

ISAM 简称为索引顺序访问方法。它是由 IBM 开发的,用于在磁带等辅助存储系统上存储和检索数据

2.29 InnoDB 是什么?

lnnoDB 是一个由 Oracle 公司开发的 Innobase Oy 事务安全存储引擎。

2.30 如何输入字符为十六进制数字?

如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀( X),或者只用( Ox)前缀输入十六进制数字。

2.31 如何显示前 50 行?

SELECT*FROM xxx LIMIT 0,50;

2.32 可以使用多少列创建索引?

任何标准表最多可以创建 16 个索引列

2.33 NOW()和 CURRENT_DATE()有什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE()仅显示当前年份,月份和日期。

2.34 MYSQL 数据表在什么情况下容易损坏?

服务器突然断电导致数据文件损坏。
强制关机,没有先关闭 mysql 服务等

2.35 Mysql 中有哪几种锁?

MyISAM 支持表锁, InnoDB 支持表锁和行锁,默认为行锁
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

2.36 有哪些数据库优化方面的经验?

  • 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存
  • 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

2.37 请简述常用的索引有哪些种类?

  • 普通索引: 即针对数据库表创建索引
  • 唯一索引: 与普通索引类似,不同的就是: MySQL 数据库索引列的值必须唯一,但允许有空值
  • 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引
  • 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。

2.38 mysql 数据库中索引的工作机制是什么?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更
新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

2.39 MySQL 的基础操作命令

mysql -u root -p;
show databases;
show tables;

2.40 MySQL 中 InnoDB 引擎的行锁是通过加在什么上完成(或称实现)的?

InnoDB 行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据, InnoDB 才使用行级锁,否则, InnoDB 将使用表锁!

2.41 MySQL 当记录不存在时 insert,当记录存在时 update,语句怎么写?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY
UPDATE c=c+1;

2.42 请简洁描述 MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

read uncommited : 读到未提交数据,可能出现脏读、不可重复读,幻读
read committed: 读提交,避免脏读,但不可重读,可能会幻读
repeatable read: 可重读,可能出现幻读
serializable :串行化执行,可避免以上情况,但效率最低

2.43 在 MySQL 中 ENUM 的用法是什么?

ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。
Create table size(name ENUM('Smail,‘Medium’,‘Large’);

2.44 列的字符串类型可以是什么?

  • SET
  • BLOB:BLOB 是一个二进制对象,可以容纳可变数量的数据。
  • ENUM
    • ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。
    • Create table size(name ENUM('Smail,‘Medium’,‘Large’);
  • CHAR
  • TEXT:TEXT 是对于排序和比较不区分大小写的 BLOB。
  • VARCHAR

2.45 通用 SQL 函数?

数学函数

  • Abs( num)求绝对值
  • floor( num)向下取整
  • ceil( num)向上取整

字符串函数

  • insert (s1,index,length,s2) 替换函数
    • S1 表示被替换的字符串
    • s2 表示将要替换的字符串
    • Index 表示被替换的位置, 从 1 开始
    • Lebgth 表示被替换的长度
  • upper( str), ucase( str)将字母改为大写
  • lower( str), lcase( str)将字母改为小写
  • left( str, length)返回 str 字符串的前 length 个字符
  • right( str, length)返回 str 字符串的后 length 个字符
  • reverse( str)将 str 字符串倒序输出

日期函数

  • curdate()、 current_date( ) 获取当前日期
  • curtime()、 current_time( ) 获取当前日期
  • now()获取当前日期和时间
  • datediff( d1、 d2) d1 和 d2 之间的天数差
  • adddate( date, num)返回 date 日期开始,之后 num 天的日期
  • subdate( date, num)返回 date 日期开始,之前 num 天的日期
    聚合函数
  • Count(字段)根据某个字段统计总记录数(当前数据库保存到多少条数据)
  • sum(字段)计算某个字段的数值总和
  • avg(字段)计算某个字段的数值的平均值
  • Max(字段)、 min(字段)求某个字段最大或最小值

2.46 mysql数据优化

优化数据类型

  • 避免使用 NULL, NULL 需要特殊处理, 大多数时候应该使用 NOT
    NULL,或者使用一个特殊的值,如 0, -1 作为默认值。
  • 仅可能使用更小的字段, MySQL 从磁盘读取数据后是存储到内存中
    的,然后使用 cpu 周期和磁盘 I/O 读取它,这意味着越小的数据类
    型占用的空间越小.

小心字符集转换

  • 客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL 在运行过程中隐含地进行转换,此外,要确定字符集如 UTF-8 是否支持多字节字符,因此它们需要更多的存储空间。

优化 UNION

  • 在跨多个不同的数据库时使用 UNION 是一个有效的优化方法,UNION 从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。
  • UNION ALL 可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL 更适合。

2.48 Mysql如何创建索引

2.49 Mysql优化

  1. select 指定查询字段,不要全查出来,节省内存

  2. 使用批量插入语句节省交互

  3. limit的基数比较大时,使用 between,between 限定比 limit 快,但是between也有缺陷,如果id中间有断行或是中间部分id不读取的情况,数据会少

select * from t where 1 limit 100000,10
优化为
select * from t where id between 100001 and 100011
  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  2. 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。

  3. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  4. 避免频繁创建和删除临时表,以减少系统表资源的消耗

  5. 使用 JOIN 时,应该用小结果集驱动大结果集,同时把复杂的 JOIN 查询拆分成多个query,因为 JOIN 多个表,可能导致更多的锁定和堵塞

  6. 使用 LIKE 时,避免使用 %%

  7. 不要做无谓的排序操作,而应尽可能在索引中完成排序

  8. 索引优化-选择索引列:创建索引简单,但是在哪些列上创建索引则需要好好思考。

  9. 最左前缀原则-联合索引(name,age,phoneNum) ,B+树是按照从左到右的顺序来建立搜索树的。如(‘张三’,18,‘18668247652’)来检索数据的时候,B+树会优先匹配name来确定搜索方向,name匹配成功再依次匹配age、phoneNum,最后检索到最终的数据。

  10. 不能使用索引说明:mysql会按照联合索引从左往右进行匹配,直到遇到范围查询,如:>,<,between,like等就停止匹配,a = 1 and b =2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是不会使用索引的。但如果联合索引是(a,b,d,c)的话,则a b d c都可以使用到索引,只是最终c是一个范围值。

  11. 一般情况下不建议使用like操作,如果非使用不可的话,需要注意:like '%abd%'不会使用索引,而like ‘aaa%’可以使用索引。这也是前面的最左前缀原则的一个使用场景

  12. 当 SQL 包含一对多表查询时,避免在 SELECT 子句中使

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值