当前位置:   article > 正文

测开面试知识点(三)_串行化是表锁吗

串行化是表锁吗

1:String类

Java中的基本数据类型:

  • 六种数字类型:整型(四个)和浮点型(两个)
    字节型byte - 8位 默认值:0
    短整型short - 16位 默认值:0
    整型int - 32位 默认值:0
    长整型long - 64位 默认值:0L
    单精度float - 32位 默认值:0.0f
    双精度double - 64位 默认值:0.0d
  • 一种字符型 char - 8位 默认值:‘/uoooo’(null)
  • 一种布尔型 Boolean - 8位 默认值:false

String不是基本数据类型,它本身是个对象,是final修饰的Java类,是引用类型

Java中变量分为基本数据类型和引用数据类型:
引用数据类型:类class 接口 interface 和数组
引用双括号括起来的都是String对象;
双括号括起来的字符串,是不可变的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab";
双括号括起来的字符串,例如"abc""def"都是直接存储在 “方法区”的“字符串常量池”当中。
在这里插入图片描述
对字符串进行修改的时候,需要使用StringBuffer(线程安全)和StringBuilder类。 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用的对象。但StringBuilder有速度优势,一般多数情况使用StringBuilder类。
在这里插入图片描述

2:反射

反射就是将Java类中的各种成分映射成一个个的Java对象,并且可以进行操作。
生成class对象的三种方式

  • 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
    Class c = People.class;
  • 通过 Class 对象的 forName() 静态方法来获取,用的最多(会抛出ClassNotFoundException异常)
    Class.forName("People");
  • 对象调用 getClass() 方法来获取
    People p = new People();
    Class c = p.getClass();
    作用:
    反射构建出无法直接访问的类;
    调用不可访问的方法;
    简化代码。
    详细介绍

3:迭代器

迭代器是行为型设计模式
提供了一种方法来遍历一个聚合的容器(集合)中的各个元素,而不用暴露其内部的表示。
对于容器的访问而不需要关注容器内部的实现细节,可以使用迭代器,需要具备功能

  • 能够便利的访问一个聚合容器
  • 不需要了解聚合容器的内部结构
  • 能够提供多种不同的遍历方式

超详细解释

4:线程安全的类

  • Vector:类似于ArrayList,但比ArrayList多了个同步化机制,就是线程安全,但是由于效率低下,已经不再使用
  • Stack:是一个堆栈类,先进后出
  • Hashtable:各种方法机制都类似于HashMap,就是比其多了个线程安全
  • enumeration:枚举类

线程安全类如何实现:Java中大部分类都是不安全的,除了两种:

  1. 不可变类,不可变类就是指,在这个类中,一旦它的对象被创建出来,在其整个生命周期中,它的成员变量就不能被修改;

  2. 类中带有synchronized关键字的类,这个关键字就是为了使这个类变成线程安全的。

5:MyIsAm和InnoDB引擎的区别

自己之前写的博文呐

6:MySQL隔离级别

SQL标准定义了四种隔离级别:
1、读取未提交 Read-Uncommited
最低隔离级别,允许读取尚未提交的数据变更,可能导致脏读、幻读和重复读。
2、读取已提交:Read-Committed(RC)
允许读取并发事务中已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍然可能发生。
3、可重复读:Repeatable-READ(RR)
对同一个字段的多次读取结果都是一致的,除非数据被事务自身修改。可以组织脏读和不可重复读,但幻读仍可能发生。
4、串行化:Serializable
最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能出现干扰,即串行化可以防止脏读、不可重复读和幻读。
在这里插入图片描述

通过select @@tx_isolation;可以查看隔离级别:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
默认不可重复读

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

隔离级别如何实现?
读取已提交和可重复读采用的是排他锁(行锁);
读取已提交隔离级别是在读(写)之前加锁,在读(写)之后解锁,而不是等事务结束解锁,存在不可重复读的问题;
可重复读隔离级别整个事务都处于加锁状态,只有事务结束才解锁,但还存在幻读,因为使用的是行锁,可以增加行等一些行为;
串行化使用的是表锁,锁定的是整张表才能解决幻读问题。

7:并发事务问题

脏数据(Dirty READ):即A事务读取到B事务尚未提交的更改数据
当一个事务正在访问数据并且对数据进行修改,而这个操作还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了该数据,因为数据还没有提交到数据库中,那么另一个事务读到的数据就是脏数据,依据脏数据所有操作是不正确的。

不可重复读(UnrepeatableRead):即一个事务内两次读取的同一个数据是不一样的
A事务内多次读取同一个数据,在这个事务还没有结束时,B事务也访问该数据,A事务在两次读事务之间,B事务修改了该数据,A事务再次读取数据可能和第一次读取的不太一样。一个事务内两次读取的数据是不一样的,因此称为不可重复读。

幻读(phantom Read):即A事务读取到B事务提交的新增数据
A事务读取几行数据,接着B事务插入了一些数据,在随后的查询中,A事务会发现一些原来不存在的记录,好像发生了幻觉一样,所以称之为幻读。

不可重复读和幻读区别 : 不可重复的一般针对的是行级别的数据的更改,重点是修改了数据;幻读一般针对表级别的新增/删除数据,在统计事务中,两次读取的数据统计不一样,重点在于新增或者删除。

8:事务

一个事务是由一条或者多条对数据库操作的SQL语句组成的一个不可分割的单元,只有当事务中的所有的操作都正常执行完了,整个事务才会被提交到数据库,如果有部分事务处理失败,那么事务就要回滚到最初的状态,因此,事务要么全部执行成功,要么全部失败。
开启事务: begin 或者 start transaction
事务回滚: rollback
如果事务执行的过程中有操作执行失败就会回滚到最初始的状态。

事务介绍

9:线性表

线性表特征
  • 元素个数有限
  • 逻辑上元素有先后次序
  • 数据类型相同
  • 仅讨论元素间的逻辑关系

线性表是逻辑结构,顺序表和链表是存储结构
线性表包括顺序存储和链式存储;
顺序存储 ----- 顺序表
链式存储 -----单链表、双链表、循环链表

顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,线性表采用顺序存储的方式就称之为顺序表。顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中。

插入操作: 移动元素时,要从后往前操作,不能从前往后操作,不然元素会被覆盖的。
删除元素: 移动元素时,要从前往后操作。

顺序表的特点:

  • 元素的物理存储顺序直接反应表元素的逻辑顺序,可以随机存取元素
  • 头部插入和头部删除,任意删除操作效率很低。每插入或删除一个元素,可能需要移动大量元素。数组容量在定义时就已 经确定其大小,存在因容量过小而存在内存溢出问题,或者因为容量过大存在内存资源浪费问题,解决数据溢出的方法就 是申请更大内存的数组,并进行数组元素的复制,但插入操作效率很低

顺序表存储数据的效率分析:

  • 优点:随机访问特性,查找时间复杂度 O(1),存储密度高;逻辑上相邻的元素,物理上也相邻;尾插存储元素效率高平均时间 复杂度达到 O(1)。
  • 缺点:插入删除需移动大量元素。插入一个数据的平均时间复杂度 O(n)。顺序表相关的操作跟数组有关,一般都是移动数组元素。
链表

使用引用将存储数据元素的那些单元依次串联在一起,这种方法避免了数组中用连续的内存存储单元进行数据存储的特点,因而在插入或者删除时不再需要移动元素来腾出空间或者填补空缺,需要作出的改变就是在每一个单元中设置引用用来表示元素之间的逻辑关系,因而每个单元有两个作用域,一个是用于数据元素的存储,一个是用于指向下一个单元的引用,这种具有一个数据域和多个引用域的存储单元称为节点。

10:时间复杂度和空间复杂度

时间复杂度

指执行算法所需要的计算工作量;

空间复杂度

指执行算法所需要的内存空间;

11:HTTP状态码

HTTP状态码的英文HTTP Status Code。状态码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1XX:指示信息 – 表示请求已接收,继续处理;
2XX: 成功 – 表示请求已被成功接收,理解
3XX:重定向 – 要完成请求必须进行更进一步的操作
4XX:客户端错误 – 请求有语法错误或请求无法实现
5XX:服务器端错误 – 服务器未能实现合法的请求

常见状态码状态描述:
200 OK:客户端请求成功
400 Bad Request :客户端请求有语法错误,不能被服务器解析
401 Unauthorized :请求未经授权,这个状态码必须和WWW-Authenticate 报头域一起使用
403 Forbidden : 服务器收到请求,但是拒绝服务
404 Not Found : 请求资源不存在,例如:输入错误的URL
500 Internal Server Error : 服务器发生不可预期的错误
503 Server Unavaliable : 服务器当前不能处理客户端的请求,一段时间后可能恢复

12:Java中四大输入

  • system.in
    返回的是InputStream指向命令行输入的字节流,它的read方法以字节流的方式来读取命令行的输入的数据。
  • Scanner
    java.util.Scanner是Java5的新特性,主要功能是简化文本扫描,这个类最实用的地方表现在获取控制台输入。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。
  • InputStreamReader
    InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符
  • BufferedReader
    BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

13:JVM 内存划分

在这里插入图片描述
在这里插入图片描述

  • 方法区:(线程共享)常量静态变量,JIT(即时编译器)编译后代码也在此存放;
  • 堆内存:(线程共享)垃圾回收的主要场地
  • 程序计数器:当前线程执行的字节码的位置指示器
  • Java虚拟机栈(栈内存):保存局部变量,基本数据类型以及堆内存中对象的引用变量
  • 本地方法栈(C栈):为JVM提供使用native方法的服务

14:TCP/IP协议

tcp

传输层协议:TCP协议 、 UDP协议 、 SCTP协议

  • TCP协议 (Transmission Control Protocol,传输控制协议):为应用层提供可靠的、面向连接的、基于流(Stream)的服务;
  • UDP协议 (User Control Transmission Protocol,用户数据报协议):为应用层提供不可靠、无连接、基于数据报的服务;
  • SCTP协议(Stream Control Transmission Protocol,流控制传输协议):为在因特网上传输电话信号而设计的服务。
ip

15:final关键字

成员变量 = 实例变量+静态变量
被final关键字修饰的方法是最终方法,子类可以继承使用,但不能修改;

final关键字修饰变量

被final关键字修饰的变量是常量,一旦赋值,不可被修改,而且必须在初始化对象的时候赋值;
成员变量: final修饰的成员变量必须在声名的时候初始化或者在构造器中初始化,否则就会报编译错误;
局部变量: final修饰的局部变量必须声明时赋值,如果不赋值,虽然声明是不会出错,但调用时会编译出错;
方法参数: 如果final关键字修饰方法参数时,方法中是不能改变该参数的;
final关键字大多修饰基本数据类型(实际变量值不变),如果修饰引用数据类型决定的是变量不再指向另一个对象(引用地址不变),对象的内容是可以更改的;
final关键字修饰变量,(常量)要求全部的字母大写

final不能修饰
  • final不能用来修饰抽象类:因为抽象类需要被继承才有作用,而final修饰的类不能被继承;
  • final不能用来修饰构造器:因为构造方法既不能被继承,又不能被重写,用final修饰毫无意义;
final关键字的好处
  • 使用final关键字可以提高性能;JVM和Java应用都会缓存final变量;
  • final变量可以安全地在多线程环境下共享,而不需要额外的同步开销;
  • 使用final关键字,JVM会对方法、变量及类进行优化;

16:static关键字

static修饰成员变量

存储位置不同:
静态成员变量:位于“方法区”,无论多少个对象该变量在内存中都只有一份;
非静态成员变量:位于“堆空间”,每new一个对象创建一份,因此有多少个对象该变量在内存就有多少份;

static修饰方法
  • 由于在调用静态方法时,并不会将对象地引用传递过去,因此
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/239634
推荐阅读
相关标签
  

闽ICP备14008679号