SpringBoot
spring是java平台上的一种开源应用框架,它提供了一系列的解决方案,如:
1、利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象的生命周期;
2、AOP功能,可以将日志、事务、安全等功能代码抽离出来成为单独的工具组件,和业务代码分离
优势:
1、低侵入的框架,同时可以降低组件之间的耦合
2、方便的集成其他框架
3、降低开发难度
Springboot继承了spring的优秀特性,通过简化配置进一步简化了spring应用的搭建和开发。
特点:
1、尽可能自动配置Spring容器
2、不需要xml配置
3、内嵌Tomcate和servlet容器
两个重要策略:
1、开箱即用
在开发过程中,通过pom文件添加相关的依赖,然后使用注解代替xml文件配置来管理对象的生命周期
2、约定优于配置
由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
HashMap和HashTable、ConcurrentHashMap
HashTable
1、底层数组+链表实现,key和value都不能为null,线程安全
2、初始size是11,扩容:newsize = olesize2+1
HashMap
1、底层数组+链表实现,key和value允许为空,线程不安全
2、初始size为16,扩容:newsize = oldsize2
ConcurrentHashMap
1、底层采用分段数组+链表实现,线程安全
2、HashTable锁住了整张表,ConcurrentHashMap允许多个修改操作并发进行,关键在于采用锁分离技术
深拷贝与浅拷贝
浅拷贝
1、对于基本数据类型,会进行值传递赋值
2、对于引用数据类型,进行引用传递赋值
方法:
1、拷贝构造函数
2、clone方法
深拷贝
1、所有的对象都会开辟新的内存空间,创建一个全新的对象
方法:
1、重写clone方法
2、对象序列化
虚函数
虚函数可以实现cpp动态多态,有虚函数的对象会有一个指针指向虚函数表,派生类会继承虚函数表。
如果派生类没有覆写基类虚函数,那么那么派生类虚函数表的函数指针和基类虚函数指针指向同一片内存区域;
如果派生类覆写的基类的虚函数,那么派生类虚函数表的函数指针就会开辟新的区域;
数据库三范式
1、列不可拆分;即:每一列所表示的属性不能再拆分成更小的部分
2、非主键列必须完全依赖于主键列,不能只依赖一部分
3、列之间的依赖关系不能构成传递关系
事务的ACID特性
即原子性(Automicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性指的是事务中的操作要么全部完成,要么全部撤销
一致性指的是事务的操作都是再逻辑上正确的
隔离性指的是多个事务之间不相互干扰,并发的事务之间要相互隔离
持久性指的是事务一旦提交,对数据库的操作就是永久性的
sql优化
java常见异常以及处理方法
java的异常以Throwable为顶层父类,派生出Error和Exception;
Error代表jvm本身的错误,错误不能够通过代码处理;
Exception代表程序运行时不期望发生的机制,可以被java异常处理机制处理;
根据javac对异常的处理要求,将异常分为两类:
检查异常:由程序的运行环境导致的,使用try…catch…final…throws处理异常
非检查异常:在编译的时候不会提示和发现这样的异常,可以编写代码处理,如数组越界,空指针异常
Redis数据类型
- String
- List
- Set
- Zset
- hash
与关系型数据库相比,redis命令请求不需要经过查询分析器和查询优化器进行处理,也避免了更新数据时的I/O操作
TCP和UDP协议
- 相同点:UDP和TCP协议都是传输层协议
- TCP:提供面向连接可靠的字节流服务。即客户端和服务器交换数据前,必须在双方之间建立一个TCP连接,之后才能传输数据,并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据从一端传到另一端。
-UDP:是一个面向数据报的运输层协议,不提供可靠性,只是把应用程序给IP层的数据报发送出去,不能保证到达。 - TCP三次握手过程:
[1]主机A向主机B发送一个含有同步序列号标志位的数据段(SYN)给主机B,请求建立连接,通过这个数据段告诉主机B两件事:想要通信;对方可以用哪个序列号作为其实数据段回应我;
[2]主机B收到后,用一个带有确认应答(ACK)合同部序列号(SYN)标志位的数据段响应主机A,告诉主机A两件事:已经收到请求,可以传输数据;你要用那个数据段作为起始数据段回应我;
[3]主机A收到数据段之后,再发送一个确认应答,确认已经收到主机B的数据段,告诉主机B:我已经收到回复,现在开始传输数据 - TCP四次挥手过程:
[1]主机A完成数据传输后,将其控制位FIN置1,提出停止TCP连接请求;
[2]主机B收到FIN后对其做出相应,确认将TCP连接关闭,将ACK置1;
[3]主机B提出反方先的关闭请求,将FIN置1;
[4]主机A对主机B的请求进行确认,将ACK置1,双方连接关闭
1、一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的
2、Java有没有goto?
其实goto这个词是C语言中的,goto语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。而在结构化程序语言中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。但是在java语言中,goto这个词只是作为了保留字,还没有使用。那是因为java语言讲究简单,方便。
3、说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,&&也是短路运算,当第一个条件不满足,不会计算第二个条件;
&还可以用作位运算
4、在JAVA中如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,
然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
- switch可作用于char byte short int
- switch可作用于char byte short int对应的包装类
- switch不可作用于long double float boolean,包括他们的包装类
- switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
- switch中可以是枚举类型
6、short s1= 1; s1 = (s1+1是int类型,而等号左边的是short类型,所以需要强转)1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?(没有错)
s1 = s1 + 1 会报错,因为s1+1会自动提升为int型,然后赋值给short类型肯定会报错;
s1 += 1不会报错, +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译
7、char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
8、用最有效率的方法算出2乘以8等於几?
2<<3;
9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用不能变,引用的对象可以改变
10,静态变量和实例变量的区别?
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关
3.内存分配方式不同。
4.生命周期不同。
11、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
12、Integer与int的区别
Integer是对象,int是基本数据类型
13、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?
14、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?
Overload是重载的意思,Override是覆盖的意思,也就是重写。
不能通过访问权限、返回类型、抛出的异常进行重载
15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?
接口是可以继承接口的,抽象类可以实现接口,抽象类可以继承具体类。抽象类中可以有静态的方法
16、Java中实现多态的机制是什么?
强制的:整型+double型运算
重载的:运算符重载
参数的:List 抽象类中,描述了一组具有同样特征的对象,提供了一个通用的模板。你可以通过指定一种类型以重用这个抽象类
包含的:继承
17、abstractclass和interface语法上有什么区别?
抽象类只能单继承,接口可以实现多继承;
18、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。
19、内部类可以引用它的包含类的成员吗?有没有什么限制?
20、String s = “Hello”;s = s + “world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?
没有,只是指向了新的对象
21、ArrayList和Vector的区别
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
22、HashMap和Hashtable的区别
23、List和 Map区别?
List:是存储单列数据的集合,存储的数据是有序并且是可以重复的
Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复
24、List,Set, Map是否继承自Collection接口?
List,Set是,Map不是。
25、List、Map、Set三个接口,存取元素时,各有什么特点?
List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。
26、说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此 数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据 慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存 储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList却是原来的一半
27、去掉一个Vector集合中重复的元素
28、Collection和Collections的区别。
Collection是集合类的上级接口,继承与他有关的接口主要有List和Set
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作
29、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
30、你所知道的集合类都有哪些?主要方法?
31、String s = new String(“xyz”);创建了几个StringObject?是否可以继承String类?
32、String和StringBuffer的区别
33、下面这条语句一共创建了多少个对象:String s=”a”+”b”+”c”+”d”;
34、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
35、final, finally, finalize的区别。
36、运行时异常与一般异常有何异同?
37、error和exception有什么区别?
38、简单说说Java中的异常处理机制的简单原理和应用。
java对异常进行了分类,不同类型的异常使用了不同的java类,所有异常的根类为java.lang.Throwable.Throwable派生了2个子类:Error和Exception.
Error表示程序本身无法克服和恢复的一种严重错误,程序只有死的份,如内存溢出和死锁问题等系统问题。
Exception表示还能克服和恢复,其中又分为系统异常和普通异常。系统异常是软件本身缺陷导致的问题,也就是软件开发问题考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但这种情况下可以选择让软件继续运行或死掉。如数组越界问题(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException),类转换异常(ClassCastException);普通异常是运行环境的变化或异常导致的问题,是用户能够克服的问题,如网路掉线、硬盘空间不足、IO异常发生这种异常后程序不应该死掉。
java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或throws声明继续抛给上层调用方法处理。所以普通异常为checked异常,而系统异常可以处理也可以不处理。编译器不强制用try..catch或throws声明,所以系统异常成为uncheckde异常。
39、Java 中堆和栈有什么区别?
40、能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
41、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
42、字节流与字符流的区别
43、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
44、描述一下JVM加载class文件的原理机制?
45、heap和stack有什么区别。
46、GC是什么?为什么要有GC?
47、垃圾回收的优点和原理。并考虑2种回收机制。
垃圾回收机制有分代复制垃圾回收、标记垃圾回收、增量垃圾回收。
48、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
49、Java 中,throw 和 throws 有什么区别
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
throw:则是用来抛出一个具体的异常类型。
50,java中会存在内存泄漏吗,请简单描述。
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景;
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露
