1) 什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。
2) 线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。每个线程都拥有单独的栈内存用来存储本地数据。
3) 如何在Java中实现多线程?
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
4、线程池
4) 用Runnable还是Thread?
Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好 了。
6) Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部 调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程。
7) Java中Runnable和Callable有什么不同?
主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。
8)数组的特点
在内存中,数组是一块连续的区域
数组的长度是确定的。
而集合是在空间不足时自动扩增容量
(1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
数组与集合转换:使用相应的toArray()和Arrays.asList()方法可以回想转换。
常用集合的分类:
Collection 接口的接口 对象的集合(单列集合)
├—-List 接口:有序的,可重复的
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└—-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap
9)你说一下你对spring 的理解
spring是一个开源框架
spring的优点就是让java开发模块化,贯穿了表现层,业务层,持久层。让每一个功能模块可以独立分开,降低耦合,提高代码复用率,并且支持与许多优秀的第三方框架整合。
**AOP:**面向切面编程,将程序中独立于其他功能的方法抽取出来,比如事务,日志,利用动态代理的方式,在不修改源代码的情况下,对方法进行功能的增强。
**IOC:**控制反转,将创建对象的方式由spring来管理,由spring的IOC容器来创建对象,降低组件之间直接依赖的高耦合性,通过被注入的方式实现对象实例化。
9)你说一下你对springboot 的理解
springboot是整合spring整个生态圈的一站式框架
springboot是简化技术栈 快速开发的一个脚手架
主要特点:1.化繁为简,简化配置使用 Spring 项目引导页面可以在几秒构建一个项目。
2.微服务的入门级微框架
Spring Boot 的优点快速开发,特别适合构建微服务系统,另外给我们封装了各种经常使用的套件,比如mybatis、redis等
10)动态代理的两种
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
Aspectj你有没有了解过?
spring框架一般都是基于AspectJ实现AOP操作
什么是AspectJ?
AspevcJ是独立的框架,它不是spring的组成部分,一般把AspevcJ一起使用,进行AOP操作
AOP和动态代理文章详情https://editor.youkuaiyun.com/md/?articleId=117394248
我们把创建对象的权力交给spring管理 那它的作用域有哪些?
1.spring中创建对象的三种方式
<!-- 使用无参数构造器 -->
<bean id="person" class="com.boe.Person"></bean>
<!-- 使用静态工厂方法 -->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance">
<!-- 使用实例化对象工厂方法 -->
<bean id="date" factory-bean="cal" factory-method="getTime"></bean>
Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean
spring默认创建出来的对象是单例的,存在安全问题,那这个问题是怎么解决的?
singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
Spring bean 默认是单例模式。
解决spring单例模式的线程安全问题
设置@scope(“prototype”)为多例模式,为每个线程创建一个controller,还可以使用ThreadLocal 或者把bean设置为原型模式:设置singleton=“false”
你们会在一些层上 比如在Cotroller层上定义一些全局变量吗?
一般不会 如果要 那就//把这个bean 的范围设置成session,表示这bean是会话级别的,
@Scope(“session”)
mybatis上的#与$符号的区别
#{ } 与 ${ } 的区别
#{} 是预编译处理,mybatis在处理#{}会将sql中的值变为一个?,用作占位符,等待着你往该符号添加内容。.
${ } ${}仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。 字符串替换 存在sql注入问题
什么是MyBatis?
MyBatis 是一款优秀的持久层框架
MyBatis避免了所有JDBC 代码 和手动设置参数以及获取结果集
mbatis中的接口与mapper.xml是如何进行绑定的
mybatis映射器
去mybatis-config.xml 的那文件下 写标签
告诉MyBatis 从哪个路径去找xxxMapper.xml
当实体类 与数据库的列名不匹配的时候怎么使用mybatis
解决这一方法可以给属性名起别名 或者在 resultMap结果集映射
在写sql语句时 我们有resyltType 结果类型 和parameterType 参数类型
mybatis里面 你常用的标签有哪些?
association标签 ;当属性有对象的时候 用association标签 将对象与属性联系起来
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
mappers标签;把xml与接口联系起来 映射器
<mapper class="com.mumu.dao.StudentMapper"/>
<mapper class="com.mumu.dao.TeacherMapper"/>
typeAliases标签:规定类的别名
<typeAliases>
<!-- 起别名 这样 在这个包下的类的别名就为首字母小写的类名-->
<package name="com.mumu.pojo"/>
</typeAliases>
properties标签
<!-- 引入外部配置文件-->
<properties resource="db.properties"/>
增删改查插的标签等…
嵌套查询和嵌套结果有什么差别?
嵌套查询会执行多条 SQL 语句
嵌套结果只执行一条查询语句
嵌套结果
<select id="getAllStudent2" resultMap="Student2">
select s.id sid, s.name sname, t.name tname from mybatis.student s ,mybatis.teacher t
where s.tid=t.id
</select>
<resultMap id="Student2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
<!-- <result property="id" column="tidd"/>-->
</association>
cookie 和session的区别?
cookie数据保存在客户端,session数据保存在服务器端
cookie不是很安全,如果主要考虑到安全应当使用session
如果浏览器把cookie禁用以后,session还能用吗?
“不能使用.因为session是基于cookie的.cookie存储着sessionid”
mysql数据库的默认隔离级别是什么?
mysql默认隔离级别:Repeatable read 可重复读 与spring默认的隔离级别一样
什么是脏读 什么是幻读 什么是不可重复读?
脏读:,脏读指一个事务读取其他事务正在更新的数据。脏读 顾名思义,就是读取了脏的数据,什么是脏的数据,就是未提交的事务就是脏数据
幻读: 就是一个事务对一份数据进行两次读取,出现不同的结果,原因是,再第二次读取时 其它事务操作了此份数据且未提交 导致两次读取结果不一致 称之为幻读。就叫它 ” 一 , 一, 二 “ 一份数据 一份表 两次读取 结果不一样
不可重复读::就是一个事务对一份数据进行两次读取,出现不同的结果,原因是,再第二次读取时 其它事务操作了此份数据 且已提交 导致两次读取结果不一致 称之为幻读。就叫它 ” 一 , 一, 二 “ 一份数据 一份表 两次读取 结果一样
你了解死锁吗?
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象
如何将死锁减至最少
(1)使用低隔离级别。
(2)避免事务中的用户交互。
mysql支持的索引有哪些?
、B+树索引(O(log(n)))
、hash索引:
、聚集索引(clustered index)
、非聚集索引(non-clustered index)
、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
、普通索引或者单列索引
怎么去保证缓存与数据库的双写一致性?
延时双删,先删数据库,再去删缓存
说说你怎么理解redis的
redis 是一个key value数据库
redis 默认端口号 6379
redis默认有16个数据库,默认在第0个数据库
既然redis是单线程,效率很高
既然redis是单线程的 为什么还那么快?
多线程会有cpu上下文的切换
而redis 是将所有的数据全部加载到内存中,所以直接用单线程操作效率是最高的
说一下什么是Rustful风格?
说一下springboot你常用的注解
@Component:调用无参构造创建一个bean对象,并把对象存入spring的IOC容器,交由spring容器进行管理。相当于在xml中配置一个bean。
@Controller;作用上与@Component。一般用于表现层的注解。
@Service:作用上与@Component。一般用于业务层的注解。
@Repository:作用上与@Component。一般用于持久层的注解。
@Bean:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
@Autowired:注入依赖,按照类型 如果要结合名称 加上注解 @Qualifier
@Resource ; 可以根据类型注入 可以根据名称注入
@Scope:用于改变bean作用范围的注解 设置单例或者多例
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上)
@ComponentScan 用于对Component进行扫描,相当于xml中的(类上)
@PathVariable 用于接收路径参数
String里面常用的方法有哪些?
String类代表字符串,它是final的,是不可变的字符串序列
在常量池
如果String的字符串内容相同,那么他们的地址值相同
charAt(int index):返回指定位置的字符
length():获取字符串长度
substring(int beginIndex):从beginIndex开始,取后面的beginIndex ~
substring(int beginIndex, int endIndex);取出beginIndex———endIndex之间的索引
indexOf(String str):查询str在字符串出现的位置
toUpperCase();字符串转为大写
toLowerCase();字符串转为小写
trim();去除两端的空格,一般用于登陆注册时
valueOf(xxx xx);基本数据类型转为字符串
servlet的生命周期
servlet是运行在JavaWeb中的小型java程序,它可以接受客户端发送过来的请求,并响应数据给客户端
Servlet 初始化后调用 init () 方法。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 销毁前调用 destroy() 方法。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
有张表,数据庞大 id自增 我想查最后一条数据 怎么查?
order by 方式 让表以id 从高到低排列 然后取第一条数据即可
mysql分页怎么做?
第一种:使用框架自带的pageable来进行分页
//创建page对象
Page<EduTeacher> pageTeacher=new Page<>(current,limit);
第二种:使用limit关键字来进行分页
select * from table limit 0,10;
Http与Https的区别?
Http是一种网络协议,是一个客户端和服务器端请求和应答的标准
HTTP协议传输的数据都是未加密的,也就是明文的
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。https是具有安全性的ssl加密传输协议。
TCP与udp的区别
TCP是面向连接的协议,而UDP是无连接的协议
TCP 提供交付保证,无差错,不丢失,不重复,且按序到达,也保证了消息的有序性。
UDP不提供任何有序性或序列性的保证。
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP速度比较慢,而UDP速度比较快
Spring用到了哪些设计模式?
- 简单工厂
-
- 工厂方法(Factory Method)
3.单例
- 工厂方法(Factory Method)
- 适配器
5.包装器 - 代理
- …
- …
Springboot的自动装配原理
点进去@SpringBootApplication注解。
自动装配应该是上面的@EnableAutoConfiguration注解,继续点进去
实现原理就在@Import 这个注解上 里面有自动装配的逻辑