为什么重写 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注解
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 | 主要的非事务处理存储引擎 |
NDB | MySQL 集群专用存储引擎 |
存储引擎的4种推荐选择,
1. 如要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,推荐InnoDB。
2. 如数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
3. 如只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的MEMORY引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
4. 如只有INSERT和SELECT操作,可选择Archive,Archive支持高并发的插入操作,但本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive。
索引分为哪些种类
1,普通索引:普通索引是最基本的索引,它没有任何限制,值可以为空;仅加速查询。
2,唯一索引:唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
3,主键索引:主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
4,组合索引:组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
5,全文索引:全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。