赞
踩
Java基础
1. 面象对象的特征:继承、封装、多态;
2. final、finally、finalize的区别
final:可以修饰类、方法、变量;修饰的类不能被继承,修饰的方法不能被重写,被修饰的变量只能赋值一次,相当于常量;
finally:是异常处理中的一部分,表示这段语句最终一定会被执行而不管是否发生异常,经常用于需要释放资源的情况下;
有三种情况finally中的代码不会被执行:
(1)在try块之前出现异常
(2)在执行时java虚拟机被终止;
(3)在执行try或catch时被打断或被终止;
特殊情况:如果在finally中使用return,则会撤销之前的return语句,继续执行最后的finally中的代码;
finalize:在Object理被定义,也就是每一个对象都有这个方法,该对象被回收的时候调用;
3. Exception、Error、运行时异常与一般异常有何异同
4. 请写出5种常见到的runtime exception
5. int 和 Integer 有什么区别,Integer的值缓存范围
6. 包装类,装箱和拆箱
7. String、StringBuilder、StringBuffer
StringBuiler>StringBuffer>String
8. 重载和重写的区别
重载和重写是Java多态性的不同表现;
重写是父类与子类之间多态性的表现,在运行时起作用;
重载是同一个类中多态性的表现,在编译时起作用;
9. 抽象类与接口的区别
抽象类: 用abstract修饰的类叫做抽象类。
特点:
注意:
接口:意义是为系统提供更好的扩展性和可维护性;
特点:
接口与抽象方法:
10. 说说反射的用途及实现
11. 说说自定义注解的场景及实现
@Documented 注解是否包含在javaDoc中;
@Retetion 什么时候使用该注解
@Target 注解用于什么地方
@Inherited 是否允许子类继承该注解
Http长连接短连接?
Http/1.0 及之前是短连接
Http/1.1 及之后是长连接:服务器返回的响应中携带要返回内容的长度,浏览器接受的内容如果小于这个长度就不显示,直到接收到所有的内容,才显示出来。
因为以前的网页内容请求不多,使用短连接;现在随着技术的发展,一个网页中有较多的请求,所以使用长连接比较节省资源。
12. HTTP请求的GET与POST方式的区别
https://www.cnblogs.com/logsharing/p/8448446.html
13. Session与Cookie区别
cookie 为了解决HTTP协议无状态的缺陷所做的努力,是作为HTTP传输头信息的一部分发给客户机的
区别
生命周期:
request.getsession
时会检查对应session,如果失效则重新创建。在应用容器重启过关闭的时候,未过期的session对象会持久化到一个文件中,当容器再次启动时,会重新读取文件所有未过期的session对象。14. 列出自己常用的JDK包
15. MVC设计思想
M Model 模型:业务逻辑包含了业务数据的加工处理以及相应的基础服务;
V View 视图 :展现模型处理的结果,另外还要提供相应的操作界面;
C Controller 控制器:视图发请求给控制器,有控制器来选择相应的模型来处理;模型返回结果给控制器,有控制器选择合适的视图展示;
MVC的优点:
缺点:
16. equals与==的区别
17. hashCode和equals方法的区别与联系
s.hashcode=s[0]*31^{n-1} + s[1]*31^{n-2}+s[2]*31^{n-3} ... s[n-1]*31^{n-n}
@Override
public int hashCode() {
return Objects.hash(name, sex, age);
}
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
未重写之前如何计算hashcode?
根据地址对象信息等映射出来的一个整数值,是由本地方法实现的,也就是非Java的方法来完成的。
重写后的equals如何比较?
先判断两个对象是否是同一个对象,如果是直接返回true,
如果对象为null或者不是同一个类的对象直接返回false;
否则逐一比较两个对象的属性值是否相等。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name) &&
Objects.equals(sex, user.sex) &&
Objects.equals(parent, user.parent);
}
为什么重写equsls之后必须重写hashcode?
因为在未重写之前,对于引用对象equals比较的是两对象的地址值;hashcode比较的是根据地址值映射出来的hash值。
而重写之后,equals比较的对象属性内容,如果不重写hashcode,会导致equals比较出来为true而hashcode值却不相等。比如将对象放入hashmap、hashset等集合时,会出现问题。
18. 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
transient
关键字修饰,则序列化时会忽略这个属性;还有声明为static的成员不能被序列化,因为代表类的状态;19. Object类中常见的方法,为什么wait notify会放在Object里边?
因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。也就是说等待和唤醒必须是同一个锁,而所可以使任意对象,所以可以被任意对象调用的方法是定义在object类中。
wait方法能不能被重写,wait能不能被中断;
wait方法底层原理
20. Java的平台无关性如何体现出来的
21. JDK和JRE的区别
图片转自:https://blog.csdn.net/qq_39975542/article/details/81415225
22. Java 8有哪些新特性
Class::new
Class::方法名
普通方法类似使用场景:
24. 一个十进制的数在内存中是怎么存的?
以二进制补码的形式存储。
25. 为啥有时会出现4.0-3.6=0.40000001这种现象
因为二进制系统中无法精确地表示分数1/10,就像十进制无法精确表示分数1/3一样,计算机在计算10进制小数的过程中要先转换为2进制计算,这个过程中出现了误差。如果想解决这个问题可以使用BigDcimal类。
23 .在Java中,如何跳出当前的多重嵌套循环
静态方法是和类绑定的,类可以直接调用,非静态方法是对象的成员,存放在堆中,只能被对象调用。重写的目的在于根据创建对象的所属类型不同而表现出多态。因为静态方法无需创建对象即可使用,没有对象,重写所需要的对象所属类型这个要素不存在,因此无法重写。
1. List和Set区别
2. Set和hashCode以及equals方法的联系
给Set里存入元素时必须使用hashCode和equals来存放,先根据对象的hashcode值来对比set集合中是否已存在与该元素hashcode值相等的元素,如果没有则直接存入,如果有则使用equals方法比较两个对象是否相等,若想等则不存入,否则存入;
3. List 和 Map 区别
4. ArrayList和LinkedList的区别
5. 数组和集合的区别
7. ArrayList和Vector的区别
数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
ArrayList:JDK1.6ArrayList初始默认容量为10,扩容规则:扩容后的大小=原始大小+原始大小/2 +1;1.7每次扩容1.5倍;
8. HashMap 和 Hashtable 的区别
9. HashSet 和 HashMap 区别
10. HashMap 和 ConcurrentHashMap 的区别
11. HashMap 的工作原理及代码实现,什么时候用到红黑树
12. 多线程情况下HashMap死循环的问题
13. HashMap出现Hash DOS攻击的问题
构造字符串,让它们的hashcode值相等,不断向hashmap中添加这样的值,使hashmap退化为线性表,导致性能下降;
14. ConcurrentHashMap 的工作原理及代码实现,如何统计所有的元素个数
ConcurrentHashMap工作原理
15. 手写简单的hashmap源码
16. Arraylist和Linklist默认空间是多少?
17. hashmap解决冲突的方法
https://blog.csdn.net/mashaokang1314/article/details/88672035
18. Object的hashcode()是怎么计算的?
根据一定的规则将与对象相关的信息(比如对象的存储地址、对象的字段等)映射成一个数值,这个数值称为散列值,底层是通过C++来实现计算的。
19. 为什么要重写hashcode()和equals()以及他们之间的区别与关系;
20. Java Collections和Arrays的sort方法默认的排序方法是什么
1. 线程和进程的概念、并行和并发的概念
进程是具有一定能够独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位,个人理解为正在运行中的一个程序,也可以理解为一个程序的执行过程;
线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源。
两者的关系:线程是进程中的不同执行路径,在同一个进程中,线程的切换不会引起进程的切换,在不同进程中的线程进行切换时,会引起进程的切换;
比如:打开电子邮件箱,这就是一个进程,在里面的发送、接收邮件等过程相当于多个线程;
区别:
并行:同一时刻有多个进程或线程在执行;
并发:同一时间内,有多个进程或线程来换切换执行;
2. 创建线程的方式及实现
继承Thread类创建线程:
实现Runable接口来创建:
使用Callable和Future创建:
三种方式优缺点的对比:
Runable和Callable归为一类:
采用Thread尅类方式创建:
3. 进程间通信的方式
传统的线程通信:借助Object类的wait()、notify()和notifyAll来实现;
使用Condition控制线程通道:当使用Lock对象来保证同步时,系统中不存在隐式同步监视器,Java提供了一个Contidition类来保持协调,它为每个对象提供了多个等待集。
使用阻塞队列(BlockingQueue)控制线程通信:当生产者线程试图向队列中放入元素时,如果队列已满,则该线程阻塞;当消费者线程从队列中拿出元素时,如果该队列为空,则该线程阻塞;
4. 说说 CountDownLatch、CyclicBarrier 原理和区别
参考:CountDownLatch、CyclicBarrier线程计数器
5. 说说 Semaphore 原理
6. Exchanger的实现原理
Exchanger是一个用于线程间协作的工具类,用于进行线程间的数据交换;它提供了一个同步点,到达这个同步点的两个线程可以通过exchange方法交换数据,若有一个线程提前到达,但是当前同步点并没有线程等待,则它就会阻塞等待,直到下一个线程到达同步点,两线程交换数据。因此该工具类的线程对象是成对的;多用于两线程的数据交换。
7. ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理
参考文章:ThreadLocal为什么会出现OOM
ThreadLocal 原理分析:每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有变量。ThreadLocal为每个线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。
OOM内存溢出情况:线程池的一个线程使用完ThreadLocal对象之后,再也不用,由于线程池不会退出,线程池中的线程都存在,同时ThreadLocal变量也会存在,占用内存,导致OOM溢出。
实际上每个Thread维护一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身,value是真正需要存储的Object;由于ThreadLocalMap的生命周期跟Thread一样长,如果都没有手动删除对应key,都会导致内存泄漏,但是使用弱引用可以多一层保障:弱引用ThreadLocal不会内存泄漏,对应的value在下一次ThreadLocalMap调用set、get、remove的时候会被清除。
8. 讲讲线程池的实现原理
线程池在系统启动时即创建大量空闲线程,程序将一个Runnable对象或Callable对象传给线程池,线程池会启动一个线程来执行他们的run或call方法,当方法执行结束后,线程并不会死亡,而是再次返回到线程池成为空闲状态,等待执行下一个Runnable对象的方法,线程池还可以有效地控制系统中并发线程数量。
corePoolSize 规定线程池有几个线程在运行;
maximumPoolSize 当workQueue满了,不能添加任务的时候,这个参数才生效,规定线程池最多只能有多少个参数;
keepAliveTime:超出线程池数量的线程,如果长时间没有执行,超过keepAliveTime时就会消亡;
unit:生存时间对应的单位;
workQueue:存放任务的队列;
threadFactory:创建线程的工厂;
handler:当workQueue已经满了,并且线程池数已经达到了maxmumPoolSize时将执行的决绝策略。
9 . 线程池的几种实现方式
10. 线程的生命周期,状态是如何转移的
锁机制
1. 说说线程安全问题,什么是线程安全,如何保证线程安全
线程安全的概念:当多个线程访问某一个类时,这个类始终能表现出正确的行为,那么这个类就是线程安全的。当多线程访问时,采用加锁机制,每次只能有一个线程访问数据,别的线程只能等待,直到当前线程执行完毕。
采用同步代码块;
采用CAS算法;
2. 重入锁的概念,重入锁为什么可以防止死锁
3. 产生死锁的四个条件(互斥、请求与保持、不剥夺、循环等待)
4. volatile 实现原理(禁止指令重排、刷新内存)
volatile修饰符的实现原理
5. synchronized 实现原理(对象监视器)
https://blog.csdn.net/mashaokang1314/article/details/88750509
synchronized的对象锁,其指针指向的是一个monitor对象的起始地址,每个对象实例都会有一个monitor,monitor可以与对象一起创建,销毁,或者当线程试图获取对象锁时自动生成;
6. synchronized 与 lock 的区别
9. AQS的同步队列
10. CAS无锁的概念、乐观锁和悲观锁
11. 什么是ABA问题,出现ABA问题JDK是如何解决的
这个问题是由CAS引出的。
共享变量为1000元
线程A对1000元进行操作,线程B取走了500元,此时主存中还有500,线程C又放入了500元,此时主存中1000元。这时候线程A想向主存中放入更改后的变量,发现原来的值并没有发生改变,还是1000,操作成功。其实已经发生了改变(减了又加)。
优化:版本号对比。一个数据一个版本,即使数据一样版本号也不一样,所以也不能修改成功。
version方式:一般是在共享变量上加上一个数据版本号version,表示变量被修改的次数,当变量被修改时,version加1。这样可以防止ABA问题的发生。
12. 偏向锁、轻量级锁、重量级锁、自旋锁的概念
https://blog.csdn.net/mashaokang1314/article/details/88750509
Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。
单例模式的实现双检锁
package com.westos.Demo;
public class Singleton2 {
private volatile static Singleton2 singleton2;
private Singleton2(){}
public static Singleton2 getSingleton2(){
if(singleton2==null){ //第一次检查
synchronized (Singleton2.class){
if(singleton2==null){ //第二次检查
singleton2=new Singleton2();
}
}
}
return singleton2;
}
第一次检查为了避免来回的加锁解锁,节省开销。只有当对象第一次创建时,才会进行同步。
第二次检查时为了保证只创建一个对象。
使用volatile的作用是为了避免创建对象时代码重排序。
创建对象分为三步:
2,3步都依赖第一步,所以第一步不会重排,但是2、3步并没有直接联系,所以可能会发生重排序问题。比如1 3 2 这时候如果在并发情况下,线程A执行完第3步 引用对象,这是线程B到达了第一次检查if(singletn2==null)
发现并不成立直接return singleton2,而这时步骤2还没有执行,对象还没有初始化,返回的是一个不完整的对象。而如果加上volitile就不会出现重排序问题,因为volitile规定了写操作(初始化)必须先行于读操作(引用)之前。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。