安硕信息一面
安硕信息科技一面技术面
封装继承多态,怎么理解?
封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。
封装的好处:隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作.
封装时的权限控制符区别如下:
继承:是一种类与类的关系,即子类拥有父类除private之外的属性,这样可以形成对代码的复用。
多态:多态的本质就是一个程序中存在多个同名的不同方法,主要通过三种方式来实现:
通过子类对父类的覆盖来实现
通过在一个类中对方法的重载来实现
通过将子类对象作为父类对象使用来实现
String对象equals方法怎么实现?
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
bean是否为线程安全
容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性。
原型Bean
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。
单例Bean
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。
如果单例Bean是一个无状态的Bean,也就是没有实例变量的对象,不能保存数据,是不变类,因此是线程安全的。
如果是一个有实例变量的对象,可以保存数据,是非线程安全的。
对于有状态的Bean,Spring官方提供的bean一般提供了通过ThreadLocal去解决线程安全的方法,使用ThreadLocal的好处在于使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。这是一种以空间换时间的方式。当然也可以通过加锁的方法来解决线程安全,这种以时间换空间的场景在高并发场景下显然是不实际的。
一个线程可以调用多次start方法吗?会怎样?
Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误。
线程的状态主要有:
NEW,新建,表示线程被创建出来还没有真正启动的状态,可以认为它是个Java内部状态
RUNNABLE,就绪,表示该线程已经在JVM中开始执行
阻塞。
等待。TIMED_WAIT,计时等待。
调用Thread.sleep方法。调用Object对象的wait方法,指定超时值。调用Thread对象的join方法,指定超时值。
TERMINATED,终止。
在第二次调用start()方法的时候,线程可能处于终止或者其他(非NEW)状态,但是不论如何,都是不可以再次启动的。
mysql创建索引的方式
CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
ALTER TABLE语句修改表的同时,可以向已有的表添加索引
查询语句多个参数怎么用mapper传递?
如果只有单个参数,使用#{}占位符即可。
如果多个参数在Mapper接口的方法参数列表使用Param注解。
如果参数太多,可以使用JavaBean,#{key}的key对应Javabean的字段,对象传递参数,直接在sql中取对象的属性即可!【parameterType="Object"】
假设实体类或者数据库的表字段或者参数过多应该考虑用Map,设置parameterType=“map”,Map传递参数,直接在sql中取出key即可!
ps:#{}与${}的区别
#{ } 在处理接受的字段会当做字符串处理,会把传入的参数自动加上引号"",例如这里如果想要删掉 ID=2 的记录
而 ${ } 不会自动添加引号"" ,就是简单的字符串拼接,容易引发SQL语句注入的安全隐患,所以一般还是推荐使用 #{ }.
索引什么情况下会使得索引失效?
1.条件中用or,即使其中有条件带索引,也不会使用索引查询,除非or条件中的每个列都加上索引
2.对于组合索引,不遵守最左匹配原则,则不会使用索引。
3.like的模糊查询以%为开头,索引失效
4.列类型是字符串,那么一定要在条件中将数据使用引号引用起来,否则不会使用索引,字符串不加单引号会导致索引失效
5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引
如果把所有表的所有字段都打上索引会怎么样?
无谓的索引反而会降低数据库的性能(特别是更新数据的速度会大受影响)
建不建索引要看你实际查询的需要。
然而,如果应用程序非常频繁地更新数据,或磁盘空间有限,那么最好限制索引的数量。
会造成你insert、update、delete等的操作非常慢(因为要维护索引)。
SpringBoot初始加载自动配置类?
@SpringBootApplication是一个复合注解,主要有三大注解组成
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration代表当前是一个配置类
@ComponentScan与@EnableAutoConfiguration中的@AutoConfigurationPackage配合使用,@ComponentScan负责扫描识别组件,然后@AutoConfigurationPackage负责将扫描到的组件注册到容器中
@EnableAutoConfigration 注解会导入一个自动配置选择器去扫描每个jar包的META-INF/xxxx.factories 这个文件,这个文件是一个key-value形式的配置文件,里面存放了这个jar包依赖的具体依赖的自动配置类。这些自动配置类又通过@EnableConfigurationProperties 注解支持通过xxxxProperties 读取application.properties/application.yml属性文件中我们配置的值。如果我们没有配置值,就使用默认值,这就是所谓约定>配置的具体落地点。
SpringBoot配置文件优先级问题?
即根目录下的config目录下,然后是 根目录下,然后是classpath路径下的config目录下,最后是classpath路径下。
优先级由高到低,高优先级的配置会覆盖低优先级的配置。
注意: 并不是高优先级的被加载了,低优先级的就不会再加载,实际上是SpringBoot会从这四个位置全部加载主配置文件,并且还能产生互相配置的效果。
当同一个目录下同时存在properties和yml文件时,会优先加载properties文件里的内容,两个文件中的内容会进行互补操作,即SpringBoot会读取两份文件中的所有内容,会加载所有不同的配置项,汇成一个总的配置,如果同一个配置两个文件中都存在,那么properties中的配置会被加载,而忽略yml文件中的配置。