一,重载和重写
重载:在一个类中,方法的方法名相同,参数类型不同,参数的顺序不同,参数的数量不同,和返回值无关
重写:发生在父子类中,方法名相同,参数相同,抛出的异常子类小于等于父类,返回值范围小于等于父类,修饰符大于等于父类,如果父类方法用private修饰,子类无法重写。
二:接口和抽象类的区别
接口:可以实现多个,定义一个接口,例如 usermapper的接口,在接口里定义要实现的方法,只关心做什么,不关心具体的实现,接口中只能存在 public abstract方法
抽象类:抽象类只能继承一个,可以有普通的成员变量,先有子后有父类,把子类公共的部分拿出来为集合b,然后形成一个抽象的父类。
优缺点:抽象类中要汇总所有子类的公共部分,代价更高,接口只定义方法,不用考虑这这些,在公司的项目中用途更广。
三:List和Set的区别
List:有序,可以重复(可以有多个null),按照对象进入的顺序进行储存元素,可以用迭代器取得元素,也可以用get(元素下标)。
Set:不可以重复(只能有一个null),无顺序,可以使用迭代器进行遍历,没有get(下表)的方法
四:hashcode和equals的区别
hashcode:
获取哈希码,根据索引,确定对象的索引位置,继承object类,所有的类都有这个方法
equals:
类似“==”,比较对象的地址,equals可以通过覆盖重写
可以比较引用类中的内容是否相等
当对象加入hashset的时候
hashcode相等,还要用equals比较一下内容是否相等
五:LinkedList和ArrayList的区别
ArrayList:动态数组,连续的储存方式,使用时需要开辟空间,动态数组,动态,体现在可以自动扩容,便于查找元素,根据元素下标即可,采用尾部插入法,甚至比LinkedList还厉害
LinkedList: 链式储存结构,碎片化的储存,便于删除,添加元素,不利于查找,维护了一个node节点。
六:HashMap和HashTable的区别:
底层:都是动态数组加链表实现的
hashtable加了锁synchroinzed,线程安全的
hashmap线程不安全,允许key为null的情况
当链表长度8以上或者数组长度超过64转化为红黑树
七:java的类加载器
三个,最底层bootstrp类加载器,其次Extclass加载器,然后是APPclass加载器
bootstrp识别javahome下的jar包和class
Extclass识别lib下的ext下的jar包和class
appclassloder,默认,线程上下文,系统类加载器,通过继承classloder实现的自定义加载器。
.八:双亲委托:
九:java中的异常:
throwable异常的顶级父类,下面有两个子类exception和error
error会导致程序崩溃:严重的
exception可以分为runtimeexception(运行时异常)还有checkedexception(检查时异常)会导致运行不通过
runtimeexception运行时异常,只会导致当前线程发生异常(例如某个接口)
十:jvm gc回收:
是什么:垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。重点:无对象引用的,回收的是内存空间,而不是对象本身。位置:一般发生在堆内存中,因为大部分的对象都储存在堆内存中。
强引用,软引用,弱引用,虚引用,通过是否必须的对象进行判断的。
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)找到所有存活对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
介绍两种方法:
一:引用计数法:
二:root搜索法:
(1)虚拟机栈中引用的对象(栈帧中的本地变量表);
(2)方法区中的常量引用的对象;
(3)方法区中的类静态属性引用的对象;
(4)本地方法栈中JNI(Native方法)的引用对象。
(5)活跃线程。
根集:java程序可以访问的对象,类似于图的遍历,把能访问到的标记为可以达到的,可达性对象,把不可以达到的标记为不可达到的对象,然后进行回收该对象的空间
十一:volatile
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面的这段代码:
在counter前加上volatile关键字,保证了线程的可见性,B线程读取到的counter是最新的
volatile也无法保证对变量的任何操作都是原子性的。
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
十二:synchronized
核心:为了同步线程的队列,让线程有序的进行
加在非静态类:锁住的是对象
加载静态类:锁住的是类
十三:java中类的反射机制
一、什么是反射:
(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
排序问题:快速排序:
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
堆排序:
堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。在堆中定义以下几种操作:
(1)最大堆调整(Max-Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点。
(2)创建最大堆(Build-Max-Heap):将堆所有数据重新排序,使其成为最大堆。
(3)堆排序(Heap-Sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
计算机网络部分:
七层vs五层
物理层 数据链路层 网络层 运输层 会话层 表现层 应用层
五层
物理层 数据链路层 网络层 运输层 应用层
二、TCP/IP四层协议模型
TCP/IP是一个四层的体系结构,他包括(从下到上顺序):网络接口层、网际层(用网际层这个名字是强调这一层是为了解决不同的网络的互联问题)、运输层、应用层。不过从实质上讲,TCP/IP只有最下面的三层,因为最上面的网络接口层并没有具体内容。
总体概括
(1) 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。