Java基础
1、集合有哪些?数据结构?初始长度?扩容机制?哪些线程是安全的?hashmap的底层原理?
arraylist的数据结构是数组,ArrayList 初始化大小是 10 (如果你知道你的arrayList 会达到多少容量,可以在初始化的时候就指定,能节省扩容的性能开支)扩容点规则是,新增的时候发现容量不够用了,就去扩容,扩容后的大小= 原始大小+原始大小/2 + 1。(例如:原始大小是 10 ,扩容后的大小就是 10 + 5+1 = 16)。
linkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
HashMap 初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子),扩容机制.(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍。例如:初始大小为 16 ,扩容因子 0.75 ,当容量为12的时候,比例已经是0.75 。触发扩容,扩容后的大小为 32.)
哪些线程是安全的?
线程安全的:vector,hashtable
hashmap的底层结构
在java1.8之前是数组+链表,在1.8之后是数组+链表+红黑树 当我们put元素时,通过计算key的hashcode()来插入到桶状数组的位置,根据hash值得到在数组上的位置,如果数组上没有该元素,则保存到数组上,随着添加数据多的时候,就会产生“hash碰撞”,不同的对象计算出的hash值相等,这时候,我们需要使用equlas进行比较,如果相同,则丢弃,如果不同,则以链表的形式储存,新加入的放链头。在1.8后,如果链表越来越长,就会优化成红黑树。
2、线程的创建?开启?状态?sleep和wait的区别?线程池?死锁?如何保证线程安全?
线程的创建?
继承thread类,实现runnable接口,实现callable接口,使用future task包装callable接口,线程池。
开启?
start()启动线程后,run()执行线程的内容。
状态?
创建->就绪->运行->阻塞->死亡
sleep和wait的区别?
最大的不同是在等待时 wait 会释放锁,而sleep一直持有锁。
Wait通常被用于线程间交互,sleep通常被用于暂停执行。
线程池
因为每次使用线程后都会进行销毁,如果大量线程呢?浪费cpu资源;所以用线程池来管理线程,从而降低资源消耗,提高响应速度。
死锁?
死锁就是2个进程同时在争夺资源,2个线程互不退让,一直阻塞中,直到有外力的推动下才可以释放锁。解决方案:加锁时间,加锁顺序,死锁检测
如何保证线程安全?
1、使用线程安全的类;
2、使用synchronized同步代码块,或者用Lock锁
3、==和equals的区别?
== 是判断两个变量或实例是不是指向同一个内存空间
equals是重写equals()方法,判断两个内存空间中的值是否相等
4、对反射的理解?获取class类的方式有哪些?如何用反射获取私有属性filed?
反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。
简单理解:不创建对象,就能获取对象的信息
获取class类的方式有哪些
通过new创建对象
通过静态工厂方法创建
反射的Forname()来获得
io流的反序列化
如何用反射获取私有属性filed?
创建出反射对象 使用 setAccessible 方法 参数设置成true就跳过安全检查直接获取
5、常用的设计模型有哪些?在项目中哪里有用到?单例中懒汉饿汉的优缺点?
常用的设计模型有哪些?
单例模式 工厂模式 动态代理 装饰者模式
在项目中哪里有用到?
IOC就是典型的工厂模式,通过sessionfactory去注入实例。
aop采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码.
单例中懒汉饿汉的优缺点?
懒汉式 在被调用的时候才创建对象 需要使用锁来避免创建出其他对象
线程不安全 需要加锁 速度慢
饿汉式 提前创建出来对象 被调用的时候直接返回 反应速度块
6、jdk1.8的新特性有哪些?
Lambda表达式可以对接口进行简单的实现
优化了hash
7、session的实现原理?session的生命周期?sessuin如何存储数据?
session的实现原理?
用户访问一个服务器,服务器会启动session,在为用户创建一个session的时候,会查看用户发送的请求中是否含有sessionId,如果有,按照这个sessionid在的内存中查找出来,如果没有,则创建一个对应的session id。session id 保存到cookie中。
session的生命周期?
服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
如果在20分钟内重新访问session 将重新计时
sessuin如何存储数据?
使用request对象获取session
8、cookie和session的区别?
存放位置不同:cookie是存放到客户端的,session是存放到服务器中
安全程度不同:cookie不安全,别人可以分析存放在本地的cookie,session是相对安全的
数据存储大小:cookie的储存为4k,而session存放数据到服务器上,如果考虑服务器的性能,建议存放到cookie中
生命周期不同:cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束。session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁
9、类加载机制?代码块执行的顺序?
类加载机制
加载,验证,准备,解析,初始化
将.class文件(也可以是zip包)通过二进制字节流读入到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证,字节码校验,符号引用验证等。准备是对这个对象分配内存。解析是将符号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码。
执行顺序
父类的静态代码块->子类的静态代码块->初始化父类的属性值/父类的普通代码块->父类的构造方法->初始化子类的属性值/子类的普通代码块->子类的构造方法。
10、java的字符串方法有哪些?string stringbuilder stringbuffer的区别
length():字符串长度
indexOf():返回指定字符在此字符串中第一次出现处的索引
equals():比较字符串的内容是否相同,区分大小写
trim():掐头去尾
toString():转成字符串
getBytes():把字符串转换为字节数组
replace()字符互换
stringbuffer.append()字符拼接
isEmpty(): 判断字符串的内容是否为空串
string是字符常量,一旦创建不得修改,stringbuffer,stringbulider是字符变量,可以进行字符拼接。
其中stringbuffer是线程安全的,stringbuilder是线程不安全,性能更高。在开发过程中,常用stringbulider,因为效率高。
在这方面运行速度快慢为:StringBuilder > StringBuffer > String
11、jvm调优和垃圾回收机制?
12、java中的锁的种类和基本原理?
悲观锁和乐观锁
悲观锁是无论查看数据还是修改数据都会加锁,导致运行过慢
乐观锁,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。CAS(Compare and Swap)C有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。会产生ABA问题。
13、collection和collections的区别?
collection是接口 collections是java类
14、java如何跳出循环?
continue,break,return
15、排序有哪些?原理是什么?
冒泡排序
上一位给下一位比较大小 如果大或者小交换位置
选择排序 循环找出最大的或者最小的 然后给他放到数组的第一位
16、什么是堆栈?什么是内存溢出?有垃圾回收机制为什么还会出现内存溢出的情况?
什么是堆栈?什么是内存溢出?有垃圾回收机制为什么还会出现内存溢出的情况?
堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要 在堆上分配
栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操 作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所以还是一个指向地址的指针
什么是内存溢出?
当创建一个对象或者变量的时候 可以使用的内存大小并不够能分配给 变量或者对象这时候就是出现了内存溢出的情况
有垃圾回收机制为什么还会出现内存溢出的情况?
动态扩展的栈内存无法满足内存分配。
在并发量比较高同时候频繁的创建出大量的对象 内存地址本来就较小然后导致内存溢出
17、内存模型的理解?
为了保证共享内存的正确性(可见性,有序性,原子性),内存模型定义了共享内存系统多线程程序读写操作行为的规范。通过这些规范保证了并发场景下的一致性、原子性和有序性。
18、泛型的理解?
泛型相当于在集合中 在创建集合的时候可以定义传输的格式定义之后集合里面只能放入固定的类型
19、java的基本数据类型有哪些,int占几个字节,byte占几个字节?
No. | 数据类型 | 字节 | 大小/位 | 可表示数据范围 | 默认值 |
---|---|---|---|---|---|
1 | byte (字节型) | 1 | 8 | -128~127 | 0 |
2 | short (短整型) | 2 | 16 | -32768~32767 | 0 |
3 | int (整型) | 4 | 32 | -2147483648~2147483647 | 0 |
4 | long (长整型) | 8 | 64 | -9223372036854775808~9223372036854775807 | 0 |
5 | float (单精度) | 4 | 32 | -3.4E38~3.4E38 | 0.0 |
6 | double (双精度) | 8 | 64 | -1.7E308~1.7E308 | 0.0 |
7 | char (字符) | 2 | 16 | 0~255 | ‘\u0000’ |
8 | boolean (布尔) | - | true或false | false |
20、常见的异常有哪些?异常处理的方式有那些?
常见的异常有哪些?
运算异常 IO异常 空指针异常
异常处理的方式有那些?
使用try cher 吧可能出现异常的代码给他包裹起来
21、枚举的了解?
22、final,finally,fianlize关键词的区别?volatile关键字的了解?
23、在一个list中存放的string类型的字符串。如何实现把其中带有“王”的字符串冲list中去除?
List<String> list=new ArrayList<>();
list.add("王航");
list.add("航");
for(int i=list.size()-1;i>=0;i--){
if(list.get(i).indexOf("王")!=-1){
list.remove(i);
}
}
System.out.println(list);
24、string a=“123”;string b=“123”;a+=b;生成几个对象?
3个
25、如何序列化和反序列化?序列化的目的?
26、java自动拆箱
先看以下代码
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2); //false
Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);//true
System.out.println(i3 == i5);//true
Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);//false
System.out.println(i6 == i8);//true
Integer和int的比较:
装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的 valueOf(int) 方法
拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int)。调用方法:Integer的intValue方 法
都定义为Integer的比较:
new:一旦new,就是开辟一块新内存,结果肯定是false
不new:看范围
Integer做了缓存,-128至127,当你取值在这个范围的时候,会采用缓存的对象,所以会相等
当不在这个范围,内部创建新的对象,此时不相等
数据库
1、sql的优化有哪些?如何创建索引?创建索引的原则是什么?索引的优缺点?
sql的优化有哪些?
如何创建索引?
创建索引的原则是什么?
索引的优缺点?
2、sql如何去重?
单表:distinct 多表:group by
3、内连接和外连接的区别?
内连接 判断where后面等号的值相等的查找出来
外连接是左连接或者右连接是根据左边列表进行查询的,如果说没有的话就按空。
4、java中如何使用redis?redis支持的数据类型即各种数据类型的使用场景?redis如何解决数据过期?
5、数据可表的设计注意事项有哪些?三大范式的了解?
6、存储过程的了解和使用?
7、数据库如何实现分页?百万计量的数据分页查询如何优化?
8、数据库的乐观锁和悲观锁的理解和使用?
9、数据库中字符串和日期的相互转换?
10、union和unionAll区别?
11、mysql的存储引擎有哪些?
12、事务的隔离级别有哪些?mysql和oracle默认的隔离区别有哪些?
13、sql如何行转列和列转行?
14、如何产看sql的执行计划?
15、oracle中的分析数据有哪些?
16、数据库除了聚合函数之外还有那些常用的函数?oracle数据库merge()函数的作用和使用?
17、sql中drop,truncate,delete的去呗
18、mysql如何忽略表名的大小写?
19、having和where的区别?
20、如何使用数据库中的定时器、触发器、定时任务?
21、游标的作用和使用?
22、oracle中如何实现递归查询?
23、高并发下如何保证修改数据的安全?
24、oracle中如何实现主键自增?
25、delete误删数据没有备份怎么办?
26、oracle死锁如何处理?
框架
1、spring的特性是什么?ioc和aop的原理是什么?aop的注解有哪些?
2、springboot自动配置原理是什么?springboot配置文件中常用配置有哪些?
3、springboot项目如何打包、部署、运行?
4、spring是如何控制事务的?
5、springmvc常用注解及作用?
6、springmvc的工作原理?
7、mybatis的工作原理是什么?mybatis缓存的理解?
8、mybatis的#{}和${}的区别?
9、springboot的异常处理?
10、spring中如何配置拦截器、过滤器?
11、spring管理的bean是否存在并发?
12、sptingsession的原理是什么?
13、spring的类加载器是什么?
14、springcloud的组件有哪些?作用分别是什么?
15、dubbo和springcloud的区别和优缺点?
16、getway的动态路由如何实现?
17、鉴权框架的了解和使用?
18、mybatis同时操作同一条数据该怎么解决并发问题?
19、mybatis中传递参数有哪些方式?
20、spring中bean的声明周期?作用域有哪些?
21、怎么实现mybatis批量插入?
22、junit如何使用?
23、spting的工厂模式如何使用?
24、springboot是如何对线程进行封装的?
25、springboot中starter种类有哪些?如何写一个springboot的staiter组件?
26、设计一个开放接口,如何保证接口安全性?
实用技术
1、文件的上传和下载如何实现?
2、第三方的工作流有哪些?如何使用的?
3、对activemq、rabbitmq、kafka的了解和使用?消息发送失败如何处理?如何防止消息的重复使用?
4、svn和git冲突如何解决?
5、如何测试自己的接口
6、poi导入excel是如何数据溢出,如何解决?
7、linux常用命令有哪些?
8、如何调用第三方接口?
9、分布式,集群,微服务的理解?
10、分布式事务的处理逻辑?怎么实现的?
11、事务的特性?分布式如何保证数据的一致性?
12、decker的常用命令有哪些?
13、模板迎请的了解和使用?
14、项目中定时任务怎么写?
15、如何实现邮箱和短信的发送?
16、两方各已购项目之间的实时数据互通你会怎么做?
17、nginx的了解和使用?
18、maven如何解决jar包处理
19、树形结构的表如何设计?
20、如何实现菜单及增删改查的功能权限管理?
21、开发程序需要那些文档?
可行性研究报告、需求规格说明书、项目计划、软件测试计划、概要设计说明书、详细设计说明书、编程规范、软件测试用例、软件测试报告、用户手册、安装手册、项目总结报告
前端
1、ajax请求方式。阐述类型,状态码?
2、jquery常用的选择器?
3、前后端是如何左到数据交互的?前端怎么转给后端json数据?
4、前端和后台都是如何解决跨域问题的?
5、前端如何防止表单重复提交?
6、vue的声明周期?vue的指令?vue的双向绑定如何实现?vue如何实现自定义时间?vue如何实现监听?vue如何实现请求?vue的路由跳转方式?
7、get和post的区别?
8、jquery如何获取当前日期?
9、如何给画面中所有的checkbox标签添加一个时间?
10、jquery怎么打开一个模态窗口?
11、表单验证是如何实现的?
12、readonly和disable有什么区别
13、如何画一个表格?如果合并一个表格?
14、如何获取一个文本框的内容?
15、jquery如何获取from表单的值?
16、前端如何延时调用一个数据?
17、如何取出树性结构的数据?前端如何显示树性结构数据?
18、js中this在各种情况下的指向?
19、如何将数据保存到前端?
20、如何实时刷新页面?
21、什么是http协议无状态协议?怎么解决http协议无状态协议?