在面试过程不懂得问题集合
Java基础
java数据类型
1.重写与重载的区别
1.重写是针对子类与父类而言的,子类继承父类之后,对父类的可以访问的方法的实现过程进行重新编写,不改变其返回值类型与参数。
即外壳不变,核心重写! (返回值,方法名,参数都要与父类一致)
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
2.重载是针对同一个类而言的,重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只需要方法名一致
最常用的地方就是构造器的重载。
构造器可重载,不可重写。
2.多态与转换(向上转换,向下转换)
向上转型:子类型–>父类型(自动类型转换) 父类型的引用指向了子对象。
向下转型:父类型–>子类型(强制类型转换) 只有在访问子类型特有的方法时使用。并用instanceof方法提前判断,一面出现类型转化异常。
注意:类型转换时的前提:两类型必须存在继承关系。
3.多态的作用:降低程序的耦合,提升程序的扩展力。 (能使用多态就是用多态,父类型引用指向子类型对象)
核心:面向抽象编程,不要面向具体编程。
2.抽象类与接口的区别
抽象类:
1.可以有成员方法
2.可以有构造方法
3.可以有抽象方法,也可有非抽象方法。(抽象方法没有方法体以;结束)
4.可以被抽象类继承,也可被非抽象类继承 5、抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。 6、重要结论: 重要结论五颗星*****(必须记住)
一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。
这是java语法上强行规定的,必须的,不然编译器就报错了。
接口:
1、接口也是一种“引用数据类型”。编译之后也是一个class字节码文件。
2、接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。
3、接口怎么定义,语法是什么?
[修饰符列表] interface 接口名{}
4、接口支持多继承,一个接口可以继承多个接口。
5、接口中只包含两部分内容,一部分是:常量。一部分是:抽象方法。接口中没有其它内容了。只有以上两部分。
6、接口中所有的元素都是public修饰的。(都是公开的。)
7、接口中的抽象方法定义时:public abstract修饰符可以省略。
8、接口中的方法都是抽象方法,所以接口中的方法不能有方法体。
9、接口中的常量的public static final可以省略。
10、五颗星(*****):当一个非抽象的类实现接口的话,必须将接口中所有的
抽象方法全部实现(覆盖、重写)。
重点(五颗星*****):一个类可以同时实现多个接口。
这种机制弥补了java中的哪个缺陷?
java中类和类只支持单继承。实际上单继承是为了简单而出现的,现实世界中
存在多继承,java中的接口弥补了单继承带来的缺陷。
接口不是类,没有构造方法。抽象类是被继承,接口被实现。
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 在Java中,类的多继承是不合法,但接口允许多继承。(接口继承接口)
注:JDK 1.8 以后,接口里可以有静态方法和方法体了。
4.equals与==的区别
用简单基本类型,根本无法使用equals方法,只能用==,对于String类或者简单类型的包装类(Integer是int的包装类)==比较的是否是同一个地址(对象),equals比较的是地址值
equals是属于Object的方法,在默认实现下其实就是==,也就是说和==是一样的,下图是Object中的默认实现
equals 的参数是object类型 所以不支持基本数据类型,Intger,String等包装类型 java内部已经默认重写了,但是自定义类型需自己重写
变量存的是等号后面的值,对象等号后面存的是地址
详情链接:https://baijiahao.baidu.com/s?id=1652442464525126879&wfr=spider&for=pc
5.构造方法的作用
构造方法两个作用:创建对象 给属性赋值。
String ,Stringbuffer, Stringbuilder的区别
1.String类的源代码中有一个byte数组,并且此byte数组是final修饰的。
数组一旦创建长度不可变,并且被FINAL修饰的引用一旦只想某个对象之后,不可再指向其他对象。所以String是不可变的。
###注意:
2.,Stringbuffer, Stringbuilder是可变的 ,两个类的源代码中的byte数组没有被final修饰,并且两者的初始化容量都为16,当存满之后会进行扩容,底层调用了数组拷贝的方法。所以以上两者更适合与字符串的频繁拼接操作。
3.Stringbuffer, Stringbuilder的区别:
https://segmentfault.com/a/1190000017909550
小结:
(1)如果要操作少量的数据用 String;(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。
https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
Integer的整型常量值问题
数组、List、ArrayList的区别
数组:
优点:数组在内存中是连续存储的,所以它的索引速度非常快,赋值与修改元素简单。
缺点:但声明数组时必须指定数组长度,过长或过短都会造成一些问题,且在两个数组元素之间插入或删除元素比较麻烦,不够灵活。
ArrayList:
优点:声明ArrayList对象是不需要定义长度,大小可以按需伸缩,且继承了IList接口,在两个元素之间插入或删除元素操作简单。
缺点:允许插入不同数据类型的数据,会把所有的元素当作Object类型来处理,处理数据的时候很可能会报类型不匹配的错误,也就是说,ArrayList不是类型安全的,存在装箱与拆箱操作,会造成很大的性能损耗。
装箱:值类型实例到Object的转换;
拆箱:Object到值类型实例的转换。
list:
声明List对象时需要同时声明集合内对象的数据类型,避免了类型不安全和拆装箱的性能损耗问题;但List不能被构造。
Form表单中method="post/get’的区别
https://www.cnblogs.com/hnrainll/archive/2011/06/07/2074593.html
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。
使用Post传输的数据,可以通过设置编码的方式正确转化中文;而Get传输的数据却没有变化。在以后的程序中,我们一定要注意这一点。
Get和Post请求有什么区别
https://www.cnblogs.com/logsharing/p/8448446.html
get请求中特殊字符的处理
https://blog.csdn.net/liuxiao723846/article/details/23277563
2.线程
1.线程生命周期
https://www.cnblogs.com/marsitman/p/11228684.html
2.线程中直接调用T.run()和T.start()的区别
start():开辟一个新的栈空间,run()在栈底,由jvm调度器自动调用。
run():普通方法,不会开辟栈空间,属于单线程。
https://zhuanlan.zhihu.com/p/44460979
3.wait()和sleep()的区别
sleep的作用
sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。
wait的作用
调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。
sleep与wait差异总结
1、来自不同的类:sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
2、有没有释放锁(释放资源):sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。
3、一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
死锁
Lock锁
@Controller和@RestController的区别
http://www.mamicode.com/info-detail-2263488.html
数据库
1.数据库中的字段和实体类中的字段不一致
https://www.cnblogs.com/xiaomaomao/p/13662171.html
HTTP请求
http 请求协议包
Http 响应协议包
计算机网络
1.TCP和HTTP的区别和联系
TCP是传输层协议,定义数据传输和连接方式的规范。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。
HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应,它是TCP协议族中的一种,默认使用 TCP 80端口。
好比网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样。