java初级面试总结

java面试 专栏收录该内容
1 篇文章 0 订阅

JAVA基础

1.JAVA多线程的三种创建方式

第一种,通过继承Thread(四莱德) 类创建线程-**\

第二种,通过实现Runnable(软德饱)接口创建线程

第三种,通过Callable(靠勒饱)接口创建线程

2.String和StringBuffer、StringBuilder的区别是什么?

String、 StringBuffer(斯尊巴菲) 、StringBuilder(斯尊biu德)

  1. String长度不可变,StringBuffer、StringBuilder长度是可变的

  2. StringBuilder比StringBuffer拥有更好的性能

    1. StringBuffer是线程安全的,StringBuilder非线程安全,但它们两个中的方法是相同的,StringBuffer在StringBUilder的方法之上添加了Synchronized(森亏耐斯特)修饰,来保证线程安全。
  3. 如果一个String类型的字符串,在编译时就可以确定是一个字符串常量,则编译完成之后,字符串会自动拼接成一个常量。此时String的速度比StringBuffer和StringBuilder的性能好的多。

如果要操作少量的数据用String

  • 单线程操作字符串缓冲区下操作大量数据用StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据用StringBuffer
    2.1int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0

3.抽象类和接口的对比

相同点

  • 接口和抽象类都不能实例化
  • 都位于继承的顶端,用于被其他实现或继承
  • 都包含抽象方法,其子类都必须覆写这些抽象方法

不相同点

  1. 抽象类使用abstract(啊不斯抓可特)关键字声明 接口使用interface(in着非斯)关键字声明
  2. 抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
  3. 抽象类中可以有普通成员变量,可以包含静态方法,可以有构造器,而接口中都不能有。
    . 抽象类中的方法可以是任意访问修饰符 接口方法默认修饰符是public。并且不允许定义为 private(拍为特) 或者protected(普rua它可忒)
  4. 还有一个类可以实现多个接口,但只能继承一个抽象类。

4.面向对象和面向过程的区别

面向过程

**优点:**性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

**缺点:**没有面向对象易维护、易复用、易扩展

面向对象

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

**缺点:**性能比面向过程低

5.Java和C++的区别

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

6.Java语言有哪些特点?

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

7.什么是Java程序的主类?

应用程序和小程序的主类有何不同?

主类是Java程序执行的入口点。一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet(阿不雷特)的子类。

应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。

8.Java应用程序与小程序之间有那些差别?

简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。

9.字符型常量和字符串常量的区别

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

10.构造器Constructo是否可被override

构造器Constructor(啃抓斯特)不能被继承,因此不能被重写(Override),但是可以被重载(Overload)

11.重载和重写的区别

重写是子类方法覆盖父类的方法,要求方法名和参数都相同

重载是在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。

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

  1. 封装

**封装是保持程序的高内聚低耦合。封装是把数据的属性私有化,同时提供一些接口方法可以被外界访问。**如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也就没有什么意义。

  1. 继承

**继承就是子类继承父类,从父类获取属性和方法,子类可以拥有自己属性和方法,子类可以对父类进行扩展。**继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性地继承父类。通过使用继承我们可以非常方便地复用以前的代码。

子类拥有父类非private的属性和方法。子类可以拥有自己属性和方法,子类可以对父类进行扩展。

3.多态

指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。

所谓多态就是指程序中定义的引用变量的指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底就会指向那个类的实例对象,该引用变量发出的方法调用到底是那个类中实现的方法,必须在由程序运行期间才能决定。

在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

13.==与equals(重要)

== 号是运算符 equals 是方法 方法可以被重写

==号,它的作用是判断两个对象的地址是不是相等。即,比较的是值是否相等。

equals继承Object类,equals的作用是判断两个对象,字符串是否相等

14.hashCode与equals(重要)

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

为什么要有hashCode

我们以“HashSet如何检查重复”为例子来说明为什么要有hashCode:

当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head fist java》第二版)。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。

hashCode(哈希可漏特)介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

equals介绍

equals它的作用是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。

hashCode()与equals()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个对象分别调用equals方法都返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

15.线程有哪些基本状态?这些状态是如何定义的?

  1. 新建(new):新创建了一个线程对象。
  2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start(是大特)方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。
  3. 运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
  4. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种: (一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waitting queue)中。 (二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。 (三). 其他阻塞: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
  5. 死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

16.什么是字节码?采用字节码的最大好处是什么?

先看下java中的编译器和解释器:

Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class的文件),它不面向任何特定的处理器,只面向虚拟机。

每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。这也就是解释了Java的编译与解释并存的特点。

Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。

解释型和编译型主要是翻译的时机不同

Java通过字节码的方式,在一定程度上解决了解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

17.成员变量与局部变量的区别有那些?

成员变量在类内部起作用,局部变量只在它的作用域起作用

1、在类中位置不同:成员变量:在类中方法外。局部变量:在方法定义中或者方法声明上。

2、在内存中的位置不同:成员变量:在堆内存。 局部变量:在栈内存。

3、生命周期不同:成员变量:随着对象的创建而存在,随着对象的消失而消失。 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失。

4、初始化值不同:成员变量:有默认值初始化。局部变量:没有默认值初始化,必须定义,赋值,然后才能使用。

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

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

new运算符。

对象实体:就是类的这时体现,每个对象都是独立的内存。

引用就是表示的对象所在内存的位置。其实就是对象的线索。

比如你是对象,能够与你关联的信息都可成为引用,比如你的电话,QQ号。邮箱等

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

19.什么是方法的返回值?返回值在类的方法里的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使它可以用于其他的操作!

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

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

21.构造方法有哪些特性?

  1. 名字与类名相同;
  2. 没有返回值,但不能用void(沃尔得)声明构造函数;
  3. 生成类的对象时自动执行,无需调用。

22.静态方法和实例方法有何不同?

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

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

对象的相等比的是内存中存放的内容是否相等。

引用相等比较的是他们指向的内存地址是否相等。

24.Java中的值传递和引用传递

值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)

引用传递对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。外部对引用对象的改变会反映到所有的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)

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

**线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。**与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程是程序的一次执行过程,是系统运行程序的基本单位,进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

27.java的反射机制

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

Vue.js(读音类似于 view)

是一套构建用户界面的渐进式框架。

Vue是前端框架

Vue 只关注视图层, 采用自底向上增量开发的设计。

Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

Vuex 是什么?哪种功能场景使用它?

Vuex 是专门为 Vue.js 设计的状态管理模式,它采用集中式储存管理 Vue 应用中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

当项目庞大的时候使用它:

需要动态的注册响应式数据;

需要命名空间 namespace(name斯杯次) 来管理组织我们的数据;

希望通过插件,来更改记录;方便测试;以上这些需要和希望,都是我们 vuex 需要做的一些事情。

Vue的生命周期

什么是vue生命周期?

答: Vue 实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom(稻姆)→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。

Redis 是什么?都有哪些使用场景?

Redis 是一个高速缓存数据库。

Redis 使用场景:

· 记录帖子点赞数、点击数、评论数;

· 缓存近期热帖;

· 缓存文章详情信息;

· 记录用户会话信息。

Redis 有哪些功能?

· 数据缓存功能

· 分布式锁的功能

· 支持数据持久化

· 支持事务

· 支持消息队列

什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

Redis 支持的数据类型有哪些?

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(认特)(有序集合)。

为什么使用MQ?

主要是:解耦异步削峰

(1)解耦:

就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦。

(2)异步:,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms。

(3)削峰减少高峰时期对服务器压力。

RabbitMQ 的使用场景有哪些?

·**抢购活动,**削峰填谷,防止系统崩塌。

·延迟信息处理,比如 10 分钟之后给下单未付款的用户发送邮件提醒。

·解耦系统,对于新增的功能可以单独写模块扩展,比如用户确认评价之后,新增了给用户返积分的功能,这个时候不用在业务代码里添加新增积分的功能,只需要把新增积分的接口订阅确认评价的消息队列即可,后面再添加任何功能只需要订阅对应的消息队列即可。

·****订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功

·库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

java 容器分为 Collection 和 Map 两大类,其下又有很多子类:

**·**Collection:

·List

·ArrayList

·LinkedList

·Vector

·Stack

·Set

·HashSet

·LinkedHashSet

·TreeSet

**·**Map:

·HashMap

·LinkedHashMap

·TreeMap

·ConcurrentHashMap

·Hashtable

什么是反射(Reflection)?

反射是java被视为动态语言的关键,反射机制允许程序在执行期借助于反射 API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法

Java反射机制主要提供了以下功能:

  • 1.在运行时判断任意一个对象所属的类。

  • 2.在运行时构造任意一个类的对象。

  • 3.在运行时判断任意一个类所具有的成员变量和方法。

  • 4.在运行时调用任意一个对象的方法。

Java中的内存泄露

概述

内存泄露就是堆内存中不再使用的对象,但是垃圾回收期无法从内存中删除他们的情况,因此他们会被不必要的一直存在。,这种情况会耗尽内存资源并降低系统性能,最终以OOM终止。

虽然Java有垃圾收集器帮助实现内存自动管理,虽然GC有效的处理了大部分内存,但是并不能完全保证内存的不泄露。

负载均衡

负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法

静态负载均衡算法包括:轮询,比率,优先权。

**动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,**动态服务器补充,服务质量,服务类型,规则模式。

Servlet

Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,**可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。**servlet的作用的处理客户端的请求并将其结果发送到客户端

Servlet的生命周期

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示

Servlet的生命周期包含了下面4个阶段:

1.加载和实例化

2.初始化

3.请求处理

4.服务终止

拦截器

在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,**主要的用途是过滤字符编码、做一些业务逻辑判断等。**当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。

监听器

**当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。**它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

过滤器和拦截器的区别

1、拦截器是基于Java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、拦截器只能对action(艾克森)请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

哈希

什么是Hash

hash的基本概念就是把任意长度的输入通过一个hash算法之后,映射成固定长度的输出。

什么是HashMap和HashMap的特性

HashMap是一个用于存储Key-Value(k歪6)键值对的集合,每一个键值对也叫做Entry(嗯脆)。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。对于HashMap,最常使用的是两个方法:GetPut

特性

1.HashMap存储键值对实现快速存取,允许为null。key值不可重复,若key值重复则覆盖。

2.非同步,线程不安全。

3.底层是hash表,不保证有序(比如插入的顺序)

谈一下hashMap中get是如何实现的?

对key的hashCode进行hashing,与运算计算下标获取bucket位置,如果在桶的首位上就可以找到就直接返回,否则在树中找或者链表中遍历找,如果有hash冲突,则利用equals方法去遍历链表查找节点。

谈一下HashMap的底层原理是什么?

基于hashing(哈森)的原理,jdk8后采用数组+链表+红黑树的数据结构。通过put(泼特)和get存储和获取对象。当我们给put()方法传递键和值时,先对键做一个hashCode(哈希可漏特)的计算来得到它在bucket(掰K特)数组中的位置来存储Entry(恩吹)对象。当获取对象时,通过get获取到bucket()的位置,再通过键对象的equals(一可劳斯)方法找到正确的键值对,然后在返回值对象。

什么是碰撞?

好的Hash算法可以出计算几乎出独一无二的HashCode,如果出现了重复的hashCode,就称作碰撞;

什么是HashSet

HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。

public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

HashSet和HashMap的区别

HashMapHashSet
HashMap实现了Map接口HashSet实现了Set接口
HashMap储存键值对HashSet仅仅存储对象
使用put()方法将元素放入map中使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢

HashMap和Hashtable的区别

  1. HashMap和Hashtable(哈希的饱)都实现了Map接口
  2. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  3. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  4. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好

Linux命令

常用命令

接下来我们就来看几个常见的处理目录的命令吧:

  • ls: 列出目录

  • cd:切换目录

  • pwd:显示目前的目录

  • mkdir:创建一个新的目录

  • rmdir:删除一个空的目录

  • cp: 复制文件或目录

  • rm: 移除文件或目录

  • mv: 移动文件与目录,或修改文件与目录的名称

  • sync(森克)数据由内存同步到硬盘

  • shutdown (飒的宕)关机指令

  • reboot (瑞不特)重启

  • cat 由第一行开始显示文件内容

  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

  • 显示日期与时间的命令:date

你可以使用*man [命令]*来查看各个命令的使用文档,如 :man cp。

查看进程(例:如何查看所有xx进程)

ps -l   列出与本次登录有关的进程信息;

ps -ef grep(格瑞普 )表示查看全格式的全部进程标准的格式显示进程

ps -aux(奥斯)grep查询内存中进程信息;BSD的格式来显示

ps-ef是查看所有的进程的 然后用grep筛选出你要的信息

top(塔普)   查看内存中进程的动态信息;

杀掉进程

kill -9 pid   杀死进程

查看日志

cd到服务器的logs(琅克斯)目录(里面有xx.out文件)

tail(忒哦) -f XXX.log(琅克)–此时屏幕上实时更新日志。ctr+c停止

查看最后100行日志 tail -100 xx.out(嗷特)

tail  -n  10  test(泰丝).log   查询日志尾部最后10行的日志;

tail -n +10 test.log    查询10行之后的所有日志;

查看端口:(如查看某个端口是否被占用)

netstat(耐斯达) -anp | grep 端口号(状态为LISTEN(嘞森)表示被占用)

Linux上进程有5种状态:

  1. 运行(正在运行或在运行队列中等待)

  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)

  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)

  4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)

  5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

如何暂停一个正在运行的进程,把其放在后台(不运行)?

答案:为了停止正在运行的进程,让其在后台(挂起),我们可以使用组合键 Ctrl+Z。

在你的Linux机器上跟踪系统事件的守护进程名是什么?

答案:‘syslogd’(塞斯劳特),它负责跟踪系统信息,并将跟踪日志存储在特定的日志文件里。

如何在不解压tar包的前提下,查看包里的内容?

答案:使用’tar -tvf’。选项 t(显示内容)v(详细报告tar处理的文件信息)f(使用档案文件或者设备)

MySQL

三大范式

第一范式:原子性 保证每一列不可再分

第二范式:每张表只描述一件事情

第三范式:需要确保数据表中每一列字段都和主键直接相关,不能间接相关

事务

事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来就是没读到,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

关系性数据库需要遵循ACID规则,具体内容如下:

  1. **原子性:**事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. **一致性:**执行事务前后,数据保持一致;
  3. **隔离性:**并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
  4. **持久性:**一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库 发生故障也不应该对其有任何影响。

mysql函数的介绍

SELECT NOW(); /获取当前日期和时间/

SELECT FLOOR(福漏尔)(9.4);   /向下取整/

SELECT CEILING(森令)(9.4);/向下取整/

SELECT ABS(-8);  /绝对值/

  • 聚集函数
    • avg 平均 (avg)
    • sum总和(桑)
    • count计数 (康特)
    • max最大值 (马克思)
    • min最小 (敏)

基本数据类型

四种整数类型(byte(佰特)、short(嗖特)、int、long(浪)):

byte:8位,用于表示最小数据单位,如文件中数据,-128~127

short:16位,很少用,-32768 ~ 32767

int:32位、最常用,-231-1~231 (21亿)

long:64位、次常用

两种浮点数类型(float(福楼特)、double(大饱)):

float:32位,后缀F或f,1位符号位,8位指数,23位有效尾数。

double:64位,最常用,后缀D或d,1位符号位,11位指数,52位有效尾数。

一种字符类型(char(叉)):

char:16位,是整数类型,用单引号括起来的1个字符(可以是一个中文字符),使用Unicode码代表字符,0~2^16-1(65535)。

一种布尔类型(boolean):true真 和false假。

常用语句

创建数据库 :  create database [if not exists] 数据库名;

删除数据库 : drop database [if exists] 数据库名;

查看数据库 : show databases;

使用数据库 : use 数据库名;

select count()(康特)列名 from 表名group by having count()>15【大于15的人数】

select 列名 from 表名 inner join 表名 on连接条件(多表联查)

查询表:select * from 表名

模糊查询:select 列名 from 表名 where 列名 like_%

增加数据:INSERT INTO 表名[(字段1,字段2,字段3,…)] VALUES(‘值1’,‘值2’,‘值3’)

更新数据:UPDATE 表名 SET 列名 = ‘更新值’ WHERE 更新条件

删除数据:DELETE FROM 表名 WHERE 删除的数据 如id=‘1’

注意:condition(肯嘚森)为筛选条件 , 如不指定则删除该表的所有列数据

游标

游标是从多条数据记录的结果集中每次提取一条记录的机制。游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作游标充当指针的作用。  尽管游标能遍历结果中的所有行,但他一次只指向一行。

CREATE(酷睿特)创建

索引

索引的作用

  • 提高查询速度
  • 确保数据的唯一性
  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性
  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间
  • 全文检索字段进行搜索优化.

分类

  • 主键索引 (Primary Key)
  • 唯一索引 (Unique)
  • 常规索引 (Index)
  • 全文索引 (FullText)

索引准则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

索引的数据结构

-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree(醉)类型的索引:综合效率较高 

主键索引

主键 : 某一个属性组能唯一标识一条记录

特点 :

  • 最常见的索引类型
  • 确保数据记录的唯一性
  • 确定特定数据记录在数据库中的位置

唯一索引

作用 : 避免同一个表中某数据列中的值重复

与主键索引的区别

  • 主键索引只能有一个
  • 唯一索引可能有多个
CREATE TABLE `Grade`(
  `GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
  `GradeName` VARCHAR(32) NOT NULL UNIQUE
   -- 或 UNIQUE KEY `GradeID` (`GradeID`)
)

常规索引

作用 : 快速定位特定数据

注意 :

  • index 和 key 关键字都可以设置常规索引
  • 应加在查询找条件的字段
  • 不宜添加太多常规索引,影响数据的插入,删除和修改操作
CREATE TABLE `result`(
   -- 省略一些代码
  INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 创建表时添加
)
-- 创建后添加
ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);

全文索引

百度搜索:全文索引

作用 : 快速定位特定数据

注意 :

  • 只能用于MyISAM类型的数据表
  • 只能用于CHAR , VARCHAR , TEXT数据列类型
  • 适合大型数据集

Spring

spring理念使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架

优点

1、Spring是一个开源免费的框架 , 容器 .

2、Spring是一个轻量级的框架 , 非侵入式的 .

3、控制反转 IoC , 面向切面 Aop

4、对事物的支持 , 对框架的支持

一句话概括:

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

IOC

简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他类或第三方容器来管理

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

控制反转IoC,是一种设计思想。在没有IoC的程序中 , 我们使用面向对象编程 , 程序的创建与对象间的依赖关系完全在程序中,如果用了ioc使用set方法进行注入,控制反转后将对象的创建转移给第三方,所谓控制反转就是:获得依赖对象的方式反转了。

AOP

AOP就是在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。

使用spring的好处

1.方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)

2.spring提供aop,可以很方便的实现对程序进行权限拦截和运行监控等功能

3.方便集成各种优秀的框架

spring常见注解

@Component用于泛指组件(啃跑内特)

@Autowired自动装配(凹凸外)

@Qualifier限定符

@Scope作用域(是勾普)

@Controller控制器(啃搓乐)

@Service用于标注业务层组件(涩为斯)

@Repository用于标注数据访问组件(瑞帕斯翠)

springboot

你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功夫。

springboot常用注解有:

@Repository用于标注数据访问组件(瑞帕斯翠)

@Service用于标注业务层组件(涩为斯)

@Component用于泛指组件(啃跑内特)

@ComponentScan用于组件扫描等等(啃跑耐斯但)

Spring MVC

什么是Spring MVC?简单介绍下你对Spring MVC的理解?

Spring MVC是一个基于Java的实现了MVC设计模式的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

特点:

约定优于配置

与spring兼容性非常好

对 ajax 的支持:

只需要一个注解 @ y(古瑞坊坊嘚) 就可以实现了

MyBatis

什么是MyBatis?

答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。

其主要就完成2件事情:封装JDBC操作,利用反射打通Java类与SQL语句之间的相互转换

MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,方便地写出SQL和方便地获取SQL的执行结果。

MyBatis运行原理

当框架启动时,通过configuration(啃非格维森)解析config.xml配置文件和mapper(卖搏).xml映射文件,映射文件可以使用xml方式或者注解方式,然后由configuration获得sqlsessionfactory(涩Q涩森法可特瑞)对象,再由sqlsessionfactory获得sqlsession数据库访问会话对象,通过会话对象获得对应DAO层的mapper对象,通过调用mapper对象相应方法,框架就会自动执行SQL语句从而获得结果。

Mybatis的一级缓存和二级缓存?

MyBatis的缓存分为一级缓存**(本地缓存)和二级缓存(全局缓存)****,一级缓存放在session(嗮森)里面,默认就有,二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable**(C瑞来斯煲)序列化接口(可用来保存对象的状态),可在它的映射文件中配置

二级缓存(全局缓存):

二级缓存是 mapper 级别的缓存,多个sqlSession去操作同一个Mapper(卖播)的sql,不管Sqlsession(色扣色神) 是否相同,只要 mapper 的 namespace(内幕是被)相同就能共享数据。也可以称之为 namespace 级别的缓存 。

Mybatis是如何进行分页的?分页插件的原理是什么?

答:

1 Mybatis使用RowBounds(肉~邦斯)对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。

2 分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

CSS

CSS指的是层叠样式表 它是一种用来表现HTML或XML等文件样式的计算机语言

HTML

HTML代表超文本标记语言它不是一种编程语言,而是一种标记语言,是网页制作所必备的。

行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

行内元素:a span(斯盼) img input(因不特) select(斯莱克特)

块级元素:div ul ol li dl dt dd h1 p

空元素:<br> <hr> <link>(林克) <meta>(迈塔)

a是超链接 br是换行 hr是一条线 img是图片 h1是标题 p是段落

jQuery

  1. jQuery是一个快速、简洁的JavaScript(java斯亏不特)框架
  2. 完善的Ajax支持
  3. 出色的浏览器兼容性
  4. jQuery倡导写更少的代码,做更多的事

jQuery 库中的 $() 是什么?

$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。

AJAX

他是指一种创建交互式网页的网页开发技术,最大的特点是可以实现局部刷新。

同步异步

同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。

异步方法一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。同步是在一条直线上的队列,异步不在一个队列上 各走各的不会阻碍调用者的工作。(异步不必等待,一般需要监听异步的结果)

Maven是什么

Maven 是专门用于构建和管理Java相关项目的工具。

Maven常用命令

  1. maven 打包:mvn package

  2. 只打jar包:mvn jar:jar

  3. 生成源码jar包:mvn source:jar

  4. 编译源代码: mvn compile

  5. 运行测试:mvn test

  6. 运行检查:mvn verify

  7. 清理maven项目:mvn clean

Git是什么

git是一种分布式的版本管理系统

Git常用命令

基本命令

add(艾特) 添加到暂存区

commit(科密特)提交到本地仓库

push(普斯)提交到远程

clone(克咯)克隆

初始化:创建一个git仓库,创建之后就会在当前目录生成一个.git的文件

git init

添加文件:把文件添加到缓冲区

git add filename

添加所有文件到缓冲区(从目前掌握的水平看,和后面加“.”的区别在于,加all可以添加被手动删除的文件,而加“.”不行):

git add .

git add --all

删除文件

git rm filename

  • 1
    点赞
  • 4
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

BUG可爱多

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值