面试题—JAVA基础①

文章目录

1.Java面向对象有哪些特征?

答:三大特征------> 封装(增加代码的复用性),继承(增加代码的复用性),多态(增加代码的可移植性,健壮性,灵活性)。

2.ArrayList和LinkedList有什么区别?

答:ArrayList底层原理是数组LinkedList底层原理是链表,在需要插入和删除数据的时候使用LinkedList更快,在读取数据的时候利用ArrayList底层的索引查询起来更快。

3.Java接口和抽象类有哪些区别?

答:

1.抽象类中可以定义构造器,接口不行

2.抽象类中可以有抽象方法和具体方法,但是接口中方法只有抽象方法

3.接口中成员全是public的,而抽象中的成员可以是private和其他任意的

4.抽象类中可以定义成员变量,接口中只能定义的成员变量实际上都是常量

5.一个类只能继承一个抽象类但可以实现多个接口

4.hashcode和equals如何使用?

答:hashcode的底层原理是根据数组存储数据的,然后根据HashMap其中的key通过hashcode方法计算出key对应的码值,根据码值存储数据,相同的key对应的码值相同,这时候就会实现追加数据,而追加数据的时候会用到equals方法进行比较,不同的数据就以链表的形式追加在后面

5.try-catch

答:当Java程序中执行try-catch时遇到了retrun语句或者throw语句,会导致立即结束------>如果有finally的话,只有当finally块执行完结束后,再回来执行try-catch中的return;如果finally中也有return的话,那么finally执行完后就不会再返回try-catch中的return了

例题一:

例题二:

总结

1、不管有木有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

举例:

情况1:try{} catch(){}finally{} return;

显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} return;

程序执行try块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,最后执行try中return;

finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;

程序先执行try,如果遇到异常执行catch块,

有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,

最后执行catch块中return. finally之后也就是4处的代码不再执行。

无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}

程序执行catch块中return之前(包括return语句中的表达式运算)代码;

再执行finally块,因为finally块中有return所以提前退出。
情况6:try{ return;}catch(){return;} finally{return;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;

则再执行finally块,因为finally块中有return所以提前退出。

无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。

如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,

编译器把finally中的return实现为一个warning。

6.局部变量和实例变量

实例变量:就是我们的全局变量,它是默认初始化的,有默认值

局部变量:形参这种,必须要初始化

7.String、StringBuffer、StringBuilder 的区别?

答:

1.String是不可类型的字符串,StringBuffer和StringBuilder是可变类型的字符串。(地址不变的情况下内容无法改变,如果要改变字符串内容的话,是要改变字符串所指向的地址的,后两者的源码中有自动扩容功能,如果要加内容的话直接在数组后面加就好了,空间不够的话会自动扩容,地址不会改变)

2.
总结:

1.操作少量的数据: 适用 String

2.单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder

3.多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

8.串池

一般都是问new Strng("abc")创建几个对象这种,我统一来说说

String s="abc": 通过字面量赋值创建字符串。则将栈中的引用直接指向该字符串,如不存在------>则在常量池中生成一个字符串,再将栈中的引用指向该字符串(创建0-1个对象)

String s="a"+"bc": 编译阶段会直接将"a"和"bc"结合成"abc",这时如果方法区已存在"abc",则将s的引用指向该字符串,如不存在,则在方法区中生成字符串"abc"对象,然后再将s的引用指向该字符串

String s="a"+new String("bc"): 像new的话会先在串池中看有没有,没有就在串池中来一个对象,然后再在堆中创建一个,并且引用指向堆中的------>(创建1-2个对象 )

**String s = "a" + new String("bc")😗*栈中先创建一个"a"字符串常量,再创建一个"bc"字符串常量,编译阶段不会进行拼接,在运行阶段拼接成"abc"字符串常量并将s的引用指向它,效果相当于String s = new String("abc"),只有'+'两边都是字符串常量才会在编译阶段优化

1、两个new Integer()变量比较,永远是false

因为new生成的是两个对象,其内存地址不同

2、Integer变量 和 new Integer() 变量比较 ,永远为 false

因为 Integer变量 指向的是java常量池中的对象,而 new Integer() 的变量指向堆中新建的对象,两者在内存中的地址不同。

3、两个Integer 变量比较,如果两个变量的值在区间-128到127 之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为 false
java对于-128到127之间的数,会进行缓存。 所以 Integer i = 127 时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

4、int变量与 Integer、new Integer()比较时,只要两个的值是相等的,则为true.

因为包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。

相关推荐
忒可君几秒前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
斌斌_____15 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@24 分钟前
Spring如何处理循环依赖
java·后端·spring
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
上等猿1 小时前
集合stream
java
java1234_小锋1 小时前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i1 小时前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
向阳12182 小时前
mybatis 缓存
java·缓存·mybatis