JAVA知识点汇总

JAVA知识点汇总--笔经面经考过

1. 数据类型


类型默认值位数字节数范围
byte018-128~128
short0216-2^15~2^15-1
char空格’\u0000‘2160~2^16-1
int0432-2^31~2^31-1
long0864-2^63~2^63-1
float0.0f432-2^31~2^31-1
double0.0d864-2^63~2^63-1

转换顺序:byte,char,short->int->long->float->double

2. 关键字

类型同类同包子类通用性
public\/\/\/\/
protected\/\/\/
default\/\/
private\/

3. 面经

1. JDK1.8与之前版本的不同,lambda函数怎么写

HashMap底层链表长度大于8时,采用了红黑树,而不是数组和链表

2. 进程与线程的区别,通信方式

进程间通信(IPC)方式
(1)管道:
(2)消息队列:
(3)信号量
(4)共享存储
(5)Socket
(6)Streams

3. 进程的三种状态及都包含哪些,线程的五种状态,实体对象的三种状态

进程的三种状态:就绪、运行和阻塞
线程的五种状态:就绪、运行、阻塞、死亡和新建
实体的三种状态:瞬时态,持久态和游离态

4. 信号和信号量

信号是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。
信号量(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

5. 线程安全与不安全

线程安全:指多个线程在执行同一段代码的时候采用了加锁机制,使每次执行后的结果与单线程执行后的结果相同。
线程不安全:未采用加锁机制,导致多个线程先后更改数据从而造成所得的数据是脏数据。
线程安全:Vector, Stack, StringBuffer, HashTable, enumeration (简记为:V,SHE),Collection类提供的synchronized()方法
线程不安全:ArrayList, LinkedList, StringBuilder, HashMap,HashSet, TreeMap, TreeSet

6. 为什么使用线程池

(1)降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
(2)提高响应速度:当任务到达时,任务可以不需要等待线程创建就可以立即执行。
(3)提高线程的可管理性:线程是稀缺资源,如果无限制创建,会消耗系统资源,同时还会降低系统的稳定性,使用线程池可以进行统一的分配/调优和监控。

6. wait和sleep的区别

(1)sleep来自Thread类,而wait来自Object类
(2)sleep不释放对象锁,而wait释放对象锁
(3)sleep不让出系统资源,而wait让其他资源可以占用CPU();
(4)sleep指定一个睡眠时间,到时间自动唤醒,而wait需要用notify()或notifyall()来唤醒

7. finally,final ,finalize的区别

(1)finally里的修改语句不能影响try或catch中已经确定的返回值
(2)final修饰一个变量时,变量不变,但是引用类型的变量时,变量所指的内容可以更改。
final修饰一个类时,表示这个类不能被继承。
(3)finalize是Java.long.Object里定义的,在gc启动,该对象被回收时调用,只能在第一次进入被回收的队列时,对一个对象只能执行一次。不能指定时间或手动。

8. 抽象与接口的区别----先继承再实现

:(1)都可以写抽象方法
(2)都不能被实例化
:(1)一个类中可以实现多个接口,但最多只能继承一个抽象类;
(2)一个类实现接口的话要实现接口中的所有方法,而抽象类不一定;
(3)抽象类中可以有非抽象方法,接口中只能有抽象方法,并且只能为public类型.;
(4)抽象类中可以有成员变量和属性,而接口中只能有由 static final 修饰的常量;
(5)抽象类中有构造方法,接口中没有;
(6)抽象类中包含的静态成员变量访问类型可以是任意的,而接口中只能是public static final类型;
(7)抽象类中的方法可以在抽象类中实现,而接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法。

9. 乐观锁和悲观锁,volatile和synchronized

乐观锁:竞争不会总是发生,不需要持有锁
悲观锁:竞争总是会发生,对某一资源进行操作时,会持有一个独占锁。
区别:
(1)volatile是线程同步的轻量级实现,只能用于变量,而synchronized关键字可以修饰方法以及代码块。
(2)多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞。
(3)volatile关键字能保证数据的可见性,但不能保证数据的原子性,synchronized关键字两者都能保证。
(4)volatile关键字主要用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性。

什么是死锁,产生死锁的条件以及如何避免

死锁: 指两个或两个以上进程在执行的过程中,因争夺资源而造成的一种相互等待的现象。
产生死锁的条件:
(1)互斥条件:一个资源每次只能被一个进程所访问。
(2)请求与保持条件:一个进程因请求资源而被阻塞时,对已获得的资源保持不变。
(3)不可剥夺条件:进程已获得的资源,在使用完成前,不能强行被剥夺。
(4)循环等待条件:若干进程之间形成了一种头尾相接的循环等待资源关系。
避免: 一次性申请所有资源,银行家算法和安全性算法。

同步和异步,阻塞和非阻塞

线程同步的方式:

临界区(Critical Section):通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问
互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问
信号量(Semaphore):它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中PV操作相似。
事件(信号)(Event):通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较的操作

并行与并发

并行: 多个CPU实例或多台机器同时执行一段处理逻辑,真正的同时。
指两个或多个事件在同一时刻发生,是不同实体上的多个事件。
并发: 通过CPU调度算法,让用户看上去同时执行,实际上不是真正的同时。
指两个或多个事件在同一时间间隔发生,是在同一实体上的多个事件。

Java的反射机制

Java创建对象的几种方式

多态

多线程的实现方式及区别

总共有三种:
(1)继承Thread类
(2)实现Runnable接口,无法返回结果,run方法也不允许抛出
(3)实现Callable接口,能返回结果,call()方法允许抛出

实现Runnable和Callable接口的区别

两者都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行,区别在于Runnable接口不会返回结果,而Callable接口可以返回结果。

重载与重写,重载的目的

重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时
重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法访问修饰符为private则子类就不能重写该方法。

成员变量与局部变量的区别

构造函数和代码块的执行顺序

静态代码块 > 构造代码块 > 构造函数 > 普通代码块
有父子类时:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造函数 > 子类构造代码块 > 子类构造函数

错误和异常的区别

错误:是程序无法处理的错误
异常:程序本身可以处理的异常,可以用try进行捕获,catch进行处理

堆和栈的区别

堆:存放由new创建的对象和数组,实体
栈:存放基本数据类型和对象局部变量

垃圾回收机制

新生代和老年代,持久代

内存溢出和内存泄漏

单例模式

确保一个类只能有一个实例,为整个系统提供一个全局访问点,且这个实例只能自己创建。属于创建型模式,提供了创建对象的最佳方式。

三要素:
(1)私有的构造方法
(2)指向自己实例的私有静态引用
(3)以自己实例为返回值的静态的公有方法

优点:
(1)节省内存空间
(2)避免频繁的创建和销毁,提高性能
(3)避免对共享资源的多重占用,简化访问
(4)为整个系统提供一个全局访问点

缺点:
(1)没有接口,扩展很困难;
(2)如果持有Context容易引发内存泄漏。

单例模式的几种实现方式:
(1)懒汉式:需要时才创建,线程不安全,第一次调用时才会实例化对象,性能上会有延迟

public class Singleton{
	private static Singleton single = null;
	private Singleton(){}
	public static Singleton getInstance(){
		if (single == null)
			single = new Singleton();
		return single;
	}
}

懒汉式改为线程安全的三种方法

(1)在getInstance上加同步----每次都要加,影响性能
public static synchronized Singleton getInstance(){
	if (single == null)
		single = new Singleton();
	return single;
}

(2) 双重检查锁定----只有第一次调用单例的时候才会加同步
private static volatile Singleton single;  //必须使用volatile;
public static Singleton getInstance(){
	if (single == null)
	{
		synchronized(Singleton.class){
			if (single == null){
				single = new Singleton();
			}
		}
	}
	return single;
}
//同步只需在第一次创建实例时才同步,可以避开过多的同步


(3)静态内部类----保证初始化instance时只有一个线程
public class Singleton{
	private static class LazyHolder{
		private static final Singleton INSTANCE = new Singleton();
	}
	private Singleton(){}
	public static final Singleton getInstance(){
		return LazyHolder.INSTANCE;
	}
}

(2)饿汉式:类一加载就创建,线程安全,第一次调用时速度快,但是类初始化就创建,占据一定的内存

public class Singleton1{
	//指向自己实例的私有静态引用
	private static Singleton1 singleton1 = new Singleton1();
	//私有构造方法
	private Singleton1(){}
	//以自己实例为返回值的静态的公有构造方法
	public static Singleton1 getInstance(){
		return singleton1;
	}
}

==和equals()的区别,以及hashcode和equals的区别

== :作用是判断两个对象的地址是否相等(基本数据类型 ==比较的是,引用数据类型 == 比较的是 内存地址
equals() 作用是判断两个对象是否相等,一般包含两种情况:
(1)类没有覆盖equals()方法,则通过equals()比较该类的两个对象时,等价于通过“ == ”比较这两个对象
(2)类覆盖了equals()方法,比较两个对象的 内容 是否相等。
hashcode:
(1)如果两个对象相等,那么他们一定有相同的哈希值。
(2)如果两个对象的哈希值相等,那么这两个对象可能相等也可能不等。

& 和 &&的区别

& :逻辑与,无论左侧为真还是假,右侧均执行
&&:短路与,左侧为假时,右侧不执行

String,StringBuilder,StringBuffer的区别

String使用final修饰,每次对它进行改变时都会生成一个新的String对象,并将指针指向新的String对象。
StringBuilderStringBuffer是可变的,均继承AbstractStringBuilder类,每次对它进行改变时,对对象本身进行操作,其中StringBuilder是线程不安全的,而StringBuffer是线程安全的。

ArrayList,LinkedList, Vector的区别

ArrayList和LinkedList的区别
1.线程是否安全:ArrayList和LinkedList两者都是不同步的,也就是两者均线程不安全
2.底层的数据结构不同:ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表的数据结构。
3.插入和删除是否受元素的位置影响:(1)ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响
(2)LinkedList采用链表存储,所以插入和删除元素时间复杂度不受元素位置的影响,都是O(1)数组为O(n)
4.是否支持快速随机访问:LinkedList不支持高效的随机元素访问,而ArrayList支持。(快速随机访问指通过元素的序号快速获取元素对象的方法,ArrayList实现了RandomAccess接口,此接口只是一个标识,没有定义任何内容)
5.内存空间占用:ArrayList的空间浪费主要体现在在List列表的结尾会预留一定的容量空间,而LinkedList因为要存放直接前驱和后继以及数据使得每一个元素都需要消耗比ArrayList更多的空间。
ArrayList和Vector的区别
Vector的所有方法都是同步的,所以是线程安全的,而ArrayList不是线程同步的,因此不安全。
补充
链表List实现遍历的方法有两种:
(1)实现RandomAccess接口,选择for循环,其次foreach
(2)未实现RandomAccess接口,选择iterator遍历

List, Set和Map的区别

List:允许出现重复元素,可以精确控制列表中每个元素的插入位置,另外用户可以通过证书索引访问元素,并搜索列表中的元素。
Set继承Collection接口,是一个不允许出现重复元素,并且无序的集合,主要HashSet(底层:哈希表)和TreeSet(底层:红黑树)两大实现类。在判断有无重复元素时,会调用hashCode()和equals()方法来实现

HashMap,HashTable的区别

1.线程是否安全:HashMap是非线程安全的,HashTable是线程安全的,内部的方法都经过synchronized修饰
2.效率:HashMap比HashTable效率高
3.对Null Key和Null value的支持:HashMap中,null可以作为键,键只有一个,但是可以有一个或多个键所对应的值为null。而HashTable中,不允许有空值,会抛出空指针异常。
4.初始容量大小和每次扩充容量大小的不同:(1)创建时,如不指定,hashtable默认初始值为11,之后每次扩充容量变为原来的2n+1,而hashmap默认的初始值为16,之后每次扩充,容量变为原来的2倍。
(2)创建时,如果指定容量初始值,那么hashtable会直接使用给定的大小,而hashmap会将其扩充为2的幂次方大小。
5.底层数据结构:当链表长度大于8时,会将链表转化为红黑树,以减少搜索时间,而hashtable没有。

HashMap,HashSet的区别

(1)HashMap:实现了Map接口,存储键值对,调用put()方法向map中添加元素,使用键KEY计算hashcode,速度比HashSet快
(2)HashSet: 实现了Set接口,仅存储对象,调用add()方法向set中添加元素,使用成员对象来计算hashcode(),并用equals()方法判断两个对象的属性是否相同。

什么是HashMap?装载因子的大小及含义,解决冲突的方法

HashMap是一个用于存储Key-Value键值对的集合,HashMap采用数组+链表的方式进行存储,当存在冲突时,使用链表来解决,遍历使用Iterator。最常使用的是两个方法:Get 和 Put。长度设为2的幂次方是为了用于满足输入的hashcode能够均匀分布。
当HashMap达到一定饱和度时,需要对它进行扩展,也就是进行Resize。
影响Resize的因素有两个:
(1) Capacity:HashMap当前长度,为2的幂次方
(2) LoadFactor,负载因子,默认值为0.75
Resize的条件:HashMap.size >= Capacity * LoadFactor
HashMap的Resize包含扩容和ReHash两个步骤,其中ReHash在并发情况下可能会形成链表环。

TCP三次握手

三次握手的目的是为了建立可靠的通信信道,确认双方的发送和接收是否正常。

TCP四次挥手

TCP与UDP的区别

tcp面向对象有连接,可靠
udp面向对象无连接,不可靠

TCP为什么可靠

确认重传
流量控制
拥塞控制
滑动窗口

TCP/IP不同层的协议

在这里插入图片描述

cookie和session的区别

输入URL以后到显示主页的过程

DNS解析->TCP连接->发送HTTP请求->服务器处理请求并返回HTTP报文->浏览器解析渲染页面->连接结束

HTTP长连接和短连接

短连接:客户端和服务器每进行一次HTTP操作,就进行一次连接,任务结束后就中断连接。(HTTP/1.0)
长连接:(HTTP/1.1)客户端和服务器端之间建立的用于传输HTTP数据的TCP连接不会关闭,当客户端再次访问服务器时,会继续使用已经建立好的连接。有一个保持时间可以设定。

数据库索引,底层结构,创建方式

为什么不对表中每一个列创建一个索引

底层结构

(1)哈希索引:底层的数据结构为哈希表
(2)B+树

索引是如何提高查找速度的?

将无序的数据变为相对有序的数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值