Java面试

为什么重写 equals 还要重写 hashcode?

== 和 equals 比较的区别

为啥有时会出现 4.0 - 3.6 = 0.40000001 这种现象?

final 关键字的作用

介绍 Java 的集合类

ArrayList 和 LinkedList 的区别

JDK和JRE有什么区别

JDK(Java Development Kit),Java开发工具包

JRE(Java Runtime Environment),Java运行环境

final关键字有什么作用

final用来修饰类、方法和变量

final 修饰的不能够被继承,修饰的方法不能被继承类重新定义即不能重写,修饰的变量为常量,是不可修改的。

Java中的String类为什么用final修饰

  • String类用final修饰,代表String不可被继承
  • 存储字符串的数组用private final修饰,其中final可以保证value的引用地址不会被修改,配合private保证数组值不被外部修改。这样就保证String类的不可变性

String类用final修饰一方面保证在多线程环境下的线程安全,另一方面实现字符串常量池节约内存和提升性能。

不可变性的好处
String类的不可变性带来的好处总结主要有两点:

因为String类的不可变性,才能使得JVM可以实现字符串常量池;字符串常量池可以在程序运行时节约很多内存空间,因为不同的字符串变量指向相同的字面量时,都是指向字符串常量池中的同一个对象。这样一方面能够节约内存,另一方面也提升了性能。
因为String类的不可变性,从而保证了字符串对象在多线程环境下是线程安全的。如果String类是可变的,那么会引起很严重的安全问题。我们在很多情况下都是直接通过字符串传递数据,比如数据库的用户名密码、网络编程中的ip和端口,因为字符串是不可变的,所以它的值不能被修改,如果字符串是可变的,那么可以通过改变引用地址指向的值去修改字符串的值,从而导致安全漏洞
 

String常用的方法

length 返回字符串长度、

String[] split(String regex)根据给定正则表达式的匹配拆分此字符串、

boolean equals(Object anObject)将此字符串与指定的对象比较、

contains判断是否包含指定字符串、

substring 截取字串返回、

replace 替换原有字串

toUpperCase变大写、toLowerCase变小写、isEmpty判断是否为空

String、StringBuilder和StringBuffer区别

  • String是不可变对象,每次对String类型的改变时都会生成一个新的对象。
  • StringBuilder 线程不安全,效率高,多用于单线程。
  • StringBuffer 线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

StringBuilder > StringBuffer > String。
 

列举集合

set、list、map

线程安全的集合

Vector:就比Arraylist多了个同步化机制(线程安全)。
Stack:栈,也是线程安全的,继承于Vector。
Hashtable:就比Hashmap多了个线程安全。
ConcurrentHashMap:是一种高效但是线程安全的集合。

锁这一块

java 中 IO 流分为几种?

(1)按流划分,可以分为输入流和输出流;

(2)按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;例:读文件

线程池:创建一个线程池有哪些方法

spring注解

Spring常用注解(绝对经典)

1、给容器中注入组件

@Component:泛指各种组件

@Controller、@Service、@Repository都可以称为@Component。

@Controller:控制层

@Service:业务层

@Repository:数据访问层

(2)@Bean

导入第三方包里面的注解

(3)@Import

@Import(要导入到容器中的组件);

@ImportSelector:返回需要导入的组件的全类名数组;

SpringBoot的启动类用的是什么注解

1. @SpringBootApplication

使用@AliasFor注解定义了4个参数,分别是"exclude","excludeName","basePackages","basePackagesClasses"

exclude指定不扫描的类,比如 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

excludeName直接指定不扫描的类名称

basePackages指明扫描路径

basePackagedClasses指明扫描的类

2. @EnableDiscoveryClient、@EnableEurekaClient

都用于注册发现服务,但是@EnableEurekaClient只适合Eureka,而@EnableDiscoveryClient可以是其它注册中心。从Spring Cloud Edgware开始,@EnableDiscoveryClient或@EnableEurekaClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

3. @EnableTransactionManagement

支持事务管理,只要在service上加@Transaction。

4. @EnableConfigurationProperties

@EnableConfigurationProperties注解的作用是,使使用 @ConfigurationProperties 注解的类生效。

5. @EnableAsync

@EnableAsync可以让Spring启用异步方法执行,就跟在xml中配置<task:*> 效果是一样的。它可以跟@Configuration结合,让整个Spring环境启用基于注解的异步处理

默认情况下,Spring会查找一个关联的线程池:要么是一个org.springframework.core.task.TaskExecutor类型的bean,要么是一个类型是 java.util.concurrent.Executor名字是taskExecutor的bean。如果这两个都没找到,Spring会使用org.springframework.core.task.SimpleAsyncTaskExecutor来执行异步方法,SimpleAsyncTaskExecutor实际上并不是线程池,它是为每一个新任务创建一个新的线程。此外,如果异步方法的返回值是void,那么调用过程中的异常信息是无法返回给调用者的,默认只是记录日志。

ThreadPoolTaskExecutor并没有被Spring容器管理,可以在getAsyncExecutor() 上添加@Bean注解让它变成Spring管理的Bean。如果加入到Spring容器,那么就不需要手动调用executor.initialize() 做初始化了,因为在Bean初始化的时候会自动调用这个方法。

6. @EnableScheduling

观察它的源码,发现它导入了SchedulingConfiguration类,而这个类会创建一个ScheduledAnnotationBeanPostProcessor,该processor中的processScheduled()方法会去处理加上了@Scheduled的方法。

 所以它的简单使用方法是,编写一个job类,在上面加上@Component注解,然后在方法上加上@Scheduled

7. @EnableFeignClients

OpenFeign的注解,相信很多人都用过,我们通过这个注解告诉框架扫描所有使用注解@FeignClient定义的feign客户端。

8.@EnableCaching

@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。

当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。

mysql的存储引擎

存储引擎描述
ARCHIVE用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
CSV在存储数据时,会以逗号作为数据项之间的分隔符。
BLACKHOLE会丢弃写操作,该操作会返回空内容。
FEDERATED将数据存储在远程数据库中,用来访问远程表的存储引擎。
InnoDB具备外键支持功能的事务处理引擎
MEMORY置于内存的表
MERGE用来管理由多个 MyISAM 表构成的表集合
MyISAM主要的非事务处理存储引擎
NDBMySQL 集群专用存储引擎

存储引擎的4种推荐选择,

1. 如要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,推荐InnoDB。

2. 如数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。

3. 如只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的MEMORY引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。

4. 如只有INSERT和SELECT操作,可选择Archive,Archive支持高并发的插入操作,但本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive。

索引分为哪些种类

1,普通索引:普通索引是最基本的索引,它没有任何限制,值可以为空;仅加速查询。
2,唯一索引:唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3,主键索引:主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
4,组合索引:组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
5,全文索引:全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。

15、vue和ajax

16、中间件redis这块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值