这里写目录标题
-
-
- 1、string、StringBuffer 和StringBuilder的区别
- 2、接口和抽象类的区别?
- 3、java的形参和实参?
- 4、java值传递和引用传递的区别?
- 5、io流分类?
- 6、公司代码开发规范是什么?
- 7、为什么要重写equals()方法?
- 8、为什么重写equal必须要重写hashcode?
- 9、final、finally、finalize的区别
- 10、在什么情况下需要考虑线程安全问题
- 11、如何解决线程安全问题
- 12、线程的实现方式
- 13、什么是线程池?
- 14、创建线程池的优势、为什么要使用线程池?
- 15、线程池有哪些?
- 16、线程池满载了怎么处理?
- 17、线程和进程有什么区别?
- 18、线程生命周期
- 19、启动一个线程用start()还是run()
- 20、什么是死锁
- 21、死锁的原因?
- 22、线程死锁的条件?
- 23、如何避免死锁?
- 24、java常见的容器,与其继承关系。
- 25、vector、ArrayList、LinkedList
- 26、ThreadLocal
- 27、线程安全的容器?
- 28、hashMap和hashTable的区别?
- 29、hashMap如何实现同步?
- 30、Collection和Collections的区别?
- 31、Spring创建的对象是什么模式的
- 32、Spring容器创建对象的方式
- 33、mybatis和hibernate的区别
- 34、什么是微服务
- 35、springboot配置
- 36、同时存在yml和properties文件
- 37、springboot配置文件加载顺序
- 38、对springboot的框架的理解
- 39、StringMVC的流程
- 40、解析器和拦截器?
- 41、StringMVC的优点
- 42、说说什么是IOC和AOP
- 43、Linux基本操作命令
- 44、Linux上怎么打war包
- 45、Linux上打tar包
- 46、Linux上打rar包
- 47、定时任务
- 48、jdbc PreparedStatement的优点
- 49、jdbc Statement特点
- 50、数据库优化
- 51、数据库左连接、右连接、内连接、全连接
- 52、对一个数据量很大的表格进行查询
- 53、数据库索引
- 54、mysql的select语句执行过程?
- 55、mysql的select语句执行顺序?
- 56、mysql的having语句?
- 57、having和where的区别?
- 58、mybatis的wehere标签作用是什么?
- 59、mysql数据库表格什么情况下用到索引?
- 60、物理分页和逻辑分页。
- 61、pagehelper是逻辑分页还是物理分页?
- 62、mysql事务。
- 63、项目中用到了哪些事务?
- 64、redis是什么?
- 65、redis为什么这么快?
- 66、redis的几种类型
- 67、redis持久化的方法?
- 68、redis是如何同步数据库中的数据的?
- 69、缓存穿透、缓存雪崩、缓存击穿?
- 70、Redis里面如果有1亿条数据,如何取出其中指定的1000条数据?
- 71、es倒排索引
- 72、jQuery选择器
- 73、jQuery添加样式
- 74、前端定时器
- 75、请求转发forward,请求重定向redirect
- 76、request生命周期
- 77、session的生命周期
- 78、页面间对象传递的方法
- 79、wsdl文件(网络服务描述语言)
- 80、Tomcat的目录及作用?
-
1、string、StringBuffer 和StringBuilder的区别
首先都存储字符串的类,String是不可变的字符串,而stringbuffer,stringbuilder操作的字符串内容可变。
不同的是Stringbuffer是线程安全的,而Stringbuilder是线程不安全的。
但是StringBuilder的效率相较于Stringbuffer要更高一些(因为没有加锁),所以在不考虑线程安全的情况下,建议是使用Stringbuilder。
https://www.zhihu.com/question/20101840
2、接口和抽象类的区别?
接口其实就是在抽象类基础上添加了更加苛刻的条件。
1、抽象类中可以有普通方法,但是接口中只能有抽象方法
2、抽象类中可以有常量,可以有变量,但是接口中只能有静态常量
3、抽象类中有构造方法,接口中没有构造方法
4、接口可以多继承,但是类的继承只能是单继承
3、java的形参和实参?
形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。形参只在方法内部有效,所以针对引用对象的改动也无法影响到方法外。
实参 :就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。
4、java值传递和引用传递的区别?
5、io流分类?
字符流和字节流。
字节流:可以处理文本、图片、音视频等。
InputStream:字节输入流父类
OutputStream:字节输出流父类
字符流:只可以处理文本
Writer
Reader
6、公司代码开发规范是什么?
命名规范:包名用公司名称缩写,类名首字母大写,方法名用驼峰命名法,参数名要见名知意,逗号、分号只在后面加空格,运算符号要在前后加空格等。
数据库命名时使用下划线
7、为什么要重写equals()方法?
因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法。
8、为什么重写equal必须要重写hashcode?
equals相等的对象hashcode一定相等。如果重写了equals而没有重写hashcode,会出现一种情况,两个对象equals重写了之后判断是相等的,但是hashcode值不等,这就违背了java定义里的规则。
在一种情况下可以不考虑重写hashcode,即在对象不涉及到HashMap、HashSet和Hashtable集合时,因为这些集合是不可重复集,在添加数据时,会先根据hashcode值判断是否相等,如果相等再调用equals对比,所以如果hashcode值不相等,那程序就默认两个对象不相等,即便我们重写了equals方法,也无法判定为相同的对象。
9、final、finally、finalize的区别
final 用于声明属性,方法和类的修饰符,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成 final 类型。
finally 是异常处理语句结构的一部分,表示无论是否出现异常总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用。
10、在什么情况下需要考虑线程安全问题
多线程的时候。
多线程处理业务逻辑的时候,有可能因为共享了参数、对象等,由于运行是的先后顺序之类的问题,导致类似于数据不一致、数据污染这样的问题。
11、如何解决线程安全问题
加锁synchronized,同步方法、同步代码块,这样一个线程在进入锁的时候,其他的线程只能等待,等这个线程执行完之后,其他线程才能进入。但是也有一个弊端,加了锁的方法或代码块,性能会比不用时要低一些,所以一般考虑的就是尽量减少锁的作用域。
12、线程的实现方式
实现Runnable接口,继承Thread类,创建线程池
13、什么是线程池?
顾名思义,就是实现创建若干个可执行的线程放在一个池子中,需要的时候从池子中获取线程,不用自己重新创建,使用完之后,不需要销毁线程而是重新放入池子中。
14、创建线程池的优势、为什么要使用线程池?
减少资源的消耗,不用重复的创建和销毁线程;
提高效率,有任务来了可以直接执行,不需要再重新创建再执行;
提高可管理型,可以进行统一分配调优监控。
在我们平时java的编程中,创建和销毁对象很消耗资源,因为每次创建一个对象之后,虚拟机就需要对其进行跟踪,在对象销毁之后进行回收,所以应该尽量减少创建和销毁对象的次数,特别是一些很耗资源的对象的创建和销毁,这就是“池化资源”产生的原因。
15、线程池有哪些?
newSingleThreadExecutor:单线程的线程池。线程池中只有一个线程,执行任务是按照单线程串行执行的方式,保证了任务是按照顺序来执行的,如果这个唯一的线程因为异常结束了,那么会有一个新的线程来替代它。
newFiexedThreadPool:指定大小的线程池。每次提交一个任务就会创建一个线程出来执行任务,一直到能够达到线程池的最大数量(即我们指定的数量),如果线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
newCachedThreadPool:可缓存的线程池。如果线程池的大小大于需要处理的任务数,此时就会对部分空闲线程池进行部分回收(60s内未执行任务);当任务量增加时,线程池又会新建线程来处理任务。 此线程池不会对线程池的大小做限制,线程池的大小完全依赖于系统(或jvm)能够创建的最大线程数量。
newScheduleThreadPool:大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
16、线程池满载了怎么处理?
如果内存够用,就是线程池满了,就在创建线程池时增大池的容量上限;
如果内存不够,就加物理内存;
如果物理内存还是不够,考虑分布式系统,用云计算那一套东西。
17、线程和进程有什么区别?
线程是多个进程的集合。
18、线程生命周期
1.新建: 线程被new出来
2.就绪:线程具有执行的资格,即线程调用了start(),没有执行的权利
3.运行:具备执行的资格和具备执行的权利
4.阻塞:没有执行的资格和执行权利
5.销毁: 线程的对象变成垃圾,释放资源。
19、启动一个线程用start()还是run()
启动一个线程用start(),run()是要运行线程中的代码
20、什么是死锁
多个线程,因为竞争资源,最终陷入的一种僵局。
两个进程都在等待对方执行完毕,才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
例子:给一个类加锁,创建了两个对象之后,两个对象都是带锁的,此时线程1正在执行对象1,线程2正在执行对象2,所以线程1持有对象1的锁,线程2持有对象2的锁,然后双方都在等待对方释放锁,就陷入了死锁。
21、死锁的原因?
系统资源的竞争;进程推进顺序非法;互斥;请求与保持;不可剥夺;循环等待。
22、线程死锁的条件?
1、 互斥:一个资源每次只能被一个线程使用
2、 请求与保持:一个进程因为请求资源而阻塞,对已获得的资源保持不放
3、 不可剥夺:进程已经获取的资源,在未使用完之前,不可强行剥夺
4、 循环等待:两个进程之间形成的循环等待对方释放资源
23、如何避免死锁?
加锁,1、顺序加锁:线程按照一定的顺序依次加锁
2、加锁限时:线程在每次获取资源的时候加上时间限制,超出时间限制,放弃自己占用的资源。。。
24、java常见的容器,与其继承关系。
java容器类类库的用途是"保存对象"。
Java集合类是一种特别有用的工具类,可以用于存储数量不等的对象,并可以实现常用的数据结构,如栈,队列等.
Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象) “丢进” 该容器中
java中的容器也叫集合,是专门用来管理对象的对象
25、vector、ArrayList、LinkedList
26、ThreadLocal
ThreadLocal
用在多线程处理业务时。
27、线程安全的容器?
hashTable。
28、hashMap和hashTable的区别?
1) 继承不同
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
2) 线程安全不同。
hashTable是线程安全的,因为底层的方法做了线程同步,给get、put、remove方法方法加了同步锁,所有每次只能有一个线程来操作hashtable,效率比较低。
hashMap中的方法默认都是非同步的,所以是线程不安全的。
3) null值。
hashtable中的键值都不允许为null,否则会抛出空指针异常
hsahmap里的键值都允许为null,key只允许存在一个为null的数据,但是value允许存在多个null值,调用get(key)方法来获取到的结果为null时,既可以表示key不存在,也可以表示key对应的value值为null。 所以在hashMap里,