Java常见面试题记录(自用for快速复习)

基础

常用端口

  • HTTP服务器,默认端口号为80/tcp
  • HTTPS(securely transferring web pages)服务器,默认端口号为443/tcp  443/udp
  • Oracle 数据库,默认的端口号为1521
  • mySql 默认的端口号为3306
  • TOMCAT,默认端口号为8080

JVM

狂神JVM详解:https://blog.csdn.net/ShyTan/article/details/110235781

面试题:Java面试题(JVM)_ShyTan的博客-CSDN博客_java面试题jvm

Java运行时的数据区(方法区与堆是线程共享的)

  • 方法区(Method Area) :存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 堆(Heap): 存放对象实例,几乎所有对象实例都在这里分配内存
  • 虚拟机栈(VM Stack): 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Frame(方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
  • 本地方法栈(Native Method Stack):  与虚拟机栈了类似,不过则为虚拟机使用的到的Native方法服务。(有的虚拟机譬如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一)
  • 程序计数器(Program Counter Register): 可看作当前线程所执行的字节码的行号的标识器.

JVM垃圾回收GC

新生区 轻量级GC(轻GC)

  • 伊甸园区、幸存区012345...   ,N次(定义上限)垃圾回收之后,进入老年区

老年区:重量级GC(Full GC)

  • GC,主要在伊甸园区和老年区。内存满了,报OutOfMemory堆内存错误。99%的对象都是临时对象,进不到老年区。

垃圾回触发条件,及垃圾回收几种算法-详解:JVM中垃圾回收_ShyTan的博客-CSDN博客

JVM堆内存参数设置

jvm的优化

a) 设置参数,最大堆内存 -Xmx某某m ,初始堆内存 -Xms某某m,可设置相同,防止垃圾回收完jvm重新分配

b) 垃圾回收器的选择:串行收集器、并行收集器、并发收集器 ,用-XX:+Use某某GC

详解:JVM堆内存设置原理_ShyTan的博客-CSDN博客

类的加载机制和初始化顺序

  • 顺序:父类的静态代码块->子类的静态代码块->初始化父类的属性值/父类的普通代码块->父类的构造方法->初始化子类的属性值/子类的普通代码块
  • 加载过程:加载,连接,初始化,使用,卸载

类的加载详细:Java类的加载机制(类加载和初始化顺序)_ShyTan的博客-CSDN博客

对象的创建过程

a) 遇到一个新类时,会进行类的加载,定位到class文件

b) 对所有静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次

c) New 对象时,jvm会在堆中分配一个足够大的存储空间

d) 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null

e) 根据书写的位置给字段一些初始化操作

f) 调用构造器方法(没有继承)

基本数据结构

数组、链表、树(二叉树)、图(有向无向图)

详解:数据结构:八大数据结构分类及图解_ShyTan的博客-CSDN博客_所有数的分类结构图

list、set、map

Collection集合接口,List、set实现Collection接口,arraylist、linkedlist,vector实现list接口,stack继承vector,Map接口,hashtable、hashmap实现map接口

详解:List、Set、Map等Java集合类_ShyTan的博客-CSDN博客

HashMap和Hashtable

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

详解:HashMap和Hashtable_ShyTan的博客-CSDN博客

Arraylist与linkedlist的区别

a) 都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构。

b) 当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。

c) 当增加元素与删除元素时,linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据,但因为含有大量的指针域,占用空间较大;。

Java异常及处理详解

  • try 代码逻辑 必执行
  • catch 出现异常时 捕获对应的异常 并执行其中的代码
  • finally 不管出不出异常,最后都要执行

重载和重写的区别

    override(重写)

      1. 方法名、参数、返回值相同。

      2. 子类方法不能缩小父类方法的访问权限。

      3. 子类方法不能抛出比父类方法更多的异常(子类方法可以不抛出异常)。

      4. 存在于父类和子类之间。

      5. 方法被定义为final不能被重写。

    overload(重载)

      1. 参数类型、个数、顺序至少有一个不相同。

      2. 不能重载只有返回值不同的方法名。

      3. 同一个类中的方法。

final

1)final修饰的方法,不允许被子类重写。

2)final修饰的类,不能被继承。

3)final修饰的变量,不能改变值。

static

static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。

static不可以修饰局部变量。

static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。

static修饰的对象只有一个值。

单列模式,工厂模式

a) 单例模式

核心:单例类必须自己创建自己的唯一实例,而且自行实例化并向整个系统提供这个实例

理解:比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。

饿汉式和懒汉式:饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

  • 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题
  • 懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。

b) 工厂模式

核心:简单的工厂模式主要是统一提供实例对象的引用,通过工厂模式接口获取实例对象的引用。

理解:比如一个登陆功能,后端有三个类,controller类,interface类,实现接口的实现类。当客户端发出一个请求,当请求传到controller类中时,controller获取接口的引用对象,而实现接口的实现类中封装好了登陆的业务逻辑代码。当你需要加一个注册需求的时候只需要在接口类中加一个注册方法,实现类中实现方法,controller获取接口的引用对象即可,不需要改动原来的代码,这种做法是的可拓展性强。

详解:23种设计模式汇总整理_ShyTan的博客-CSDN博客

十大经典排序

详解:十大经典排序动图理解(含java代码实现)_ShyTan的博客-CSDN博客

数据库

数据库约束和索引

  • 主键是一种约束,目的是对这个表的某一列进行限制;
  • 唯一索引是一种索引,索引是数据库表的一个冗余结构,目的是为了更好的查询;
  • 主键列不允许为空值,而唯一性索引列允许空值;
  • 一个表最多只能一个主键,但是可以包含多个唯一索引;
  • create [unique] index idxname on tabname(col….)

详解:约束与索引详解_ShyTan的博客-CSDN博客_约束与索引

数据库表关联

关联查询(left join on)(增加列)

  • 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
  • SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

union与unionAll  (增加行)

  • UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。
  • UNION ALL,不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

常用sql语句大全:常用SQL语句大全_ShyTan的博客-CSDN博客

数据库优化

与索引有关,适当创建索引,删除无用索引,写好语句使用索引

详解:数据库优化中sql语句的优化_ShyTan的博客-CSDN博客

事务

事务具有原子性,一致性,持久性,隔离性

b) 原子性:是指在一个事务中,要么全部执行成功,要么全部失败回滚。

c) 一致性:事务执行之前和执行之后都处于一致性状态

d) 持久性:事务多数据的操作是永久性

e) 隔离性:当一个事务正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。

使用详解:MySQL事务_ShyTan的博客-CSDN博客

JavaWeb

HTTP协议get、post区别

  • get携带参数与访问地址传送,用户可以看见,这的话信息会不安全,导致信息泄露。post则将字段与对应值封装在实体中传送,这个过程用户是不可见的。
  • Get传递参数有限制,而post无限制。

Spring

学习:一篇文章教你学会并使用spring-转自狂神_ShyTan的博客-CSDN博客

面试题:Spring面试题汇总_ShyTan的博客-CSDN博客

servlet执行流程

    客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。

AOP与IOC的概念(即spring的核心)

     a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。

    b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

Spring注入三种方式

  • 构造方法注入
  • set注入
  • 注解注入

详解:Spring常用的三种注入方式_ShyTan的博客-CSDN博客

多线程

多线程概述和具体使用

理论:多线程入门讲解_ShyTan的博客-CSDN博客

实现:线程具体使用_ShyTan的博客-CSDN博客

线程中sleep()与wait()的区别

对时间的指定。 
1,sleep方法必须指定时间。 
2,wait方法有重载形式,可以指定时间,也可以不指定时间。

对于执行权和锁的操作.: 
1,sleep():释放执行权,不释放锁,因为肯定能醒,肯定可以恢复到临时阻塞状态。 
2,wait():释放执行权,释放锁,因为wait不释放锁,如果没有时间指定,那么其他线程都进行不了同步中,无法将其唤醒。

来源:

  • 这两个方法来自不同的类分别是Thread和Object

作用域

  • wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
      synchronized(x){ 
             x.notify() 
    
             //或者wait() 
    
      } 

异常捕获

  • sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 

线程池

newCachedThreadPool

  • 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool

  • 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool

  • 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor

  • 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级执行。

详解:

  1. newCachedThreadPool 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖 于操作系统(或者说JVM)能够创建的最大线程大小。
  2. newFixedThreadPool 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束 ,那么线程池会补充一个新线程。
  3. newScheduledThreadPool 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
  4. newSingleThreadExecutor  创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

 线程池中各个参数的含义_ShyTan的博客-CSDN博客

高并发处理

了解一点高并发性问题,比如一W人抢一张票时,如何保证票在没买走的情况下所有人都能看见这张票,显然是不能用同步机制,因为synchronize是锁同步一次只能一个人进行。

这时候可以用到锁机制,采用乐观锁可以解决这个问题。乐观锁的简单意思是在不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的可读性,又保证保存数据的排他性,保证性能的同时解决了并发带来的脏读数据问题。

JUC

面试题:Java面试题(JUC)_ShyTan的博客-CSDN博客_java juc面试题

MyBatis

学习:一篇文章教你学会并使用Mybatis-转自狂神_ShyTan的博客-CSDN博客

面试题:MyBatis面试题_ShyTan的博客-CSDN博客

Srpingboot

微服务概念:Microservices(微服务)--Martin Fowler_ShyTan的博客-CSDN博客 有时间多读几遍

学习:一篇文章教你学会并使用SprintBoot-转自狂神_ShyTan的博客-CSDN博客_sprintboot

Dubbo+Zookeeper

总结:Dubbo缺省协议采用单一长连接和NIO异步通讯。

作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!
作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并且订阅configurators,服务消费端订阅provide,configurators,routers,订阅变更时,zk会推送providers,configuators,routers,启动时注册长连接,进行通讯!proveider和provider启动后,后台启动定时器,发送统计数据到monitor(监控中心)!提供各种容错机制和负载均衡策略!!

Dubbo的底层实现原理和机制_ShyTan的博客-CSDN博客

中间件

Tomcat服务器优化(内存,并发连接数,缓存)

a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。

b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。

c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。

消息队列

IBM Websphere mq

个人理解:IBM Websphere mq消息队列的理解_ShyTan的博客-CSDN博客

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShyTan

喜欢的给点打赏呗,纯手打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值