java高频考点 1

java 高频考点 2:
https://blog.csdn.net/weixin_49198221/article/details/122144294
java高频考点 3
https://blog.csdn.net/weixin_49198221/article/details/122179622

2021年11月9日20:20:20

1.String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

大家都知道 String 是引用类型,不属于八大基本类型.
String 这玩意是不可变的,为啥不可变呢,因为底层用的是private final char value[] ,
所以你每次对他插入数据的时候都会创建一个新的对象,从造成的内存浪费,
并不是没有优点:单线程是安全的,如果只需要考虑单线程的话可以选择String.

StringBuilder和StringBuffer这两个,我一般是把它俩看成腚五俩,为啥这样说呢?
因为在jdk1.0的时候StringBuffer是可变的,
支持多线程安全,可以高并发,效率并不高,因为底层给他的方法都加了同步锁,
在jdk1.5StringBuilder也是可变的,只支持单线程安全,不能高并发,但是单线程效率高.
StringBuilder和StringBuffer都是继承AbstractStringBuilder这个类.
总结:
1.数据量较少的时可以用String
2.单线程时数据量较大用StringBuilder
3.多线程时数据量较大用StringBuffer

2021年11月10日22:53:20

2.抽象类和接口的区别?

抽象类:
使用abstract修饰,
可以有抽象方法和非抽象方法,
可以有构造方法,
如果继承抽象类必须全部重写该抽象类中的抽象方法,
如果不全部重写,则子类需要继承为抽象类.
可以实现对个接口,但只能继承一个父类
接口:
使用interface 修饰
接口中的方法没有方法体
接口中的方法默认被public abstract修饰
如果要实现接口必须重写接口中的所有方法
但在jdk8新特性中接口可以有方法体 ,实现类可以不用重写
但该方法必须是被default和static修饰
static修饰的静态方法可以使用接口名称直接调用
但实现类和实现不可以调用
如果实现类同时实现两个接口,
那么必须要重写接口中的default默认方法,不重写会报错

2021年11月11日22:20:06

3.==和equals的区别

3.1 ==比较:
1.如果his八大基本类型,底层比较的是 == 两边的字面值,相等为true.
2.如果是引用类型底层比较的是该对象的地址值,如果地址值想能就为true
3.因为java只有值传递,所以比较基本类型时时字面值
4.引用类型比较的是地址值,但c++中不仅有值传递还有地址值传递.

3.2 equals比较
1.equals比较的是两个对象是否相等,而不能用于比较基本数据类型
2.如果没有重写equals(),那么效果适合 == 一样的
3.如果重写了equals(),则在判断两个对象的内容是否相等时,相等为true

2021年11月12日22:03:21

4.重载和重写的区别

4.1 重载:
重载是在同一个类或接口中里面进行的,
是对相同的方法能实现不同的功能,从而达到功能的多样化
重载的条件是方法名必须相同,参数列表不同(参数个数,参数类型,参数顺序)
重载的方法修饰符可以不同,返回值类型也可以不同
如果被final修饰过的方法也可以重载

4.2 重写
重写是发生在有继承关系的两个类,
子类可以重写父类的所有非私有方法
如果该方法被final修饰则不可以被重写.
重写时返回值类型,参数列表,方法名,必须和父类相同,
权限修饰符必须大于等于父类的,
子类抛出的异常必须小于等于父类的.
子类不能重写父类的构造方法,因为构造方法必须要和类名保持一致.

2021年11月13日21:13:01

5.什么是面向对象?

面向对象是一种编程思想,相对于面向过程更加方便维护,更加方便复用,更加方便扩展.
面向对象的三大特性,封装继承,多态 从而可以设计车更加低耦合的系统,使系统更加灵活和维护,
但是面向对象的新能相对面向过程的新能大大折扣.
java新能差的主要原因并不是因为他面向对象编程,而是java是半编译语言,最终执行代码的并不是CUP,因为CUP只能编译二进制的机械码,而是通过java虚拟机jvm.

2021年11月14日13:36:30

6.面向对象的三大特征?

封装,继承,多态
6.1 封装:
封装就是把一个对象的的状态(属性)进行私有化,不直接对外提供访问状态(属性)的权限,
而是对外界提供一个get()/set()方法来访问.
提高了防止了恶意篡改数据,安全性.
6.2 继承:
继承是不同类型的对象之间产生的一定的共性,
继承大大降低了开发的成本,提高的代码的复用性和开发的效率
因为可以在父类的基础上对功能的扩展(这里有个原则:扩展开放,修改关闭).
子类拥有父类的所有属性,但私有属性无法直接访问,而是需要通过set()/get()方法获取.
子类可以拥有自己的属性和方法,当子类重写父类的方法后,则优先调用子类方法.
6.3 多态:
多态是一个对象有多重状态.
及父类的引用指向子类对象的示例(口缺:编译看左边,运行看右边),
也就是用父类的引用创建一个子类对象,通过父类的引用可以直接访问子类的对象实例(前提父类也有子类的该方法).
6.4 多态的特点:
1.对象的类型不可以变,引用类型可以变
2.方法具有多态,但属性没有.
3.多态不能调用只在子类存在的而父类不存在的方法

2021年11月15日12:04:50

7. hashCode 与 equals

面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方
法?"

7.1 hashCode
hashCode是用来获取哈希码值的,也叫散列码;
他返回的是以int类型的数据;
他的作用就是确定哈希表中的索引位置;
哈希表是以键值对的方式存储的;
7.2 equals
如果不重写equals会底层会用 == 来判断.
7.3 用hashSet集合来举例
hashSet集合的特点是不重复,无序,链表结构;
当我们在给hashSet集合插入数据的时候,hashSet会先计算插入数据的hashCode,
如果该集合中有和相同的hashCode就会调用equals,
用equals来检查该数据是否真的相等,
如果相等就插入失败.
7.4 hashCode与equals的相关规定
1.hashCode相等,两个对象不一定相同
2.两个对象相同,hashCode一定相同
2021年11月16日18:14:33

8.集合

8.1 List
特点:
1.元素都有下标
2.下标的是有序的
3.元素允许重复
List集合是用的最多的集合之一;
以我现在的水平List主要用做返回值类型,但都会加泛型
8.2 ArrayList
特点:
1.底层是数组
2.有下标
3.查询快,增删慢
4.底层数组默认初始化容量是10,如果不够会以1.5倍增长
ArrayList一般会用来做数据的查询
8.3 LinkList
1.链表结构,内存空间不是连续的
2.元素有下标,只是对收尾节点的操作较多
3.增删快,查询慢
LinkList一般会用做数据的增删
8.4 Set
特点
1.元素不不重复
2.元素无下标
3.可以最多为一个null
4.自定义去重时需要equals和hashCode
一般用做用户名你的去重或其他不可重复的数据结构
8.5 泛型
泛型是对集合的约束,可以更灵活,更安全的使集合存放数据
8.6 Map
特点:
1.Map可以根据键值对来存取数据,是Map结构
2.key不可以重复,如果重复将会被覆盖,但value是可以重复的
3.Map存放的都是无序的数据
4.初始化容量为16,加载因子0.75

有的时候List会与Map结合使用 例如:Map

2021年11月17日21:55:40

9.什么是异常?

异常就是程序没有按照程序员的期望执行程序,而是在执行到某个节点是时候发生程序的终止无法运行
异常包括两种:1.Exception;2.Error;3.这两个都是继承Throwable父类
Exception是可以是可以通过程序员手动处理的,在运行之前后是可以处理的
Error是java虚拟机本身存在的问题,在运行之前程序员是无法发现的
9.1处理机制
try:用于监听某处代码可能存在异常或存在异常
catch:用于捕获try抛出的异常需要怎样进行处理,可以用系统提供的处理类型或自定义处理
finally:该关键字中的代码是必须要执行的,他会在return或throw之前执行,如果return或throw存在finally中
则不会发生回执,而是直接终止
throw:一般用于抛出自定义异常
throws:用在方法签名中,如果该方法中存在异常不做自身处理而是交给该方法进行处理.
9.2产生异常的原因
1.用户输入了非法的数据
2.打开文件不存在
3.网络中断
4.JVM内存溢出
9.3异常类型
1.检查异常类型
2.运行异常类型
3.错误
9.4异常一起处理还是分开处理?
这个要根据业务的具体情况来定,
如果说是分开处理的话应该指定该异常存在的位置和时间,方便后续维护
如果说是一起处理的话应该将小范围的异常放在大范围之前去处理

2021年11月18日17:41:35

10.多线程

10.0程序
程序是存在磁盘中的静态代码,里面含有相关指令和数据的文件
10.1 进程
进程是系统运行程序的基本单位,因此进程是动态的.
当程序在执行时进程将会被操作系统加载到内存中
进程之间是相互独立的互不影响的
10.2 线程
线程是进程的最小单位,在一个进程中可以产生多个线程,
线程之间可以相互调用,共享同一块内存空间
10.3 线程基本状态
总共有6个状态
new 初始状态:刚被村共建出来,还没有调用start()方法
Runnable 运行状态:表示将要运行或是在运行中
blocked 阻塞状态:线程处于阻塞
waiting 等待状态:正在等待其他线程运行结束
time_waiting 超时状态:等待时间过长之后就会超时从新创建线程
terminated 终止状态:表示该线程已经运行结束
2021年11月19日18:29:53

11.并发与并行

并发:是指在一段时间内有多个任务执行
并行:在同一时刻处理多个任务
1.合理设置并发可以提高运行效率
2.并发是断断续续的并且是相互制约的关系

2021年11月20日20:08:08

12.并发容器(一)

并发容器总共有14个,大部分都存在jdk中的java.util.concurrent包中
1.ConcurrentHashMap:在并发情况下可以实现线程安全
2.CopyOnWriteArrayList:在读多写少的情况下性能非常好

12.1 ConcurrentHashMap
HashMap是线程不安全的,不能在高并发的情况下使用,如果要在并发的情况下使用HashMap需要使用collections.synchronizeMap()才能保重线程的安全性,但大大降低了性能.
这时ConcurrentHashMap就完美地解决了这个问题,ConcurrentHashMap无论是在读/写操作都大大提高了效率,在读操作时几乎不加锁就能保证线程的安全性.虽然在写操作时加了锁,但也影响体验感,因为ConcurrentHashMap底层加的是分段锁技术.
12.2 CopyOnWriteArrayList
读共享,写互斥,读写互斥!CopyOnWriteArrayList是比较厉害的,因为他在读写的情况下互不影响,但在写写的时候需要同步等待,这读的操作性能就大大提高了.
12.3 CopyOnWriteArrayList是如何做到的?
从名字中就能发现,他在写入操作的时候会在内存中复制一份,修改的是复制的那一份,在读的时候还是读取原有的那块内存中的数据,当在修改完之后会把原有的那块内存中的数据给覆盖掉,这就保障了在写的时候不影响读.
但是原有的内存地址会被新的内存地址覆盖,就是说将指向原来内存地址在修改之后会指向新的内存地址,原来的内存地址也将会被回收掉.
12.4 CopyOnWriteArrayList读写操作实现
读:
在读取操作时没有加任何的同步控制和锁,因为内部用array数组是不会发生改变的,因为他读取时会被替换成另一个,所以说是可以保证数据的安全.
写:
在add()方法添加数据的时候加了锁,因为要保证同步,避免多线程写入的时候会复制出多个副本出来.

2021年11月21日22:27:19

13.并发容器(二)

ConcurrentLinkedQueue:可并发的链表队列的数据结构
ConcurrentLikedQueue是队列中在高并发环境下表现最好的了,之所以性能会如此好,是因为他内部实现是很复杂的,他主要用的是CAS非阻塞算法来实现线程安全的.
比较适用在相对性能要求较高的的,同时队列的读写存在多个线程进行的场景

2021年11月22日18:29:39

14.并发容器(三)

BlokingQueue:阻塞队列容器
常用在生产者和消费者当中,因为BlokingQueue提供了可阻塞的插入和移动的方法.
当队列容器已满时,生产者线程会阻塞,知道队列未满:可以理解一杯水满了,要是向再添加,只能把杯子里的水倒掉,才能加水.
当队列容器为空时,消费者线程会发生阻塞,知道队列不为空.

BlokingQueue是一个接口,他继承Queue,Queue继承Collection接口
BlokingQueue的三个实现类:ArrayBlokingQueue;LinkedBlokingQueue;PriorityBlokingQueue

14.1ArrayBlokingQUeue
底层采用的数组,所以一旦创建长度是不可改变的,其并发控制是采用可重入锁的控制,不管是插入操作,还是读取操作都需要获取到锁才能进行操作.
ArrayBlokingQueue在默认情况下是不能保证线程的公平性的,所谓的公平性就是先等待的先执行.

14.2 LinkedBlokingQueue
底层是单向链表实现的阻塞队列,相对ArrayBlokingQueue具有更高的吞吐量,但他的缺点就是容量增速较快,损耗内存,为了避免一般情况下会指定容量大小.
**14.3 PriorityBlokingQueue **
是一个支持优先级的无界阻塞队列,默认是自然排序的,也可以自定义类实现compareTo()方法来指定元素排序规则.

15.jdk和jre的区别

jdk:java开发工具
jre:java运行环境

16.java IO流分几种

1.功能分:输入流(input) 输出流(output)
2.按类型:字节流 字符流

17.创建线程的方式?

1.继承Thread重写run()
2.实现Runnable接口
3.实现Callable接口 //不常用

18.创建线程池的方式?

共有七种,列举三种
1.newSingleTheadExecutor()
2.newCachedThreadPoll()
3.newFixedThreadPoll()

19.线程池的状态有哪些?

1.Running:运行状态
2.shutdown:不接受新的任务,但会继续等待队列中的新任务
3.stop:中断任务
4.tidying:
5.terminated:

20.java如何保证线程安全?

1.使用concurrent下的类
2.添加synchronize自动锁
3.使用手动锁 LOK

21.什么是死锁?

A想用B的锁,B想用A的锁,
但相互都独占这各自的锁,
又因为对方没有释放锁,
无法获取对方的锁,
自身的锁也无法释放,
就会产生死锁.

22.如何防止死锁?

1.尽量使用tryLock()的方法
2.设置超时时间,超时退出防止死锁
3.降低锁的粒度,避免几个功能设置同一把锁
4.减少同步代码块

23.synchronize和Lock区别?

1.synchronize:可以给类,方法代码块加锁
2.Lock:只可以给代码块加锁

24.什么是反射?

反射就是程序在运行状态的时候,对任意个类都可以获取该类的所有方法和属性和调用

25.什么是反/序列化?

1.序列化就是保存对象到内存中的状态,
2.反序列化就是将保存到内存中的对象读取出来.

26.动态代理是什么?应用有哪些?

1.动态代理是运行时动态生成的代理对象
2.spring aop ,hibernate 数据查询,java注解对象获取

27.如何实现动态代理?

1.jdk原生动态代理 基于接口实现
2.cglib动态代理 基于继承当前类的子类实现

28.session和cookie的区别?

1.储存位置:session是在服务端 cookie是在客户端
2.安全性:cookie安全性一般,存在被伪造和修改的情况
3.容量和个数限制:cookie容量有限
4.储存多样性:session可以存在Redis,数据库,应用程序中 cookie中能存在浏览器中

29.session工作原理?

session的工作原理是当客户端登陆成功之后,
服务器会创建对应的session,
创建完成之后,
会把session的ID发送到客户端,
客户端在存储在浏览器中.
这样用户每次访问都会带着session的ID,
然后在内存中找到相应的的对象ID就可以正常工作了

30.spring MVC和Struts2的区别?

1.拦截级别:Struts2是类级别的拦截:spring MVC是方法级别的拦截
2.数据独立性:spring MVC的方法是相互独立的
3.拦截机制:Struts2有自己的interceptor机制:springMVC是独立的aop方式

31.如何避免SQL注入?

1.使用预处理PreparedStatement
2.使用正则表达式过滤字符中的特殊字符

32.throw和throws的区别?

1.throw:是抛出一个异常
2.throws:是声明可能会抛出的异常

33.http响应码301和302代表什么?有什么区别?

301:永久重定向
302:暂时重定向
区别:301对搜索引擎优化有利;302有被提示为网络拦截的风险

34.forward 和 redirect 的区别?

1.forward:是转发 redirect:是重定向
2.URL:forward的url会发生变化,redirect会发生变化
3.数据共享:forward可以共享,redirect不可以
4.效率:forward比redirect高

35.get和post的区别

1.get会被浏览器主动缓存,post不会
2.get传参有大小限制,post没有
3.post参数安全,get不安全

36.如何实现跨域

1.服务器运行端跨域设置 cors = *
2.使用注解@CrossOrigin 运行跨域
3.使用jsonp跨域

37.设计模式

1.单例模式:保证被创建一次,节省系统开销
2.工厂模式:解耦代码
3.观察者模式:定义对象之前设置一对多依赖,这时,当一个对象改变时,他的所有依赖者都会收到通知并更新
4.外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用
5.模板方法模式:定义个骨架,子类可以从新定义骨架里的步骤
6.状态模式:允许对象在内部状态改变时改变他的行为.对象看起来好像修改了他的类

38.为什么要使用spring?

1.spring提供了IOC容器,可以帮帮管理依赖的对象
2.spring提供事务支持
3.spring提供 面向切面编程
4.spring集成了很多优秀的框架

39.什么是spring aop?

是面向切面编程,通过预编译的方式和运行其动态代理实现程序功能的统一维护

40.什么是spring IOC?

是控制反转的意思,是spring的核心,把对象的生命周期和对象之间的关系交给spring管理

41.spring 有哪些主要模块?

1.spring core : 提供IOC和依赖注入
2.spring context :
3.spring dao :
4.spring aop : 提供面向切面编程
5.spring web :
6.spring web MVC:

42.spring常用的注入方式有哪些?

1.setter 属性注入
2.构造方法注入
3.注解注入

43.spring中bean是线程安全的吗?

1.spring中的bean默认是单例模式,spring框架并没有对单例模式的bean进行线程的封装处理.
2.无状态:spring bean是无状态的的(如dao类),所以在某种程度上来说是线程安全的
3.有状态:在有状态的时候想要保证线程安全的话,需要程序员自己保证,可以改变bean的作用域,把"singleton"–>“protoype”,相当于new Bean()
4.有状态就是有数据存储功能 : 无状态就是不会保存数据

44.spring自动装配bean有哪些方式?

1.no:默认值,表示没有自动装配
2.byName:根据bean的名称注入对象依赖
3.byType:根据类型注入对象依赖
4.构造函数:通过构造函数注入依赖
5.autodetect:容器首先通过构造函数使用autowire装配,如果不能,则通过byType自动装配

45.spring事务实现方式有哪些?

1.声明式事务: 基于xml配置文件 : 注解方式@Transaction
2.编码方式:

java 高频考点 2:
https://blog.csdn.net/weixin_49198221/article/details/122144294

你可能感兴趣的:(java面试题,java,面试,程序人生,后端)