首页 > 其他分享 >简易版八股文

简易版八股文

时间:2023-11-06 11:07:30浏览次数:23  
标签:八股文 区别 对象 Spring 简易版 线程 Java 方法

Java基础

1.JDK和JRE有什么区别

JDK:java开发工具包,为(Java)提供开发环境和运行环境; JRE:java运行环境,为(Java)提供运行环境

JDK包含JRE,运行Java程序用JRE就可以;编写Java程序就需要安装JDK

2.String属于基本的数据类型吗

String不属于,基本数据类型分为八种:byte、boolean、char、short、int、long、float、double

自动类型转换是从低到高;容量大的类型到小的必须强制类型转换

3.==和equals的区别

==对于基本类型是比较值,对于引用类型是比较引用;

equals默认情况是比较引用,只是String、Integer重写了equals,一般情况是比较值是否相等

4.两个对象的hashCode()相同,则equals()也一定为true,对吗?

不对,两个对象的 hashCode() 相同,equals() 不一定 true。

因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

5.Java中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对 象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用 StringBuffffer。

6.String str="i"与String str=new String("i")一样吗?

不一样,因为内存的分配方式不一样。前者:Java 虚拟机会将其分配到常量池中;后者会被分到堆内存中。

7.如何将字符串反转?

StringBuilder或StringBuffer的reverse()方法

8. String类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

9.Java中的Math. round(-1. 5)等于多少?

等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

10.final在Java中有什么作用

final修饰的类叫最终类,该类不能被继承、重写;final修饰的变量叫常量,常量必须初始化,初始化后不能被修改。

11. 抽象类能使用final修饰吗?

不能,定义抽象类就是让其他类继承的,定义为 final 该类就不能被继承

12.抽象类必须要有抽象方法吗?

不一定非要有抽象类

13.普通类和抽象类有哪些区别?

前者可直接实例化,后者不能; 前者不能包含抽象方法,后者可以

14.接口和抽象类有什么区别?

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符

15. Java中IO流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

16. BIO、NIO、AIO有什么区别?

  • BIO:同步阻塞式 IO,传统 IO,特点:模式简单使用方便,并发处理能力低。
  • NIO:同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过通道通讯,实现多路复用。
  • AIO:异步非堵塞 IO, 是 NIO 的升级,也叫 NIO2,异步 IO 的操作基于事件和回调机制。

17.Files的常用方法都有哪些?

  • Files. exists():检测文件路径是否存在。
  • Files. createFile():创建文件。
  • Files. createDirectory():创建文件夹。
  • Files. delete():删除一个文件或目录。
  • Files. copy():复制文件。
  • Files. move():移动文件。
  • Files. size():查看文件个数。
  • Files. read():读取文件。
  • Files. write():写入文件。

18.访问修饰符public、private、protected以及不写(默认)时的区别

简易版八股文_后端开发

19.重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于重载是实现编译时的多态性,重写是实现运行时的多态性。

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同)

与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类访问修饰符(里氏代换原则,public>protected>default>private),如果父类方法为私有则子类中就不能重写。

20.构造方法

构造方法负责对象成员的初始化工作 一、构造方法是在创建实例时会被自动调用 二、构造方法可以使用四种权限修饰符修饰。 三、方法名与类名相同(大小写也必须完全一致),一个类的构造方法可以有多个,主要靠参数区别 四、创建构造方法时系统会默认给一个无参构造方法,如果一旦定义了有参构造方法时,系统默认的无参构造方法会失效。 五、在方法名前面没有返回值类型(void也没有),构造方法不能被继承,方法内不能使用return语句

21.OOP的三大特性

封装:组成对象;

继承:建立对象之间的关系;

多态:在具备关系的对象中提高方法的扩展性

容器

1.Java容器有哪些

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

Collection:List和Set

List:ArrayList、LinkedLIst、Vector、stack

Set:HashSet、LinkedHashSet、TreeSet

Map:HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap、HashTable

2.Collection和Collections有何区别

Collection是一个集合接口

Collections是一个包装类,包含很多静态方法,不能被实例化,就像一个工具类

3.List、Set和Map之间的区别

元素是否有序、是否允许元素可重复

4.HashMap和HashTable的区别

存储:HashMap运行key和value为null,HashTable不允许

线程安全:HashMap非线程安全,HashTable线程安全

推荐使用:HashTable是保留类不建议使用,推荐单线程环境使用HashMap,多线程使用ConcurrentHashMap替代

5.如何决定使用HashMap还是TreeMap

对于增删定位元素,HashMap会更快;

对于key集合进行有序遍历就选择TreeMap

6.HashMap的实现原理

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

7.HashSet的实现原理

HashSet 是基于 HashMap 实现的,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

8.ArrayList和LinkedList的区别

数据结构实现:前者是动态数组,后者是双向链表

增加和删除效率:LinkedList比ArrayList效率要高

随机访问效率:ArrayList 比 LinkedList效率要高

9.如何实现数组和List之间的转换

数组转List:Array.asList(array)

List转数组:toArray

10.ArrayList和Vector的区别

线程安全:Vector是线程安全的(使用Synchronized实现线程同步),而 ArrayList 是非线程安全的

性能:ArrayList比Vector好

扩容:两者都会根据实际的需要动态的调整容量,Vector每次扩容增加1倍,ArrayList只会增加50%

11.Array和ArrayList的区别

Array 可以存储基本数据类型和对象,ArrayList 只能存储对象

Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。

Array 内置方法没有 ArrayList 多

12.在Queue(队列)中poll()和remove()的区别

相同点:都是返回第一个元素,并在队列中删除返回的对象。

不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

13.哪些集合类是线程安全的

Vector、HashTable、Stack、ConcurrentHashMap

14.迭代器Iterator,其特点

Iterator 接口提供遍历任何 Collection 的接口。

Iterator 的特点是更加安全,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModifificationException 异常。

15.Iterator和ListIterator的区别

Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。

Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。

16.确保一个集合不被修改

可使用Collections.unmodifiableCollection(Collection c)方法来创建一个只读集合,修改该集合就会抛出异常

MySQL

1.数据库的三范式

  1. 强调是列的原子性
  2. 要求实体的属性完全依赖于主关键字
  3. 任何非主属性不依赖于其他非主属性

2.ACID

原子性、一致性、隔离性、耐久性

3.一张自增表里面总共有7条数据,删除了最后2 条数据,重启MySQL数据库,又插入了一条数据,此时id是? MySQL常用引擎

MySQL常用引擎有InnoDB、MyISAM

表类型为InnoDB,此时的id为6;表类型为MyISAM,此时的id为8

MyISAM是MySQL5.5之前的默认引擎,不提供事务的支持、行锁和外键

4.MySQL的行锁和表锁

MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁

  • 表级锁:开销小,加锁快,不会出现死锁。锁力度大,锁冲突的概率大,并发度低
  • 行级锁:开锁大,加锁慢,会出现死锁。锁力度小,锁冲突的概率小,并发度高

5.char和varchar的区别

char为固定长度类型,优点:效率高;缺点:占用空间,适用于MD5;

varchar为可变长度,从空间上可考虑用它

6.float和double的区别

float最多可存储8位的十进制,并在内存中占4字节;

double最多可存储16位的十进制,并在内存中占8字节。

7.MySQL索引的实现

通过特定查找算法的数据结构实现:B+树,一般情况,根节点会被存储在内存中,其他节点存储在磁盘中,通过链表将叶子节点串联在一起,方便按区间查找;做到时间、空间的平衡,既保证了执行效率,又节省了内存。

8.验证MySQL的索引是否满足需求

通过explain

9.数据库的事务隔离

未提交读:最低隔离级别,会出现幻读、脏读、不可重复读

提交读:会出现幻读、不可重复读

可重复:默认级别,会造成幻读

序列化:代价最高最可靠的隔离级别,能防止以上情况发生

幻读:同一个事务内多次查询返回的结果集不一样

脏读:表示一个事务能够读取另一个事务中还未提交的数据

不可重复读:一个事务内,多次读同一数据

10.MySQL的内、左右连接的区别

使用内连接时,匹配的关联数据会展示,不符合连接条件的数据,(不管是左表中的还是右表中的)都不会被组织到结果集中

使用左外连接时,对于不符合连接条件的数据,左表中的内容依然会被组织到结果集中,结果集中该条数据对应的右表部分为 null;右连接相反

11.乐观锁和悲观锁

乐观锁:新增version字段来判断,提交更新时别人有没有去更新这个数据

悲观锁:用户拿到数据都会上锁,阻止其他用户,直到该锁被释放才能使用

12.MySQL问题排查有哪些手段

explain命令查询SQL语句执行计划

开启慢查询日志,查询慢查询的SQL

13.如何做MySQL的性能优化

  • 为搜索字段创建索引
  • 避免使用select *
  • 选择正确的存储引擎
  • 垂直分割分表

多线程

1.并行和并发的区别

并行:多个处理器或多核处理器同时处理多个任务。

并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行。

从逻辑上来看那些任务是同时执行。

2.线程和进程的区别

一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。

进程是资源分配的最小单位,线程是CPU调度的最小单位

3.守护线程

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

在 Java 中垃圾回收线程就是特殊的守护线程。

4.创建线程有哪几种方式

  1. 继承Thread重写run方法
  2. 实现Runnable接口
  3. 实现Callable接口

5.Runnable和Callable的区别

Runnable没有返回值,Callable有返回值

6.线程有哪些状态

  • NEW 尚未启动
  • RUNNABLE 正在执行中
  • BLOCKED 阻塞的(被同步锁或者IO锁阻塞)
  • WAITING 永久等待状态
  • TIMED_WAITING 等待指定的时间重新被唤醒的状态
  • TERMINATED 执行完成

7.sleep()和wait()的区别

类的不同:sleep() 来自 Thread,wait() 来自 Object。

释放锁:sleep() 不释放锁;wait() 释放锁。

用法不同:sleep() 时间到会自动恢复;wait() 可以使用 notify()/notifyAll()直接唤醒。

8.notify()和notifyAll()的区别

notifyAll()会唤醒所有的线程,notify()之后唤醒一个线程。

9.线程的run()和start()的区别

start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。

10.线程池都有哪些状态

  • RUNNING
  • SHUTDOWN
  • STOP
  • TIDYING
  • TERMINATED

11.线程池中submit()和execute()的区别

execute():只能执行 Runnable 类型的任务。

submit():可以执行 Runnable 和 Callable 类型的任务。

12.在Java线程中如何保证多线程的运行安全

方法一:使用安全类,比如 Java. util. concurrent 下的类。

方法二:使用自动锁 synchronized。

方法三:使用手动锁 Lock。

13.多线程中synchronized所升级的原理

--

14.Synchronized底层实现原理

synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。

15.synchronized和volatile的区别

volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。

volatile 仅能实现变量的修改可见性,不能保证原子性;而synchronized 则可以保证变量的修改可见性和原子性。

volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

16.synchronized和Lock的区别

synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

17.synchronized和ReetrantLock的区别

ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;

ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;

ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

18.死锁

AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁

19.防止死锁

尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

尽量使用 Java. util. concurrent 并发类代替自己手写锁。

尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

尽量减少同步的代码块。

20.atomic的原理

atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法来保证原子操作,从而避免 synchronized 的

高开销,执行效率大为提升。

网络

后续更新

异常

1. final的作用 *

final关键字可以修饰类、方法和属性。

当final修饰类的时候,表明这个类不能被继承。

当final修饰方法的时候,表明这个方法不能被重写。

当final修饰属性(变量)的时候,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象

(如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用)

2. final、finally、finalize 的区别

final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。

finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果finally 部分存在,则一定会执行 finally 里面的代码。

finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。

反射

1.反射

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

2.java序列化,什么情况需要序列化

Java 序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。

以下情况需要使用 Java 序列化:

  • 想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 想用套接字在网络上传送对象的时候;
  • 想通过RMI(远程方法调用)传输对象的时候。

3.动态代理的概念以及实现,有哪些应用

动态代理是运行时动态生成代理类。

JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。

动态代理的应用有 spring aop、hibernate 数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。

JavaWeb

1.JSP和Servlet的区别

JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。

两者都可生成动态网页

JSP的优点是擅长用于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错

Servlet的优点是处理流程和业务逻辑,缺点是生成动态网页不直观

2.JSP和Servlet的工作原理和生命周期

Servlet生命周期3个阶段:

  1. 容器初始化,即init()
  2. 调用service(),判断客户端的请求方式
  3. 销毁destory()

JSP也类似于上面的3个阶段

Servlet的工作原理:

先解释Servlet接收和响应客户请求的过程,首先客户发送个请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service()方法。Service()方法从ServletRequest对象获得客户请求信息,处理该请求,然后通过ServletResponse对象向客户返回响应信息。(并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。)

JSP的工作原理:

  1. 用户访问JSP页面,会向Servlet容器发出请求
  2. 第一次请求访问或页面改动,Servlet容器会把jsp文件转换为servlet代码(test.jsp→test.java),再转化成class文件,这个编译过程会比较耗时
  3. JSP容器负责调用转换后Servlet,Servlet负责提供服务相应用户请求,多请求,容器就会建立多个线程处理多个请求
  4. 容器执行class文件(字节码文件),将结果返回客户端

3.避免SQL注入

使用预处理 PreparedStatement。

使用正则表达式过滤掉字符中的特殊字符。

4.什么是XSS攻击,如何避免

XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。

预防 XSS 的核心是必须对输入的数据做过滤处理。

5.什么是CSRF攻击,如何避免

CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送 恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟币转账等。

防御手段:

验证请求来源地址;

关键操作添加验证码;

在请求地址添加 token 并验证

Spring/SpringMVC

1.Spring

  1. 提供IOC技术,容器会帮你管理依赖的对象,实现了程序的解耦。
  2. 提供事务支持,使得操作变得更加方便
  3. 提供AOP,更方便处理某一类问题
  4. 方便集成其他框架,ORM框架(Mybatis、Hibernate)

2.IOC

由Spring来负责控制对象的生命周期和对象间的关系。容器会帮你管理依赖的对象。

3.AOP

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,比如统一处理日志、异常等。

4.SpringMVC运行流程

简易版八股文_Java_02

  1. spring mvc 先将请求发送给 DispatcherServlet。
  2. DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
  3. DispatcherServlet 再把请求提交到对应的 Controller。
  4. Controller 进行业务逻辑处理后,会返回一个ModelAndView。
  5. Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
  6. 视图对象负责渲染返回给客户端。

5.@Component和@Bean的区别

  1. 两者都是为Spring容器注册Bean,作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。
  2. @Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中,告知Spring要为这个类创建Bean (我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中) @Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean的逻辑,Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean
  3. @Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

SpringBoot

1.SpringBoot自动装配原理

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

XxxxProperties类的含义是:封装配置文件中相关属性;

XxxxAutoConfiguration类的含义是:自动配置类,目的是给容器中添加组件。

而其他的主方法启动,则是为了加载这些五花八门的XxxxAutoConfiguration类。

2.SpringBoot和SpringCloud的区别

springboot是开发框架,springcloud是解决方案。

  1. SpringBoot是Spring的一套快速配置脚手架,可以基于Spring boot快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的微服务解决方案,每一个微服务解决方案都是基于Spring Boot构建的。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等,都可以用SpringBoot的做到一键启动和部署。
  2. SpringBoot专注于快速、方便集成的单个个体,SpringCloud是关注全局的服务治理框架。
  3. Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,SpringCloud很大的一部分是基于SpringBoot来实现。
  4. SpringBoot可离开SpringCloud独立使用开发项目,但Spring Cloud离不开SpringBoot,属于依赖的关系

Linux

1.Chmod

Linux chmod命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

读:4,写:2,执行:1

设计模式(三大类)

  • 创建型模式
  • 工厂方法模式
  • 抽象工厂模式
  • 单例模式
  • 建造者模式
  • 原型模式
  • 结构型模式
  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式
  • 过滤器模式
  • 行为型模式
  • 策略模式
  • 空对象模式
  • 观察者模式
  • 迭代器模式
  • 责任链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 中介者模式
  • 解释器模式

1.单例模式

1、将构造方法私有化(保证外部不能直接构造) 2、有一个静态属性指向实例 3、提供一个公有的静态方法向外面提供这个实例

优势:节约系统的资源开销,避免共享资源的多重占用

缺点:单例模式没有抽象类,扩展很困难,除了修改代码没有其他途径,不适用多变的对象,滥用单例会带来一些负面问题

适用场景:对于那种经常实例化但是过一会就销毁的对象;对于创建对象需要消耗很多资源的对象。如:数据连接池对象、线程池对象等。

饿汉式单例:类被加载时就会实例化一个对象,占用内存资源

public class Solution{
    private Solution(){
    }
    private static Solution solution = new Solution();
    
    public static Solution getSolution(){
        return solution;
    }
}

懒汉式单例:等到需要时在实例化,使用同步锁解决多线程问题

public class Singleton{
    private static Singleton singleton;
    private Singleton(){
    }
    
    public static synchronized Singleton getInstance(){
        if(singleton==null){
        	singleton = new Singleton();    
        }
        return singleon;
    }
}

Elasticsearch

1.Elasticsearch比MySQL的优势在哪里

(or) 为什么要使用Elasticsearch

MySQL: 1、MySQL的海量数据时,搜索效率比较低,使用Like关键词,如果%放左边,执行全表扫描,导致性能差 2、MySQL的搜索功能比较弱,只有like这种模糊搜索

Elasticsearch: 1、Elasticsearch采用倒排索引法检测数据,从而效率更高 2、Elasticsearch拥有大量复杂场景搜索的API(高亮显示,拼音搜索,地理位置检索),更加适合数据搜索场景

2.请说说Elasticsearch倒排索引原理

1、首先,Elasticsearch将文档数据进行索引构建。将文档数据需要分词的字段内容使用分词器进行分词,并记录每个词条和原文档的出现位置和出现频率等信息,构建出文档的索引库。 2、然后,用户搜索时,可以对关键词进行分词,使用分词后词条来匹配索引库,在索引库匹配到记录后,通过文档位置和频率信息,反查具体的文档数据

3.请说说什么是分词器?ES有哪些常用的分词器?

分词器是Elasticsearch用于对内容进行分词的工具(程序)。 Elasticsearch内置许多分词器,默认使用Standard标准分词器,而标准分词器对中文支持并不好友(因为它对中文进行单字分词) 所以在开发中进行中文分词时使用第三方的ik分词器,ik分词器内置有ik_smart和ik_max_word算法,ik_smart是最小分词器法,ik_max_word是最细分词法。

4.你们项目的日志怎么管理的?

(or) 你们项目在线上出问题,怎么最快发现问题的?

通常我之前待的公司上线的项目,都会由运维那边搭建日志分析平台。 我了解到上家搭建的是ELK平台(Elasticsearch+Logstash+Kibana),这个平台会自动采集项目运行的日志,并且进行分析。 运维人员只要到Kibana查看日志即可,当然ELK平台也设计一个告警规则,当系统出现异常时,自动给运维实时通知(短信+电话)。

5.MySQL、Redis、MongoDB、Elasticsearch各自的优势

MySQL:是关系型数据库,磁盘。 有复杂表关系(一对一,一对多,多对多),并且有完善事务机制(ACID)。 e.g. 用户,订单,商品 Redis: 非关系数据库,内存。 Redis建议只存储热点(用户查询频率极高)的数据,且数据量相对小的数据。 e.g. 秒杀的库存量,手机验证码,用户token MongoDB: 非关系数据库,磁盘。 MongoDB适合相对高频查写(增删改)的海量数据。 e.g. 评论 Elasticsearch: 非关系数据库,磁盘。 Elasticsearch适合海量数据的复杂检索。 e.g. 商品搜索 效率: Redis > MongoDB /Elasticsearch:> MySQL

标签:八股文,区别,对象,Spring,简易版,线程,Java,方法
From: https://blog.51cto.com/u_16302150/8202134

相关文章

  • 简易版-软件定时器
    main.c#include<stdio.h>#include<stdlib.h>#include"sw_timer.h"#include"windows.h"/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/voidtimer1(void*par......
  • C语言项目——简易版贪吃蛇
    使用工具CLion2022前期准备导入第三方库Easyx,详细教程=>在CLion、Dev-C++或Code::Blocks下面配置EasyX(2023-7-23更新)-CodeBus运行效果代码实现/**1.定义蛇结构*2.定义食物结构*3.游戏初始化*4.蛇行进*5.按键控制(方向,暂停)*6.吃食物*7.死亡判......
  • 八股文 判断前后端bug
    原文连接 https://www.cnblogs.com/history0403/p/14952105.html如何判定一个bug是前端bug还是后端bug首先需要了解一个页面的请求过程:以http请求为例:1、用户在前端页面操作,如点击某个提交按钮2、页面携带数据进行请求,访问具体功能接口3、由后端服务执行相应的业务逻辑,如......
  • 八股文 更换头像测试点
    原文链接:https://blog.csdn.net/m0_60054525/article/details/129148291更换头像的测试点(站在app的角度来分析)功能测试:1,点击头像可以放大观看2,查看头像是否支持放大,缩小3,刚创建账号时是否显示默认头像4,查看头像之后点击其它区域自动退出5,头像支持的图片格式,图片大小6,支持相......
  • 一天吃透Java并发面试八股文
    内容摘自我的学习网站:topjavaer.cn分享50道Java并发高频面试题。线程池线程池:一个管理线程的池子。为什么平时都是使用线程池创建线程,直接new一个线程不好吗?嗯,手动创建线程有两个缺点不受控风险频繁创建开销大为什么不受控?系统资源有限,每个人针对不同业务都可以手动......
  • 一天吃透JVM面试八股文
    内容摘自我的学习网站:topjavaer.cn什么是JVM?JVM,全称JavaVirtualMachine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序......
  • 这可能是最全面的TCP面试八股文了
    计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才。说说TCP的三次握手假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED。最全面的Java面试网站第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向......
  • 2023最新发布!三天吃透Android面试八股文,面试通过率暴涨!
    前言很多开发者都知道,现在的面试从头到尾都是比较有深度的技术问题,虽然那些问题看上去在网上都能查到相关的资料,但面试官基本都是根据你的回答持续深入,如果没有真正对技术原理和底层逻辑有一定的了解是无法通过的。如今,国内移动互联网的红利期已经过去,在Android领域找工作并不是一......
  • 前端面试八股文 工程化+性能优化+计算机基础
    前端面试八股文工程化+性能优化+计算机基础前端页面性能如何优化?以下是一些前端性能优化的常用方法:减少资源加载时间:这可以通过多种方式实现,比如压缩和合并CSS和JavaScript文件,使用CDN(内容分发网络)来快速传输资源,以及使用浏览器缓存来避免重复下载。优化图片:图片通常是网页......
  • 前端面试八股文 Vue
    前端面试八股文Vue讲一下Vue框架的原理?我们使用Vue开发应用,实际上是编写若干Vue组件,实现模板、data、生命周期钩子等,然后执行newVue(),将根组件挂载到指定的DOM节点上面,当我们编写的组件中生命周期钩子里面的或者在模板的元素事件中改变数据时候,视图会响应地更新。这样就实现了......