Java面试总结(八)
创始人
2025-05-29 00:05:56
0

MyBatis判断某字段为null使用什么标签

  and category_id=#{categoryId}

MySQL四个事务隔离级别

  1. READ-UNCOMMITTED(读取未提交) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

  2. READ-COMMITTED(读取已提交) : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

  3. REPEATABLE-READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  4. SERIALIZABLE(可串行化) : 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

ACID

  • 原子性(Atomicity) : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

  • 一致性(Consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;

  • 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  • 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

MySQL唯一索引可以存在多少个

创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。

delete语句会加哪些锁

delete属于当前读,所有的当前读最开始都会加临建锁,根据不同的SQL语句过滤条件可能会退化为间隙锁或记录锁,当走全表扫描时会锁住整张表,造成性能损失。

in 和 exists 的区别

  1. in()适合子表比主表数据小的情况

  2. exists()适合子表比主表数据大的情况

  3. 当主表数据与子表数据一样大时,in与exists效率差不多,可任选一个使用

如果想要详细了解这个问题,可以参考这篇文章——IN和EXISTS的区别和使用

如果想要详细了解这个问题,可以参考这篇文章——EXISTS 与 in的区别

Mysql中常用的函数,数据类型转换可能存在的问题

Concat函数。

连接字符串常用:concat函数。如sql查询条件的like查询

select * from ms_sys_user where account like concat("%", 2, "%")

将Int 转为varchar经常用 concat函数,比如concat(8,‘0’) 得到字符串 ‘80’

Cast函数;CONVERT函数。

用法:CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name).

SELECT CONVERT(‘abc’ USING utf8);

将varchar 转为Int 用 cast(str as unsigned) str为varchar类型的字符串 。

比如常用的百分比转换:

select cast((1/3)*100 as unsigned) as percent from dual;

result: 33

MySQL类型转换函数参数 : CAST(xxx AS 类型) , CONVERT(xxx,类型)

这个类型 可以是以下值其中的 一个:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]整数 : SIGNED 
无符号整数 : UNSIGNED
二进制,同带binary前缀的效果 : BINARY 
字符型,可带参数 : CHAR() 
日期 : DATE 
时间: TIME 
日期时间型 : DATETIME 
浮点数 : DECIMAL 

IF函数

IF(expr1,expr2,expr3)
如果 expr1 != null && expr1 != 0 则返回 expr2 否则返回 expr3

select if(admin, avatar, deleted)  from ms_sys_user where id = 1

如果 admin != null && admin != 0 则返回 avatar 字段内容 否则返回 deleted 字段内容

String、StringBuild、StringBuffer的区别

可变性

String 是不可变的(后面会详细分析原因)。

StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,不过没有使用 final 和 private 关键字修饰,最关键的是这个 AbstractStringBuilder 类还提供了很多修改字符串的方法比如 append 方法。字符串的拼接底层就是创建了一个StringBuild对象,利用其可变性将两个字符串拼接在一块然后tostring()返回。

abstract class AbstractStringBuilder implements Appendable, CharSequence {char[] value;public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}//...
}

线程安全性

String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结:

  1. 操作少量的数据: 适用 String;
  2. 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder;
  3. 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer。

String 为什么是不可变的?

public final class String implements java.io.Serializable, Comparable, CharSequence {private final char value[];//...
}

我们知道被 final 关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。因此,final 关键字修饰的数组保存字符串并不是 String 不可变的根本原因,因为这个数组保存的字符串是可变的(final 修饰引用类型变量的情况)。String 真正不可变有下面几点原因:

  1. 保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。

  2. String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。

字符串拼接用“+” 还是 StringBuilder?

Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。

String str1 = "he";
String str2 = "llo";
String str3 = "world";
String str4 = str1 + str2 + str3;

上面的代码对应的字节码如下:

在这里插入图片描述
可以看出,字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象 。

不过,在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象。

String[] arr = {"he", "llo", "world"};
String s = "";
for (int i = 0; i < arr.length; i++) {s += arr[i];
}
System.out.println(s);

StringBuilder 对象是在循环内部被创建的,这意味着每循环一次就会创建一个 StringBuilder 对象。

在这里插入图片描述
如果直接使用 StringBuilder 对象进行字符串拼接的话,就不会存在这个问题了。

String[] arr = {"he", "llo", "world"};
StringBuilder s = new StringBuilder();
for (String value : arr) {s.append(value);
}
System.out.println(s);

在这里插入图片描述

相关内容

热门资讯

超凡先锋安卓系统怎么下,打造极... 你有没有听说最近超凡先锋安卓系统火得一塌糊涂?这款系统不仅功能强大,而且操作流畅,简直是安卓界的黑马...
安卓系统吃鸡最佳平板,安卓系统... 你有没有想过,在安卓平板上玩《绝地求生》(也就是大家俗称的“吃鸡”)游戏,竟然也能这么畅快淋漓?没错...
安卓手机换华为系统恢复,系统恢... 你有没有想过,把安卓手机换成华为系统后,那些珍贵的资料和设置怎么恢复呢?别急,今天就来给你详细说说这...
安卓系统手机铃声女生,女生专属... 你有没有发现,现在手机铃声可是女生们展示个性的小秘密呢?那些独特的铃声,仿佛是她们心声的延伸,让人一...
安卓系统选项编程实例,基于安卓... 你有没有想过,你的安卓手机里那些看似简单的系统选项,其实背后隐藏着无限的可能?没错,今天就要带你一探...
安卓谷歌框架系统好用吗,全面解... 你有没有想过,为什么安卓手机那么受欢迎呢?这其中,谷歌框架系统可是功不可没哦!今天,就让我带你来深入...
安卓系统怎么不卡手机,畅享流畅... 手机卡顿真是让人头疼啊!尤其是安卓系统,有时候感觉就像老牛拉破车,慢吞吞的。别急,今天就来给你支几招...
安卓系统卡死代码大全,全面解析... 手机卡死是不是让你头疼得要命?别急,今天就来给你支个招,让你轻松应对安卓系统卡死的问题。咱们先来聊聊...
ios15安卓系统,两大操作系... 你有没有发现,最近手机界可是热闹非凡呢!iOS 15和安卓系统的新版本都纷纷亮相,让人眼花缭乱。今天...
安卓系统怎么上传到平板,安卓系... 你有没有想过,你的安卓手机里那些好玩的应用、照片、视频,怎么就能轻松地搬到平板上呢?今天,就让我来给...
车机安卓系统芯片,引领智能驾驶... 你有没有发现,现在的车机系统越来越智能了?没错,我要跟你聊聊的就是这个车机安卓系统芯片。想象坐在车里...
系统安卓连接app下载,畅享便... 你有没有想过,手机里的那些神奇应用是怎么神奇地连接到你的安卓系统的呢?今天,就让我带你一探究竟,揭开...
奥迪康怎么连接安卓系统,轻松实... 你有没有想过,家里的智能设备越来越多,但有时候连接起来却像是在玩捉迷藏呢?今天,就让我来带你一探究竟...
安卓8.0系统闭源了吗,安卓8... 最近手机圈里可是炸开了锅,大家都在热议一个话题——安卓8.0系统闭源了吗?这可是个大新闻,关系到我们...
小米也是安卓系统的吗,安卓生态... 你有没有想过,那个在手机市场上风生水起的品牌——小米,它的操作系统是不是安卓呢?没错,今天咱们就来聊...
华为安卓系统到多少了,华为安卓... 你有没有注意到,华为的安卓系统又升级啦?没错,就是那个我们每天都离不开的操作系统!今天,就让我带你一...
安卓系统 恢复出厂,恢复出厂设... 手机用久了是不是感觉卡得要命,各种软件堆砌得像个小山?别急,今天就来教你怎么给安卓手机来个“大变身”...
苹果系统不卡安卓会卡,揭秘系统... 你有没有发现,身边的朋友都在争论苹果系统和安卓系统的优劣呢?今天,咱们就来聊聊这个热门话题——为什么...
大厂攻略系统和安卓互通,解锁全... 你有没有想过,那些在大厂工作的朋友们,他们是如何轻松应对各种复杂的工作任务的呢?秘密武器之一,就是那...
苹果刷安卓系统能用吗,可行性探... 你有没有想过,把苹果手机上的应用直接刷到安卓系统上,是不是也能享受到同样的乐趣呢?这可是个让人好奇心...