基础
常用端口
- HTTP服务器,默认端口号为80/tcp
- HTTPS(securely transferring web pages)服务器,默认端口号为443/tcp 443/udp
- Oracle 数据库,默认的端口号为1521
- mySql 默认的端口号为3306
- TOMCAT,默认端口号为8080
JVM
- JVM的体系结构
- 类加载器
- 双亲委派机制
- 方法区(共享区间)JDK7和JDK8差异与堆和方法区探索_ShyTan的博客-优快云博客
- 堆Heap (每个JVM中唯一)
- 栈(桶型 先进后出)
- 队列(管型 先进先出)
- GC常用算法(标记清除法、标记压缩、复制算法、引用计数器法)
狂神JVM详解:https://blog.youkuaiyun.com/ShyTan/article/details/110235781
面试题:Java面试题(JVM)_ShyTan的博客-优快云博客_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的博客-优快云博客
JVM堆内存参数设置
jvm的优化
a) 设置参数,最大堆内存 -Xmx某某m ,初始堆内存 -Xms某某m,可设置相同,防止垃圾回收完jvm重新分配
b) 垃圾回收器的选择:串行收集器、并行收集器、并发收集器 ,用-XX:+Use某某GC
类的加载机制和初始化顺序
- 顺序:父类的静态代码块->子类的静态代码块->初始化父类的属性值/父类的普通代码块->父类的构造方法->初始化子类的属性值/子类的普通代码块
- 加载过程:加载,连接,初始化,使用,卸载
类的加载详细:Java类的加载机制(类加载和初始化顺序)_ShyTan的博客-优快云博客
对象的创建过程
a) 遇到一个新类时,会进行类的加载,定位到class文件
b) 对所有静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次
c) New 对象时,jvm会在堆中分配一个足够大的存储空间
d) 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null
e) 根据书写的位置给字段一些初始化操作
f) 调用构造器方法(没有继承)
基本数据结构
数组、链表、树(二叉树)、图(有向无向图)
详解:数据结构:八大数据结构分类及图解_ShyTan的博客-优快云博客_所有数的分类结构图
list、set、map
Collection集合接口,List、set实现Collection接口,arraylist、linkedlist,vector实现list接口,stack继承vector,Map接口,hashtable、hashmap实现map接口
详解:List、Set、Map等Java集合类_ShyTan的博客-优快云博客
HashMap和Hashtable
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
详解:HashMap和Hashtable_ShyTan的博客-优快云博客
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的博客-优快云博客
十大经典排序
详解:十大经典排序动图理解(含java代码实现)_ShyTan的博客-优快云博客
数据库
数据库约束和索引
- 主键是一种约束,目的是对这个表的某一列进行限制;
- 唯一索引是一种索引,索引是数据库表的一个冗余结构,目的是为了更好的查询;
- 主键列不允许为空值,而唯一性索引列允许空值;
- 一个表最多只能一个主键,但是可以包含多个唯一索引;
- create [unique] index idxname on tabname(col….)
详解:约束与索引详解_ShyTan的博客-优快云博客_约束与索引
数据库表关联
关联查询(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的博客-优快云博客
数据库优化
与索引有关,适当创建索引,删除无用索引,写好语句使用索引
详解:数据库优化中sql语句的优化_ShyTan的博客-优快云博客
事务
事务具有原子性,一致性,持久性,隔离性
b) 原子性:是指在一个事务中,要么全部执行成功,要么全部失败回滚。
c) 一致性:事务执行之前和执行之后都处于一致性状态
d) 持久性:事务多数据的操作是永久性
e) 隔离性:当一个事务正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。
JavaWeb
HTTP协议get、post区别
- get携带参数与访问地址传送,用户可以看见,这的话信息会不安全,导致信息泄露。post则将字段与对应值封装在实体中传送,这个过程用户是不可见的。
- Get传递参数有限制,而post无限制。
Spring
学习:一篇文章教你学会并使用spring-转自狂神_ShyTan的博客-优快云博客
面试题:Spring面试题汇总_ShyTan的博客-优快云博客
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的博客-优快云博客
多线程
多线程概述和具体使用
线程中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, 优先级执行。
详解:
- newCachedThreadPool 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖 于操作系统(或者说JVM)能够创建的最大线程大小。
- newFixedThreadPool 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束 ,那么线程池会补充一个新线程。
- newScheduledThreadPool 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
- newSingleThreadExecutor 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
高并发处理
了解一点高并发性问题,比如一W人抢一张票时,如何保证票在没买走的情况下所有人都能看见这张票,显然是不能用同步机制,因为synchronize是锁同步一次只能一个人进行。
这时候可以用到锁机制,采用乐观锁可以解决这个问题。乐观锁的简单意思是在不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的可读性,又保证保存数据的排他性,保证性能的同时解决了并发带来的脏读数据问题。
JUC
面试题:Java面试题(JUC)_ShyTan的博客-优快云博客_java juc面试题
MyBatis
学习:一篇文章教你学会并使用Mybatis-转自狂神_ShyTan的博客-优快云博客
面试题:MyBatis面试题_ShyTan的博客-优快云博客
Srpingboot
微服务概念:Microservices(微服务)--Martin Fowler_ShyTan的博客-优快云博客 有时间多读几遍
学习:一篇文章教你学会并使用SprintBoot-转自狂神_ShyTan的博客-优快云博客_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的博客-优快云博客
中间件
Tomcat服务器优化(内存,并发连接数,缓存)
a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。
b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。
c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。