Java基础面试题(下篇)
Java基础面试题(上篇):
20、访问修饰符 public,private,protected,以及不写(默认) 时的区别?
类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护 (protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。
21、接口有什么特点?
接口中声明全是public、static、final修饰的常量
接口中所有方法都是抽象方法
接口是没有构造方法的
接口也不能直接实例化
接口可以多继承
22、抽象类和接口的区别?
抽象类:
-
抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没有方法体。子类必须重写这些抽象方法。
-
包含抽象方法的类,一定是抽象类。
-
抽象类只能被继承,一个类只能继承一个抽象类。
接口:
-
全部的方法都是抽象方法,属性都是常量
-
不能实例化,可以定义变量。
-
接口变量可以引用具体实现类的实例
-
接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
-
接口之间可以多实现
-
一个具体类可以实现多个接口,实现多继承现象
23、Hashcode 的作用
Java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set
中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样
的方法就会比较满。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每
个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的
哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当
集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理
位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如
果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相
同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
24、普通类与抽象类有什么区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法
抽象类不能直接实例化,普通类可以直接实例化
25、什么是接口?为什么需要接口?
接口就是某个事物对外提供的一些功能的声明,是一种特殊的java类,接口弥补了java单继承的缺点。
26、拷贝和浅拷贝的区别是什么?
浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:
被复制对象的所有变量都含有与原来的对象相同的值。而那些引用其他对象的变量将指向被复制过的新对象。而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
28、JDBC操作的步骤
Class.forName("com.mysql.jdbc.Driver");
2)建立 JDBC 和数据库之间的 Connection 连接:
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8", "root", "123456");
3)创建 Statement 或者 PreparedStatement 接口,执行 SQL 语句。
4)处理和显示结果。
5)释放资源。
29、什么时候用assert
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的值为 true;如果该值为 false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion 用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
30、数组有没有 length()这个方法? String 有没有 length()这个方法
数组没有length()这个方法,有length的属性。String有有length()这个方法。
31、String 和 StringBuilder、StringBuffer 的区别?
1、数据可变和不可变
1)String 底层使用一个不可变的字符数组 private final char value[]; 所以它内容不可变。
2)StringBuffer 和 StringBuilder 都继承了 AbstractStringBuilder 底层使用的是可变字符数组:char[] value;
2、线程安全
StringBuilder是线程不安全的,效率较高;而StringBuffer是线程安全的,效率较低。
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; } @Override public StringBuilder append(String str) { super.append(str); return this; }
StringBuilder与StringBuffer有公共父类AbstractStringBuilder。
操作可变字符串速度:StringBuilder > StringBuffer > String 。
32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类 ,继承具体类的前提是该类必须有明确的构造函数。
33、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以,但一个源文件中最多只能有一个公开类(public class),而且文件名必须和公开类的类名完全保持一致。
#面试题##面试题目##大数据开发工程师##java工程师##后端开发#