面试题

文章目录

1.问:请问classpath和path的区别?
  • classpath和path都是操作系统中支持的环境属性
  • classpath是JVM执行时所需要的环境属性,用于定义类的加载路径
  • path是操作系统定义的环境属性,用于指派所有可执行程序的目录
2.问:请解释&和&&的区别?
  • 逻辑运算:&表示所有的条件都判断,&&表示在判断遇见false后,后续判断不再执行,执行结果为false(执行已知结果后续判断不执行)
  • &还可以作为与的计算操作
3.问:请解释String类对象两种实例化方式的区别?
  • 直接赋值:利用"="将一个字符串常量赋予一个对象,这样就可以实现字符串的入池保存,以供下次使用
  • 构造方法实例化,利用关键字new调用String类的构造方法,这种操作会开辟两块堆内存空间,并且不会自动入池,但是可以使用intern()方法手工入池
4.问:请解释方法重载与方法覆写的区别?
  • 方法重载发生在一个类之中,方法名称相同,参数的类型及个数不同,方法的返回值类型可以不同,不受到访问权限限制
  • 方法覆写发生在继承关系类中,方法名称、参数的类型及个数完全相同,并且被覆写的方法不能拥有比父类更严格的访问控制权限
5.问:包装类Integer的==比较问题

  利用自动装箱处理的时候,如果直接赋值的数据范围在“-128~127”之间,那么就表示可以实现对象的入池保存,如果超过了此范围,那么就只能够利用equals()方法进行比较了

public class Test {
    public static void main(String[] args) {
        Integer num1 = 10;
        Integer num11 = 10;

        Integer num2 = 200;
        Integer num22 = 200;
        System.out.println(num1 == num11);//运行结果:true
        System.out.println(num2 == num22);//运行结果:false
    }
}
6.问:抽象类与接口区别?
No比较点抽象类接口
1定义abstract classinterface
2组成属性、全局常量、构造、普通方法、抽象方法全局常量、抽象方法、jdk1.8追加default方法、静态方法
3关系抽象类可以实现若干个接口接口不允许继承任何类,但是可以继承多个父接口
4子类实现子类使用extends继承一个抽象类子类使用implements实现多个接口
5限制单继承限制无此限制
7.问:请解释enum和Enum的区别?
  • enum是JDK1.5之后提供的一个关键字,主要进行枚举定义,而使用enum定义的枚举类默认都继承自Enum抽象父类
8.问:请解释throw和throws区别?
  • throw:表示手工进行一个异常类的实例化对象抛出
  • throws:用于方法声明处,将告诉方法调用者本方法有可能产生哪些异常,同时在该方法里面往往不会进行异常处理,而将异常单独处理的权利交由程序调用处
9.问:请解释Exception与RuntimeException的区别?请列举出几个常见的RuntimeException
  • Exception是RuntimeException的父类,使用Exception定义的异常会强制要求用户进行处理
  • RuntimeException的异常可以由用户选择性的进行处理,在不处理的时候如果产生异常则交由JVM自行处理
  • 常见的RuntimeException:NullPointerException、ClassCastException、NumberFormatException、ArithmeticException
10.问:String与StringBuffer与StringBuilder区别?

在java中提供三个类String,StringBuilder,StringBuffer来表示和操作字符串。字符串就是多个字符的集合。

  • String是内容不可变的字符串。String底层使用了一个不可变的字符数组(final char[])。
  • StringBuilder与StringBuffer,是内容可以改变的字符串。StringBuilder,StringBuffer底层使用的可变的字符数组(没有使用final来修饰) 。
  • StringBuilder是线程不安全的,效率较高.而StringBuffer是线程安全的,效率较低。
    在这里插入图片描述
11.问:Java对象生命周期

在这里插入图片描述

12.问:请解释两种比较器的区别?
  • java.lang.Comparable:在类定义的时候实现的接口,该接口有一个compareTo()方法用于确认大小关系,属于类的原生支持;
  • java.util.Comparator:属于挽救的比较器,里面只有一个compare()方法,同时在JDK1.8之后又扩充了许多新的操作;
13.问:请解释ArrayList与LinkedList区别?
  • ArrayList底层使用的是数组。LinkedList底层使用的是链表。
  • 数组查询具有索引,查询特定元素比较快。而插入和删除比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。
  • 链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高
14.问:请解释ArrayList与Vector区别?
  • ArrayList是在JDK1.2提出集合框架的时候定义的,其内部的方法未使用同步处理,属于非线程安全的操作;
  • Vector是在JDK1.0的时候提供的类,在JDK1.2之后增加到集合框架之中,所有方法使用synchronize同步,属于线程安全的操作;
  • ArrayList和Vector一样都是基于数组实现的动态存储。
15.问:List接口中存在有get()方法,可以根据索引获取数据,那么请问使用这种方式结合循环输出和使用Iterator有哪些不同?

  List相比较Set和Collection集合来讲,最大的操作特点是支持有get()方法,可以依据索引获取相应的数据内容。
  迭代操作的特点是只进行一次循环处理,但是如果使用了get()方法呢,那么每一次都需要进行索引数值的匹配,那么最终得到的时间复杂度很高,所以性能一定不高。

16.问:请问如何可以将一个自定义的类利用foreach输出?

  如果现在自定义的类对象要想实现foreach输出,则这个对象所在的类一定要实现Iterable接口。
在这里插入图片描述

package com.gen;

import java.util.Iterator;

class Message implements Iterable<String>{
    private String[] content = new String[]{"hello", "world", "haha"};
    private int foot;// 进行数组的索引控制
    @Override
    public Iterator<String> iterator() {
        return new MessageIter();
    }

    private class MessageIter implements Iterator<String>{
        @Override
        public boolean hasNext() {
            return Message.this.foot < Message.this.content.length;// 有内容
        }
        @Override
        public String next() {
            return Message.this.content[Message.this.foot++];// 返回内容
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Message msg = new Message();
        for (String s : msg){
            System.out.print(s+"、");
        }
    }
}

执行结果:
hello、world、haha、

17.问:请解释HashMap与Hashtable的区别?HashTable和ConcurrentHashMap的区别?
  • HashMap和Hashetalbe都可以使用来存储key–value的数据。
  • HashMap是可以把null作为key或者value的,而Hashtable是不可以的。
  • HashMap是线程不安全的,效率较高。而HashTalbe是线程安全的,效率较低。
  • HashMap在进行存储的时候默认的大小为16,在存储量达到8位之后为了保证数据的查询性能使用红黑树进行存储,HashMap中的全部方法都使用异步处理,属于非线程安全操作;
  • Hashtable进行存储时默认的大小为11,Hashtable中的方法使用同步处理,属于线程安全的操作;
    问:我想线程安全但是我又想效率高?
    通过把整个Map分为N个Segment(类似Hashtable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
18.问:关于Properties与ResourceBundle区别?
  • Properties实现的是一个属性操作,那么保存属性资源的可以是任意的文件后缀,并且在进行加载的时候,如果指定属性的key不存在,那么返回的是null;
  • ResourceBundle主要加载的是“*.properties”资源文件,如果现在要查询的key不存在,则会产生异常,但是特别需要注意的是,ResourceBundle可以与Locale结合实现不同语言资源文件的加载。
19.问:简单讲一下java的跨平台原理

  由于各操作系统(windows,linux等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序代码。Java开发了适用于不同操作系统及位数的java虚拟机来屏蔽系统之间的差异,提供统一的接口。对于我们java开发者而言,你只需要在不同的系统上安装对应的java虚拟机、这时你的java程序只要遵循java规范,就可以在所有的操作系统上面运行java程序了。
  Java通过不同的系统、不同版本、不同位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外统一的接口(java API),对于我们普通的java开发者而言,只需要按照接口开发即可。如果我系统需要部署到不同的环境时,只需在系统上面安装对应版本的虚拟机即可。

20.问:面向对象的特征有哪些方面?

有四大基本特征:封装、抽象、继承、多态

  • 面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。eg:张三这个人,他的姓名等属性,要由自己提供的获取或改变的方法来操作。private name setName getName
  • 抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。就是把现实生活中的对象,抽象为类。
  • 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。eg:遗产继承
  • 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
    靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
21.问: 有没有使用过线程并发库?

JDK5中增加了Doug Lea的并发库,这一引进给Java线程的管理和使用提供了强大的便利性。 java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变的得心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制.
Java通过Executors提供四个静态方法创建四种线程池,分别为:

  • newCachedThreadPool()创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool()创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool()创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor()创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
22.问:线程池的作用?
  • 限定线程的个数,不会因为线程过多导致系统运行缓慢或崩溃。
  • 线程池不需要每次都去创建或销毁,节约了资源。
  • 线程池不需要每次都去创建,响应时间更快。
23.问:讲一下http中get和post请求的区别?

GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作。GET,POST,PUT,DELETE就对应着对这个资源的查、改、增、删 4个操作,具体点来讲GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

  • Get请求提交的数据会在地址栏显示出来,而post请求不会在地址栏显示出来。
    GET提交:请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;
    POST提交:把提交的数据放置在是HTTP包的包体中。 因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
  • 传输数据的大小。
    http的Get请求由于浏览器对地址长度的限制而导致传输的数据有限制。而POST请求不会因为地址长度限制而导致传输数据限制。
  • 安全性,POST的安全性要比GET的安全性高。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。
24.问:Servlet生命周期

Servlet类的生命周期指的是一个Servlet类的对象从创建到销毁的整个过程。

一个Servlet类自始至终只会创建一个对象(单例)。
①如果没有配置<load-on-startup>1</load-on-startup>:
当用户请求第一次到达服务器时,服务器就会创建当前Servlet对象,容器运行其init()方法然后依次调用service(ServletRequest,ServletResponse)–> service(HttpServletRequest,HttpServletResponse)doGet|doPost方法来响应用户请求;当再次访问当前Servlet时,不会重新创建对象,直接使用第一次创建的Servlet对象调用方法进行响应;
②如果配置了<load-on-startup>1</load-on-startup>:
当服务启动时就会按照配置的顺序依次创建Servlet类的对象,当访问Servlet时,就不再创建新的Servlet对象,直接使用服务器启动时创建的对象依次调用service(ServletRequest,ServletResponse) -->service(HttpServletRequest,HttpServletResponse)
doGet|doPost方法来响应用户请求;
③当关闭服务器时销毁Servlet对象执行destroy()方法。

25.问:Servlet API中forward()与redirect()的区别?
  • forward是服务器端的转向而redirect是客户端的跳转。
  • 使用forward浏览器的地址不会发生改变。而redirect会发生改变。
  • forward是一次请求中完成。而redirect是重新发起请求。
  • forward是在服务器端完成,而不用客户端重新发起请求,效率较高。
26.问:JSP和Servlet有哪些相同点和不同点?
  • JSP是Servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类。也就是jsp最终也是一个Servlet.这个Servlet对外提供服务。
    在这里插入图片描述
  • Servlet和JSP最主要的不同点在于JSP侧重于视图,Servlet主要用于控制逻辑。
  • Servlet如果要实现html的功能,必须使用Writer输出对应的html,比较麻烦。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件,做界面展示比较方便而嵌入逻辑比较复杂。
27.问: jsp有哪些内置对象?

1、request对象
  request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
  response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,只在JSP页面内有效。
3、session对象
  session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象
  application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象
  out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象
  pageContext 对象的作用是取得任何范围的参数,可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象
  config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象
  page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象
  exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

28.问:说一下session和cookie的区别?你在项目中都有哪些地方使用了?

session和cookie都是会话(Seesion)跟踪技术。cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。但是session的实现依赖于cookie,sessionId(session的唯一标识需要存放在客户端)。
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中,比如购物车。购物车最好使用cookie,但是cookie是可以在客户端禁用的,这时候我们要使用cookie+数据库的方式实现,当从cookie中不能取出数据时,就从数据库获取。

29.问:简单介绍一下关系型数据库三范式?

①数据表中的字段不可再分。
②不存在非关键字段对关键字段的部分函数依赖(针对联合主键的表)。
③不存在非关键字段之间的传递依赖。

30.问:事务四个基本特征或 ACID 特性
  • 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
31.问:简单讲一下数据库的存储过程

数据库存储过程具有如下优点:
1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。
2、通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
3、存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。
4、安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

32.问:JDBC中的PreparedStatement相比Statement的好处
  • PreparedStatement是预编译的,比Statement速度快。
  • PreparedStatement,代码的可读性和可维护性更高。
  • 安全性高,PreparedStatement可以防止SQL注入攻击,而Statement却不能。
33.问:简述MVC模式

  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
  最简单、最经典的就是Jsp(view) +Servlet(controller) + JavaBean(model)。
在这里插入图片描述

34.问:简单讲一下SpringMVC的执行流程(原理)?

在这里插入图片描述

  1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获。
  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
  3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
    HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
    数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
    数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
  5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
  6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
  7. ViewResolver 结合Model和View,来渲染视图。
  8. 将渲染结果返回给客户端。
35.问:说一下Spring中的两大核心?

Spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

  • IOC(Inversion of Control )或DI(Dependency Injection)
    IOC控制权反转
    原来:我的Service需要调用DAO,Service就需要创建DAO
    Spring:Spring发现你Service依赖于dao,就给你注入.
  • AOP:面向切面编程
    核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
36.问:Spring事务的隔离级别?
  1. DEFAULT (默认)
    这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
  2. READ_UNCOMMITTED (读未提交)
    这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  3. READ_COMMITTED (读已提交)
    保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
  4. REPEATABLE_READ (可重复读)
    这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。
  5. SERIALIZABLE(串行化)
    这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。
  • 脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一 个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
  • 不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
  • 幻像读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
37.问:数据库的存储引擎
  • Myisam存储引擎
    如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用Myisam存储引擎. 比如 bbs 中的发帖表,回复表。
  • InnoDB存储引擎
    对事务要求高,保存的数据都是重要数据,我们建议使用InnoDB,比如订单表,账号表。
  • Memory 存储
    我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用Memory, 速度极快。

问:Myisam 和 InnoDB的区别(主要)

  • 事务安全:Myisam不支持事务而InnoDB支持。
  • 查询和添加速度:Myisam不用支持事务就不用考虑同步锁,查找和添加的速度快。
  • 支持全文索引:Myisam支持InnoDB不支持。
  • 锁机制:Myisam支持表锁而InnoDB支持行锁(事务)。
  • 外键:Myisam 不支持外键,InnoDB支持外键. (通常不设置外键,通常是在程序中保证数据的一致)。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值