基础类型:八大类
char boolean byte int short long float double
byte 8位 一个字节
封装类:Character Boolean Short Float Double Integer Long Byte
TCP三次握手:客户端需要建立连接,发送一个同步序列包SYN报文到服务器并进入一个SYN_SEND状态,服务器接收到数据包之后,检查SYN是否正确,正确的话回复一个自己的SYN报文并加上一个ACK包,这个ACK包的值是客户机发送的SYN包值+1,客户机收到数据包后,也返回一个ACK包,值是服务器的SYN包值+1,并进入一段时间的等待连接状态,等待时间过后开始向服务器发送数据,而服务器接收到客户机发送的ACK包也就进入了连接状态,此时,双方连接成功
为什么要三次握手: 第一次握手,客户机发送SYN到服务器收到数据包,表明客户机发送数据功能正常;当服务器发送一个SYN和ACK包并被客户机接收到时,客户机确认服务器的发送数据能力和接收数据能力都正常;但是此时服务器只确认了客户机的发送能力,并没有确认客户机的接受能力,所以需要第三次握手,等待客户机返回一个ACK包,这样双方的发送和接受能力都正常了,再建立连接,更为安全(序列号是动态生成的哦)(并且第三次握手的时候,客户机是能携带数据的,因为客户机已经确认服务器接收和发送能力都是正常的)
首先双方是出于一个establised状态,假如客户机需要断开请求,发送一个FIN报文给服务器,服务器接收到FIN后,返回一个ACK,值是FIN+1,客户机收到ACK,进入CLOSE_WAIT状态,此时,服务器也需要断开连接请求到客户机,发送一个FIN包,客户机接收到后发返回一个ACK,等服务器接收到ACK,双方连接关闭
从用户在浏览器输入域名,到浏览器显示出页面,中间发生了什么?
在浏览器输入域名之后,浏览器先查看本地hosts文件有没有该域名对应的ip地址,有就直接返回该ip地址,没有的话发送一个DNS请求到DNS服务器中去,DNS解析域名,在DNS解析域名的过程中,首先,DNS服务器先查看它自己的缓存记录,如果有域名对应的ip地址就返回给浏览器,没有就向根NDS服务器发送请求,根DNS服务器根据域名返回相应的域名(.com .cn)服务器的ip地址给DNS服务器,DNS服务器再向域服务器发送请求,域服务器就会返回对应的ip地址递归到DNS服务器,然后DNS服务器返回网站,浏览器再把得到的ip地址转换为HTTP服务请求,服务器收到HTTP请求之后,返回页面信息到浏览器,浏览器将这些信息组织长用户可以查看的网页形式
对封装继承和多态的理解:
封装:隐藏对象的属性和实现细节,仅提供对外方式,便于控制调用类的访问权限
继承(单继承):便于重写方法,减少代码量,只能继承非父类private方法和构造器,如要使用父类构造器,使用super(),或者当父类只有默认构造器的时候,Java会默认调用父类的构造器给子类
向上转型:将子类当作父类使用,在父类的构造函数中使用子类作为参数
多态(接口的实现):继承和接口都可以实现多态,需要有继承或者实现关系,子类能够重写父类的方法,能够实现向上转型
什么是数据结构:不同存储方式的一直存储容器
什么是数组:数组是将相同数据类型的数据存储在连续的空间的数据结构
String类可以被继承吗?
String类是被设计成不可变不可继承的
原因:String类是经常被频繁使用的,设计成finnal修饰避免安全隐患和提高执行效率
ArrayList和LinkedList的区别、优缺点以及应用场景?
ArrayList是基于动态数组的数据结构,所以它的特点就是寻址空间是连续的并随数组长度的变化,空间不断变化的,当我们调用数组的get、set方法的时候,通过下标就可以访问到相应的数据,所以ArrayList是便于查询的,而LinkedList是基于链表的数据结构,链表的特点就是查询操作的复杂度相当于O(n),但是添加,删除的复杂度是O(1),因为每个节点只需要通过next和previous节点存储上一个节点和下一个节点的信息,在add和remove的时候只要修改对应位置上一个数据的next指向和下一个数据的previous指向
讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数等?
先实例化父类的静态变量,再静态代码块,子类的静态。。。。,再父类的非静态数据,构造函数,再子类的非。。。。。构造函数
JAVA Map的几种类型:HashMap、HashTable、LinkedHashMap、TreeMap、concurrentHashMap
HashMap:键值对,键必须是唯一的,所以只允许一条key为null,取得数据的顺序是随机的,线程非安全
ConcurrentHashMap:线程安全,存储方式是:红黑树 + 链表 + 数组
HashTable存储方式是:数组 + 链表;线程安全,任何时候只能写一个HashTable,速度较慢
LinkedHashMap:能够保存记录的插入顺序,是HashMap的一个子类,缺点是遍历的时候数据量过大速度就会下降
有没有有序的Map类?怎么保证有序?
LinkedHashMap(按元素进入集合的先后顺序) TreeMap(基于元素的固有顺序)
JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何?
jdk8放弃了ConcurrentHashMap的分布式锁,采用了Node锁,这样做的目的是减低锁的粒度,提高性能
继承和聚合的区别在哪?
继承:一个类继承另一个类的功能,并可以在他的基础上扩展新功能
聚合:是整体和部分的关系,整体和部分之间是可以分离的,各自有自己的生命周期
IO的模型有哪些?讲讲你理解的nio和bio、aio的区别?
nio是同步非阻塞;
bio是同步阻塞IO模型:需要采用线程池的模式,因为阻塞,bio连接请求处理IO的时候,单核的系统是处于一种阻塞的状态,多核的系统资源没有利用最大化,访问的数据量少的话就可以使用,tomcat就是用的bio;
aio是异步线程非阻塞:
反射的原理,反射创建类实例的三种方式是什么?
大家都说,没有反射就没有框架。java并不是一个动态语言,所以在程序运行的时候,java需要通过反射来动态的改变程序结构或变量值,也就是在运行的环境下,当某个地方改动的时候,可以通过反射来实现另一个地方的动态改动
原理:首先我们在开发工具上编译的时候,java代码会生成.class字节码文件储存调用节码中的构造函数、方法、变量,实例化出对象反射到我们需要它去的地方
过程:在我们需要动态改动的地方:首先获取需要反射的类,class.forName()获取我们需要的类,其次,类名.newInstance()将 类进行实例化获取对象,并通过get方法获取对象里面的构造函数、属性、方法,(三种实例化的方法1.class.forName() 2.类.class 3.对象.getClass()
反射中,Class.forName和ClassLoader区别 ?
class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。
classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
写出三种单例模式实现?
是Spring应用最广泛的设计模式之一,使某一个类只能创建一个实例
1.饿汉式:提前进行初始化并在调用的时候直接使用,执行的效率更高,会浪费内存空间
2.懒汉式:只有在调用的时候才开始初始化,节约了内存空间,但执行效率相对较低
3.注册式:这个效率是最好的,在被调用的时候加载,但是没有加锁,有上述两个模式的优点又屏蔽了他们各自的缺点
异常的两个机制以及运行时异常的五种类型?
运行时异常:在我们运行之后java给我们报的异常错误就是运行时异常
受检异常:编译器需要我们去try catch的异常就是受检异常
常见的异常有:空指针异常、类转换异常、数组越界异常、数据存储异常、还有IO操作的BufferOverflowException
在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么?
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?
序列化就是将java对象转换为字节序列的过程,反序列化是将字节序列转换为java对象的过程
前端向后端返回一个文本参数、图片、视频、音频,后端向前端返回前端要求的json格式的数据,这些我们都需要序列化,序列化就是将传递前的java对象转化为字节序列的过程
Java8常用新特性?
它好像增加了一个并发/并行的API,最重要的应该就是Lambda表达式,我们在赋值的时候可以编写一段能够传递的代码,里面可以有参数和获取该参数的方法,能够将其方法返回的数据进行赋值
函数式接口
equals()和==到底有什么区别?
==是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。
什么情况下会发生栈内存溢出?
JVM中堆(存储的单位)存放的是对象,栈(运行时存储的单位)存放的是对象的引用和基本数据类型,因为基本数据类型长度是固定且占用空间较少,放堆中浪费了空间,应该放在栈中
而栈发生了异常很可能是大量的递归调用出了问题、已经不被引用的对象过多且没有及时的进行垃圾回收,造成内存溢出、或者是出现了死循环
你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1?
常见的垃圾收集器有G1收集器(收集范围是老年代和新生代)、CMS收集器(老年代)(大的对象或者字符串是老年代,或者长时间不回收的也是老年代)
zookeeper相关面试题:
MD5加密的Java实现:
MD5:信息摘要算法(把任意长的字符串转变为一定长的整数)
终极面试:谈谈你对JVM的理解??????????
Java源码首先使用被编译成字节码,再由不同平台的JVM进行解析,这样Java语言在不同平台运行的时候不需要重新编译,Java虚拟机会在执行字节码的时候,把字节码转换成具体平台上的机器指令
jsckson工具包的使用:
实例化类ObjectMapper,调用
.wirteValue() 转成json格式
.writeValueAsString() 转成json格式,输出字符串
.readValue() 反序列化
通过序列化以字节流的形式使对象在网络中进行传递和接收
mysql:
innodb中有一个页(16KB)的数据结构可以存储更多的数据,并且在插入数据的时候会默认的对主键进行一个升序的排序,也就是当我对主键进行一个精确查找的时候,他查询的速度会更快,写的操作会更慢,因为它是排好序的(当我需要查询一个id=5,查到id=6了还没有找到,直接返回找到),但数据过大的时候,页其实是一个链表的结构,但是里面有一个页目录,能够将一些数据进行分组,以目录的形式记录起来
————————》进阶:将数据放在页中,再加上一个目录页,目录页存放每一页最小的id
接笔记本上的笔记:mysql调优:
EXtra: