1.String,StringBufffer,StringBuilder的区别
String内存长度是不可变的,我们在开发过程中有时候会去给String赋新值或者是+值,这个其实只是创建了新的对象,而原来的对象会在新的对象创建后被销毁,垃圾回收。因此对于复杂的多变的数据,我们不要使用String
StringBuffer 是线程安全的,常用于多线程安全。因为StringBuffer要维持同步锁,这肯定要消耗部分资源,执行比StringBuilder慢。
StringBuilder 线程不安全
2.ArrayList和LinkedList的区别、hashMap和hashTable的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
hashMap和hashTable的区别:
1、Hashtable不允许kv为null值,HashMap允许kv为null值。
2、Hashtable线程安全,HashMap线程非安全。
3、Hashtable继承Dictionary类,HashMap实现Map接口。
3.多线程问题:wait sleep区别 sync线程同步、死锁问题
sleep
让当前线程休眠指定时间。
休眠时间的准确性依赖于系统时钟和CPU调度机制。
不释放已获取的锁资源,如果sleep方法在同步上下文中调用,那么其他线程是无法进入到当前同步块或者同步方法中的。
可通过调用interrupt()方法来唤醒休眠线程。
wait
让当前线程进入等待状态,当别的其他线程调用notify()或者notifyAll()方法时,当前线程进入就绪状态
wait方法必须在同步上下文中调用,例如:同步方法块或者同步方法中,这也就意味着如果你想要调用wait方法,前提是必须获取对象上的锁资源
当wait方法调用时,当前线程将会释放已获取的对象锁资源,并进入等待队列,其他线程就可以尝试获取对象上的锁资源。
4.== equse区别
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
1)对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 值是否相等,
如果作用于引用类型的变量,则比较的是所指向的对象的地址是否相等。
其实==比较的不管是基本数据类型,还是引用数据类型的变量,比较的都是值,只是引用类型变量存的值是对象的地址
2)对于equals方法,比较的是是否是同一个对象
首先,equals()方法不能作用于基本数据类型的变量,
另外,equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,所以说所有类中的equals()方法都继承自Object类,在没有重写equals()方法的类中,调用equals()方法其实和使用==的效果一样,也是比较的是引用类型的变量所指向的对象的地址,不过,Java提供的类中,有些类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值,比如String类。
5。redis:有哪些存储类型
String字符串:格式: set key value
Hash(哈希)格式: hmset name key1 value1 key2 value2
List(列表)格式: lpush name value
Set(集合)格式: sadd name value
zset(sorted set:有序集合)格式: zadd name score value
6.MongoDB:吃内存吗 为什么效率比较高
7.重载、重写
重载是一个类中方法名相同(必须相同),而入参不同的多个方法,(返回值随意),是一个类中多态性的一种表现
重写是子类继承父类中的方法对其进行重写,必须是入参返回值方法名必须完全一样,仅仅是内部逻辑不同
8.BPM工作流(非必须)
9.SpringBoot跟SpringCloud的区别
10.jdk8新特性 (非必须)
11.new创建的对象在堆区、函数中的临时变量在栈区、字符串在字符串常量区
12.jvm堆栈内存问题
13.spring IOC、AOP
面试题
1.springboot的异步调用
@Async
2.cookie session
3.Git的使用
4.防止sql注入 如果硬要用$应该怎么做
简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
如果我们order by语句后用了${},那么不做任何处理的时候是存在SQL注入危险的。你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中。
5.常用设计模式原理
6.@Component项目启动之前执行 @Async是springboot中的异步调用,其实也就是开启了另一个线程,需要在启动类加入@EnableAsync使异步调用@Async注解生效
7.线程死锁的原因
8.mybatis优缺点