javase知识

178 阅读31分钟

JavaSE
基础

115.BIO、NIO、AIO是什么?

30.基本数据类型有哪些?内存大小?

byte-1 short-2 int-4 long-8 float-4 double-8 boolean-1/4 char-2

31.基本数据类型的自动转换?

数据类型范围小的自动转换为数据类型大的

32.两个byte类型相加结果是什么类型?

int

33.变量和常量的区别?

在程序运行的过程中,变量的值可能会发生改变,常量的值不会发生改变

34.基本数据类型和引用类型的区别?

基本数据类型会在内存中开辟一块空间,空间内存储的值。 引用类型也会在内存中开辟一块空间,空间内存储的引用对象的地址

35.++前置和后置的区别?

++前置是先进行自增运算,后将值赋值给表达式 ++后置是先将值赋值给表达式,后进行自增运算。

36.%可以对小数求余吗?%可以对负数求余吗?

可以,可以

37.什么是短路运算?

当符号前面的表达式已经可以判断出整个式子的最终结果时,符号后面的式子不能运行

38.&和&&运算符的区别?

&&是逻辑运算符,且当&&前面的式子结果为false,&&后面的式子不再运行 &是算术运算符,即使&前面的式子结果为false,&&后面的式子也要继续运行

39.如何快速计算乘以2的n次方?

算术左移n次

40.switch语句支持哪些类型?

byte short int char String 枚举

41.while和do…while的区别?

while是先判定,后执行代码块。 do...while是先执行代码块,后判定

42.break和continue的区别?

break是直接退出循环。 continue是跳过本次循环。

43.如何跳出多重循环?

①break:标识; ②两个for循环的判定条件都加flag,为false就退出循环

44.什么是死循环/无限循环?

死循环:没有明确的结束条件 如while(true){} 无限循环:有明确的结束条件,但永远不会结束 如inti=1 while(true){if(i==0) break;}

45.数组的初始化有哪两种方式?

静态初始化-初始时赋值:int[] arr={1,2,3}; 动态初始化-仅开辟空间: int[] arr=new int[3];

46.二分查找算法?时间复杂度?

o(logn)

47.十大排序算法有哪些?

48.快速排序的算法思想?时间复杂度?

平均:o(logn) 最坏:o(n) 做随即处理最坏也是o(logn)

49.超大数组排序怎么处理?

外部排序

50.什么是递归调用?

自己调用自己

51.什么是可变参数?

test(int ...arr){} 方法传入同一个类型的参数可能是多个

52.传值调用和引用调用的区别?

面向对象
53.什么默认构造?

类名(){}

54.面向对象三大特性?

封装、继承、多态

55.构造方法可以继承吗?

不能

56.私有方法可以继承吗?

可以继承,但是不能访问

57.什么是重载?

对本类中的方法进行重载
方法名相同,参数列表不同,即参数类型,参数数量、参数顺序不同

58.什么是重写?重写的限制有哪些?

子类重写父类中的方法 子类重写的方法的修饰符范围要更大,返回值类型要更准确,更子类

59.重载与重写的区别?

重载是重载本类中的方法。重载的参数列表不同, 重写是重写父类中的方法。重写的参数列表相同。

60.权限修饰符有哪些?访问范围?

public 本包下的类和其他包的类 protected 本包下的类和其他包的子类 defaule 本包下的类 private 本类中的方法

61.接口的抽象类的区别?

抽象类有构造方法,有非静态的属性和方法 接口只能有常量和静态方法和抽象方法,且是public修饰

62.抽象类和抽象方法的关系?

抽象类可能没有抽象方法,有抽象方法的类一定是抽象类

63.如何理解单继承多实现?

一个类只能继承一个父类,但可以实现多个接口

64.接口可以继承吗?接口的继承是单继承吗?

接口可以由接口继承。接口的继承是多继承。

65.static关键字的作用?

在类加载的时候就在内存中开辟空间

66.final关键字的作用?

final修饰类:类不能被继承 final修饰方法:方法不能被重写,但能被重载 final修饰属性:属性的值不能被修改,但是数组内元素的值可以被修改

67.abstract能与final联用吗?为什么?

不能。abstract的作用就是声明抽象方法然后被子类重写,而final修饰的方法不能被重写,矛盾。

68.this和super的作用?

this指的是当前对象。super指的是当前对象中的父类部分对象

69.什么是内部类?什么是匿名内部类?

定义在类中的类。 匿名内部类:定义在方法中的类,与局部内部类相似,但是它没有类名

70.创建子类对象时,父类静态块、块、构造器、子类静态块、块、构造器的执行顺序?

父类静态块、子类静态块、父类块、父类构造器、子类块、子类构造器

71.什么是HashCode?

HashCode是一个散列码,将内存地址通过相应的哈希算法算出对应的哈希值。 在集合中,通过对哈希值取余取余运算可以算出对象在集合中的下标位置,以增加查找性能。

(h = key.hashCode()) ^ (h >>> 16)

哈希值逻辑右移16再异或是为了让高16位也参与运算,更好的均匀散列,减少碰撞的几率

n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)

将处理后的哈希值再和数组的长度做与运算,相当于取余,来获得下标值

72.Hash协定是什么?

73.finalize方法的作用?

74.深浅克隆?Object的clone()是深还是浅克隆?

浅克隆:浅克隆对象内的成员对象指向的是被克隆对象的成员对象 深克隆:深克隆对象内的成员对象指向的是内存中新开辟的一个空间,这个空间用来复制被克隆对象的成员对象

75.==和equals的区别?

==比较的就是变量中的值,对于整数类型来说是数值,对于引用变量来说是地址 equals默认情况下,是用==比较,可以按照需求逻辑重写eqauls方法,比说如果两个对象的hashcode和各属性都相等即可返回true

76.为什么String是常量?

String内的value[]数组是用private final修饰的,所以我们不能直接修改value[]的值,且String类并未对外提供任何修改value[]数组的方法.即一个String对象内的value[]数组值是不变的。

77.String类可以有子类吗?为什么?

不能,String、StringBuffer、StringBuilder都是被final修饰了,即不能被继承

78.String对象的创建机制?""和new创建的区别?

如果通过""创建,则会去字符串常量池中找是否有对应的String对象,有的会String引用指向这个String对象。如果没有,则会在常量池中先创建对应的对象,然后再让String引用指向这个String对象 通过new来创建的话,如果常量池中没有对应的String对象,则会先在常量池中创建,然后再在堆里创建对应的对象。

**79.String的intern方法有什么作用? **

先检查字符串常量池中有无对应的String对象,如果没有,则会先在字符串常量池中创建对应的String对象,然后返回常量池中对应String对象的地址,如果有,则直接返回字符串常量池中对应String对象的地址。

**80.StringBuffer与StringBuilder的区别? **

StringBuilder是线程不安全的,StringBuffer是线程安全的,就是StringBuffer对一些方法用Synchronized同步来修饰了 正因为StringBuffer中的一些方法被Synchronized修饰了,所以StringBuffer的性能要比StringBuilde低

**81.StringBuffer/StringBuilder的扩容机制? **

数组长度默认是16 当字符串长度要大于数组时,数组的长度*2+2,(value.length<<1)+2

82.自动装箱和自动拆箱是什么?自动装箱和自动拆箱时需要注意什么?

自动装箱和拆箱是由编译器来做的,自动装箱是编译器调用Integer.valueOf(),自动拆箱是编译器调用intValue()和doubleValue()来实现常量和包装类的自动转换

整数也有常量池,常量池的范围是-128~127 Integer和int比较时会进行自动拆箱

**83.包装类的缓存机制? **

包装类有个常量池,大小范围为-128~127

84.包装类型能不能使用==进行比较?为什么?

==比较的是两个对象的地址,不符合需求逻辑

**85.Java中的集合有哪些?集合的体系结构? **

image.png

86.List的集合的实现类有哪些?

ArrayList、LinkedList、Vector、Stack

**87.ArrayList和LinkedList的区别? **

ArrayList的底层数据结构是数组,LinkedList的底层数据结构是链表

88.ArrayList和Vector的区别?

线程安全:Vector是线程安全的,ArrayList是线程不安全的 性能:正因为Vector是线程安全的,所以Vector的性能比ArrayList差 扩容:ArrayList的一次扩容一半,即oldCapacity+(oldCapacity>>1),Vector一次扩容一倍,因此ArrayList需要更频繁的扩容,所及Vector相比于ArrayList更适合存储大量数据

**89.ArrayList的扩容机制? **

ArraryList内数组的默认长度是10 一次扩容一半

90.Set接口的实现类有哪些?

TreeSet、HashSet

91.HashMap底层实现?

JDK1.8之前是数组+链表,1.8之后是数组+链表+红黑树

**92.HashMap中数组、链表、红黑树的作用? **

通过哈希算法可以将对象映射到数组上,大大增加查询的速度 通过哈希算法映射可能会产生冲突,即多个对象会映射到一个位置上,通过链表可以解决冲突 链表的查询慢,将链表树化为红黑树,查询速度从O(n)提升到O(logn)

93.HashMap中链表和红黑树何时转换?

当数组长度大于等于64,且数组中某一位置上的节点数大于等于8

94.HashMap的扩容机制?

默认数组长度是16 当数组的3/4的位置都有元素时,就扩容一倍 当数组长度小于64且某位置上的长度大于等于8时就扩容一倍

95.HashMap采用什么方式解决哈希冲突?

链表+红黑树

**96.TreeMap和LinkedHashMap的特点? **

TreeMap的底层数据结构是红黑树,对元素进行排序,查找删除和插入的平均时间复杂度都是O(logn) LinkedHashMap的底层数据结构是HashMap的数据结构,用链表来维护元素的顺序,查找删除和插入的平均时间复杂度都是O(1)

97.HashMap和HashTable的区别

线程安全和性能: HashMap线程不安全,性能较高 HashTable由于加了全局同步锁,所以线程安全,同时性能较低 null: HashMap中可以使用null做key值,Hashtable不行 底层数据结构: HashMap的底层数据结构是数组+链表+红黑树 Hashtable的底层数据结构是数组+链表

**98.HashTable与ConcurrentHashMap的区别? **

ConcurrentHashMap的实现线程安全性能更好:JDK1.7给Segment数组中的每个segment对象(segment对象内还有个HashEntry数组)添加锁来实现线程安全,锁力度更小, JDK1.8通过CAS或者synchronized来实现线程安全,其有个静态内部类Node,锁对象就是Node数组中的每一个Node对象,锁粒度是Node节点,性能更高

**99.Collection与Collections的区别? **

Collection是一个接口,Collections是一个针对集合类的工具类,其提供了多个静态方法,如sort、reverse用来操作集合

100.Vector、StringBuffer、HashTable是如何实现线程安全的?

Vector和StringBufferHashTable对一些方法加了synchronized锁,锁对象是其对应的对象,锁粒度大,性能较低

**101.如何保证集合的线程安全? **

对一些方法或代码块添加synchronized同步锁,以防止多个线程同时写

102.JDK8的新特性有哪些?

1.接口可以有非抽象方法 如 default void say(){}, 也可以有静态方法 public static final coid say2(). 2.添加了lambda表达式,简化代码 3.添加了函数接口,方便用lambda表达式实现匿名内部类

异常
103.异常的体系结构?

image.png

**104.编译时异常和运行时异常有什么区别? **

运行时异常:①继承RuntimeException②可以不用明文处理③可以通过代码规避 如:if(!=null) 编译时异常:①继承Exception②必须要明文处理③不能通过代码规避

105.异常处理的方式有哪些?

可以通过try...catch.finally捕获并处理,或者用throws将异常向上抛

**106.catch和finally能够省略吗? **

可以省略catch或省略finally,但不能同时省略catch和finally

107.finally代码块的作用?一定会执行吗?有没有例外?

finally代码快用来做善后清理工作,比如用来关闭连接,关闭文件。 不一定会执行,当线程被中断或退出,又或是JVM退出时,finally不会被执行。 但当catch中存在return返回或者是出现异常时,会先去执行finally代码块内的代码,然后再返回catch代码块处理return或者是异常;

108.throw和throws的区别?

throw的作用是抛出一个异常对象,throws的作用是用来声明方法可能会抛出的异常类型

IO
109.IO流的分类?

按照流向分为输入流和输出流 按照处理的数据分为字节流和字符流 按照功能分为节点流和处理流:节点流一般用来包裹源头,比如文件对象,处理流用来增强功能,比如有缓冲流转换流

**110.Java中的文件流有哪些? **

FileInputStream、OutputStream、FileReader、FileWriter、BufferedReader、BufferedWriter、InputStreamReader、OutputStreamWriter、ObjectOutputStream、ObjectInputStream

**111.什么是对象流? **

ObjectOutputStream,ObjectInputStream,是处理流,用来增强功能,可以用来将对象转换为二进制字节流输出到文件内,也可用来将文件内的二进制字节流转换为对象

112.什么是序列化和反序列化?

序列化:将对象转换为二进制字节流 反序列化:将二进制字节流转换为对象

113.序列化的对象有什么要求?

对象需要实现序列化接口,用来标识此对象可以被序列化和反序列化,并且对象内的成员对象也要实现序列化 克隆的话只需对象实现Cloneable即可,成员对象不用实现Cloneable接口

**114.如果在序列化时忽略属性? **

transient transient的作用:只能修饰属性,使得该属性在序列化和反序列化时被忽略 transient的使用场景:忽略不用序列化的字段,提高序列化性能

115.BIO、NIO、AIO是什么?

是什么?举个场景

BIO是同步阻塞型IO,NIO是同步非阻塞型IO,AIO是异步阻塞型IO 举个场景来说,一个基于TCP通信的场景,一个服务端可以与多个客户端建立连接,并且能接受每个客户端发来的消息,消息可以是一段话也可以是一个文件。在这个场景中。 ①如果是BIO,那么一个连接对应一个线程,就是说每一个客户端与服务端建立连接时,服务端都要分配一个线程。这个线程用来监听服务端是否发来消息,并且接受消息。如果一个客户端大部分的时间都没有发送消息,那么浪费了线程资源,并且每个连接都要分配一个线程,服务器可能因为线程过多而宕机。 ②如果是NIO,那么一个线程对应多个连接。线程会用来轮询多个通道,如果有通道需要线程来处理,则线程会被停下来处理相应的通道。这样就能解决线程资源浪费的问题,但是如果客户端发送大的文件,则其他客户端不能及时响应 ③如果是AIO,那么一个请求对应一个线程。当客户端要发送消息时,服务端会分配一个线程来接受消息,接受消息后线程会被收回。这样的话就能解决客户端不能及时响应的问题。

泛型
116.什么是泛型?

泛型就是广泛的类型。 通过泛型可以使代码和被操作的数据类型分离,减少代码重复写。比如我的项目中有个query查询方法就用到了泛型,查询方法是传入sql查询语句,返回一个装有bean对象的ArrayList数组。因为查询不同的表就会返回不同类型的bean对象,不用泛型就要写大量的重复代码。 保证类型安全。比如ArrayList类,通过泛型就能指定集合中传入什么相应的类型及其子类。防止集合操作时出错,如对集合类的对象求和,如果集合中有String就会报错。 消除类型转换,增强代码可读性。

117.为什么要使用泛型?

使代码和被操作的数据类型分离,减少代码重复写。项目中的query查询方法,不同的sql语句返回不同的javabean对象 保证类型安全。 消除类型转换

118.泛型如何向父类传递?

119.泛型可以使用基本数据类型吗?怎么办?

可以使用基本数据类型,但基本数据类型会自动装箱为包装类

**120.泛型的上限和下限? **

泛型不支持协变。为了解决这个问题引入了上限。 泛型不支持逆变。为了解决这个问题引入了下限。

比如定义一个Animal类,定义Dog,Cat继承Animal。有一个装Dog对象的集合,有一个装Cat对象的集合。 如何实现一个方法来计算集合中有多少个annimal对象呢?最主要就是要定义一个参数,来接受装Dog对象装Cat对象的集合,定义装Animal对象的集合肯定不行,因为泛型不支持协变,就用通配符来定义一个装Animal对象的集合,这样这个参数就能即接收装Dog对象的集合,又能接受装Cat对象的集合。但是只能对这个参数读,不能写。 如何实现一个方法既能向Animal集合添加对象,又能向Dog对象添加对象呢?可以用通配符来定义一个装Dog对象的集合,这样这个参数既能接受Animal集合又能接收Dog集合了。但是只能对这个参数写,不能对这个参数读,因为不知道这个参数具体是什么类型

上限和下限的主要作用还是减少代码复写。 具体实现:上限--List<? extends Animal>list 下限--List<? super Dog()>list 注意:上限只读不写,下限只写不读

反射

121.什么是反射

反射是一种间接操作对象的机制。使用反射可以使代码更灵活,比如JDBCUtil中的query()方法,查询不同的表会返回不同的javaBean对象。通过反射,可以创建相应的对象并设置相应的属性。使得一个方法可以用来查询多个表。

122.如何获取Class对象?

①类名.class ②对象名.getClass() ③Clasz.forName()

123.反射如何创建对象?

constructor.newInstace();

124.反射相关的常用类?

属性--Fiel 方法--Method 构造器--Constructor

125.反射能访问私有属性和方法吗?如何访问?

能 Field field = clazz.getDeclaredField("num"); field.setAccessible(true);

126.Java中创建对象的方式?

构造器 new; 反射 constructor.newInstance(); 克隆 对象名.clone(); 反序列化 流读取

线程

127.解释程序、进程、线程的概念?

程序--存储在磁盘中的程序。如下载了微信,微信程序存储在磁盘中 进程--将磁盘中的程序调到内存中执行,进程是分配资源(pid,内存空间)的最小单位。点击了微信.exe后,微信会被调到内存中,并分配资源。 线程--cpu调度的最小单位(调度到cpu上执行)。比如微信可以边开视频变打字聊天,视频和打字聊天是一个进程中的两个线程。

128.解释并发、并行、串行的概念?

并发:同一时间段同时运行(时间段内包含多个时刻) 并行:同一时刻同时运行 串行:同一时间段值

129.线程的状态有哪些?

就绪--new Thread tread=new Thread(run) 运行--runnable thread.start() 终止--terminated 线程运行结束 阻塞--blocked 当前程进入sychronized代码块时,没有抢到锁 等待--waiting 当线程调用wait()或join()时线程会进入waiting状态。当notify()或notifyAll()时或 join的线程执行结束时,会进入runnable状态 --timed waiing 当线程调用sleep(time)或wait(time)时,会进入timed waiting状态

130.创建线程的方式有哪些?

三种 ①继承Thread类
②实现Runnable接口 ③实现callable接口,要套一个FutureTask对象(为了能够获取线程执行后的返回值,通过继承callable可以会的线程执行后的返回值)

131.Callable和Runnable的区别?

通过Callable来创建线程,能获得线程执行后的返回值

132.什么是线程池?

线程池是利用池化思想实现的线程管理技术;

133.线程池的核心参数有哪?

①核心线程数 ②最大线程数 ③数值 ④单位 当线程数量超过核心线程数时,数值和单位参数指定了线程多久未执行任务会被销毁 ⑤工作队列 当任务提交后,任务会进入到此队列,等待线程池调度 ⑥线程工厂 用线程工厂来创建线程 ⑦拒绝策略 当工作队列满了,线程数也达到最大线程数时,此时如果还有任务提交该如何处理?通过拒绝策略来指定处理方式。

134.什么是线程的同步?为什么要同步?

线程同步是协调多个线程的运行,以免多个线程同时运行时互相产生影响。

135.线程同步的方式有哪些?

1.synchronized 2.Reentrantlock

136.ThreadLocal的作用?

ThreadLocal类似于一个容器,只能装一个对象。并且每个线程都有各自的ThreadLocal,也只能访问各自的ThreadLocal

137.synchronized和ReentrantLock的区别?

①ReentrantLock可以是非公平锁也可以被设置为公平锁,synchronized只能是非公平锁 ②ReentrantLock有可中断机制。就是当线程在竞争锁时,可以中断此线程不争抢锁。而synchronized的线程只会一直争抢锁 ③ReentrantLock有锁超时机制。就是当一定时间后仍没有获得锁,那么此线程就可停下来不竞争锁。而synchronized会一直争抢锁 ④ReentrantLock有可以有多个条件变量,而synchronized只能有一个条件变量。就是在synchronized中,线程调用wait后只会被存放到一个区域。norify()也只能从这一个区域唤醒线程。而ReenrantLock可以定义多个区域,可以选择从哪个区域中唤醒线程

138.synchronized的使用方式?

①可以用来修饰方法 ②可以用来修饰一段代码块

139.synchronized和volatile的区别?

synchronized是用来修饰方法或者同步代码块的,而volatile是用来修饰变量的 synchronized修饰的代码具有可见性和原子性,而volatile的作用是可见性和防止指令重排,不能保证原子性。

volatile的作用?

volatile的作用确保变量的可见性和防止指令重排

volatile确保可见性的底层原理?

volatile读时,会使寄存器中的数据无效,确保数据从主存中获取 volatile写时,会使修改的数据从寄存器中立即更新到主存中

防止指令重排的原理?

在volatile读写时会添加屏障,屏障保证了volatile读写指令与其上面下面的指令保持相对顺序

140.ReentrantLock的特点?

①可以创建公平锁也能创建非公平锁 ②可中断机制。当线程在竞争锁时,可以中断此线程竞争锁。 核心api: thread.lockInteruptibly(); thread.interupt(); ③锁超时机制。可以设置时间,当线程超过一定时间后仍未竞争到锁就停止竞争锁 核心api: thread.tryLock(60) ④ReentrantLock可以有多个条件变量。就是可以挑选某个条件变量来唤醒里面的线程 核心api: Condition condition = new Condition(); condition.await() condition.signal()

141.什么是死锁?死锁的四个必要条件?

死锁是两个或两个以上的线程,双方互相需要对方的资源,并且没有一个线程提前退出以释放资源,这就叫死锁 四个条件: ①互斥 -- 一个资源只能被一个线程拥有 ②持有和等待 -- 线程可以在等待时持有资源 ③禁止抢占 -- 不能抢其他线程的资源 ④循环等待 -- 一系列线程互相持有对方的资源

142.什么是可重入锁?

某一个线程可以多次获得同一个锁而不会出现死锁现象

143.什么是自旋锁?

就是如果线程没有抢到锁,那么线程不会释放cpu资源,仍会自旋尝试获取锁

144.公平锁和非公平锁?

公平锁是先到先得,而非公平锁是通过策略来调度线程

145.乐观锁和悲观锁?

乐观锁在使用时不会加锁,悲观锁在使用时会加锁。当然这里的加锁是java层面的锁,乐观锁在java层面不会加锁,但是在操作系统层面是加锁了的,因为一行java代码实际上包含好几个cpu指令

说一下CAS是什么?

CAS的实现流程是将变量的值与期望值比较,如果相等则将变量的值修改为新值,反之则继续循环。 CAS的底层是对硬件总线加锁,以此来保证原子性和提高程序的效率

CAS的缺点是什么?

①当线程很多时,CAS的效率较低 ②可能会出现ABA问题

JVM
146.类的加载过程?

①加载 -- 通过全限定名获取字节码文件信息,然后会在方法区创建一个instanceClass对象保存字节码信息并且在堆中创建对应的Class对象 ②连接 验证:验证文件格式是否正确 准备:为静态变量分配空间并赋予初始值 解析:将符号引用转换为直接引用,也就是地址 ③初始化 -- 执行静态代码文件和为静态变量赋值

147.什么是类加载器?类加载器有哪些?它们的作用?

类加载器用来加载类的对象 ①启动类加载器 -- 加载核心类 如java.lang.String ②扩展类加载器 -- 加载比较通用的扩展类 ③应用程序类加载器 -- 加载maven导入的类和自定义的类 ④自定义加载器 -- 继承ClassLoader

148.什么是双亲委托?

双亲委派机制通过递归算法实现 双亲委派机制的大致流程是从下向上查看是否某个加载器加载了目标类,如果加载了就直接返回目标类,如果启动类加载器都没有加载目标类,那么就会从上到下尝试加载目标类,如果加载成功,就直接返回目标类

双亲委派机制的作用?

①防止重复加载。比如启动类加载器以及加载了java.lang.String,那么便不会再从应用程序加载器加载java.lang.String ②保证类加载的安全性。使java.lang.String又启动类加载器加载

149.JVM内存有哪几部分?哪些是线程隔离的?哪些是线程共享的?

线程共享:堆、方法区 线程隔离:虚拟机栈、本地方法栈、程序计数器

150.JVM每一块内存区域的作用是什么?

堆:存储对象 方法区:存储类的元信息、运行时常量池、字符串常量池 虚拟机栈:存储线程的栈帧 本地方法栈:存储线程的本地方法栈帧 程序计数器:记录线程下一条要执行指令的地址

151.GC判断垃圾的算法?引用计数法有什么缺点?

①引用计数法 -- 可能会产生循环引用,从而引起内存泄漏 ②可达性分析法 -- GC ROOT对象

152.GC回收算法?各自的优缺点?

①标记清除算法 -- 简单 可能会产生碎片 ②复制算法 -- 不会产生碎片 内存利用率低 ③标记整理算法 -- 不会产生碎片,内存利用率高 整理的速度慢 ④分代回收算法 -- 比较综合

153.什么是分代回收?分代回收针对哪些内存?

分代回收算法主要有几个区域。新生代和老年代,新生代中有一个伊甸园区和两个幸存区。新生代区域的特点是内存小,但是垃圾回收效率高,适合于处理暂时存在的对象。老年代区域的特点是内存大但是垃圾回收效率低,适合于处理长时间存在的对象

154.新生代分为哪些区域?

伊甸园区、两个幸存区

155.新生代要经过多少次回收才会进入老年代?

15

156.Eden与S0,S1的默认比例?

默认8:1:1

157.新生代、老年代的默认比例?

默认1:2

网络(校招必备)
158.简单介绍OSI七层网络模型?TCP/IP的五层网络模型?

七层模型包含应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。应用层常用的协议有Http、传输层常用的协议有TCP、UDP。每一层都可以使用下一层提供的功能。 五层模型包含应用层、传输层、网络层、数据链路层、物理层

159.TCP和UDP的区别

①TCP是可靠传输,UDP是不可靠传输。TCP如果没有接受到消息会要求重传 ②TCP面向连接、UDP不面向连接。TCP需要通过三次握手四次挥手建立和断开连接

160.HTTP和HTTPS的区别?

HTTPS是加密的协议

161.TCP的三次握手和四次挥手?

第一次握手客户端发送一个带有SYN标志的数据包,表示要建立连接。 第二次握手服务端发送一个带有SYN标志和ACK标志的数据包,表示服务端同意建立连接并且要与客户端建立连接 第三次握手客户端发送一个带有ACK标志的数据包,成功建立连接

第一次挥手客户端发送一个带有FIN标志的数据包,表示客户端不再发送消息 第二次挥手服务端发送一个带有ACK标志的数据包,表示服务端知道了客户端不再发送消息 第三次挥手服务端发送一个带有FIN标志的数据包,表示服务端不再发送消息 第四次挥手客户端发送一个带有ACK标志的数据包,表示客户端知道服务端不再发送消息

162.TCP是如何保证数据传输的可靠性

通过重传机制,如果超时或者数据包缺少或数据包有错误都会重传

163.Socket是什么?

socket是套接字。服务端可以通过new ServerSocket(port)来指定监听端口。客户端可以通过new Socket(ip,port)指定服务端的ip和端口号

数据结构(校招必备)
164.常见的数据结构有哪些?

数组链表、树图

165.线性结构有哪些?

数组、链表

166.栈和队列的区别?

栈是先进后出、队列是先进先出

167.数组和链表有什么区别?

结构不同。数组存储在一片连续的内存空间上,通过下标即可找到某个元素。链表存储在散列的内存空间上,通过指针确定下一个元素的位置。 性质不同,数组的查找时间复杂度是o(1),删除和增加的时间复杂度是o(n),链表如果知道要被删除或增加的位置的前一个节点,那么删除和增加的时间复杂度是o(1),查找的时间复杂度是o(n),遍历

168.什么是二叉树?

每一个节点最多只有一个直接父节点,每一个节点最多有两个直接子节点

169.什么是满二叉树?

除了叶节点外,每一个节点都有两个子节点

170.什么是完全二叉树?

满二叉树的最后一层从右到左删除几个节点

171.什么是二叉搜索树(BST)?

左子树所有节点的值小于根节点,右子树所有节点的值大于根节点

172.什么是平衡二叉树?

每一个节点的左子树和右子树的深度之差小于等于1

173.什么是AVL树?

每一个节点的左子树和右子树的深度之差小于等于1,并且左子树的所有节点值小于根节点,右子树所有的节点值大于根节点

174.什么是红黑树?

红黑树相比较于AVL树的优点就是在删除和增加时对树的调整次数少。 红黑树的特点是满足二叉搜索树的性质,根节点和叶节点黑色的,红色的节点不能相邻,从根节点到叶节点每一条路的黑色节点个数相同

175.红黑树的特性?

红黑树满足二叉搜索树的性质,根节点和叶节点是黑色的,红色节点不能相邻,从根节点到叶节点每一条路上的黑色节点个数相同

176.红黑树的变换?

177.什么是哈夫曼树?

哈夫曼树是带权路径长度最小的树。哈夫曼树最典型的应用是哈夫曼编码。令最经常使用的字符编码长度短点,不经常使用的字符编码长度长一点,最终能用更少的空间去存储字符

178.B树和B+树的区别

最主要的区别是B树的数据和键值存储在所有节点,B+树的数据仅仅存储在叶节点,非叶子节点仅存储键值。然后内存从磁盘读取一次读出一页。如果用B树的话一次读出的节点数少,用B+树一次读取出的节点数更多,故使用B+树搜索的话读取页的次数更少,速度更快

B+树的叶子节点通过指针相连,方便遍历

179.先(前)序遍历、中序遍历、后序遍历有什么区别?

读取左右根节点的顺序不同

180.深度优先和广度优先的区别?

读取的顺序不同,对于二叉树来说的,广度优先搜索是一层一层读,深度优先搜索是从根节点读到叶节点,在返回继续其他叶节点

181.什么是哈希函数?有几种常见方式?

哈希函数就是将key值与存储地址映射起来,这样就能通过key值以O(1)时间复杂度就能查到数据

182.什么是哈希冲突?有哪些解决方式?

哈希冲突就是可能会有多个key值映射到同一个位置。在hashmap中的解决方式是把冲突的节点以链表或红黑树的形式存起来,也可以再次映射映射到其他位置