Java基础面试题

JavaSE

1.==与equals()的区别。

==比较的是两个对象的地址是否一样,equals重写比的是两个对象的内容是不是一样

1)对于==

如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

重写equals方法判断流程,首先判断传进来的对象是否是本身,然后判断传的值是否为空,然后判断类型是否相同instanceof(或者使用反射getClass()),然后强转,其次判断属性(值)是否对应相等。

通常我们重写equals会比较类当中的属性是否相等

2.详细说明String类中equals()函数的执行过程

1.判断引用值是否相等,相等即返回true,不用往下走;

2.判断类型是否匹配,类型相同,长度相等,逐个比较字符是否一样,完全符合,则返回ture,一旦不对,返回false;

3.类型不匹配,返回false。

3.举例常见的异常或错误,并说明何时报错。

1)递归程序可能会用完内存,引起一个 StackOverflowError 错误。

2)越界访问数组时下标超出范围 ArraylndexOutOfBoundsException。

3)illegalArgumentException:参数有误

4)ClassCastException 类型转换异常 如将double类型转换为int 精度损失

5)ClassNotFoundException 指定类不存在 类加载时可能产生该异常

6)ConcurrentModificationException 并发修改异常

4.String的不可变性?

String类是由final修饰的,String底层是一个字符数组,该数组也是final修饰的,

当对字符串重新赋值时,需要重新指定内存区域进行赋值,不能使用原value数组进行赋值。

当对字符串进行拼接时,也需要重新指定内存区域赋值

当调用String的replace方法修改指定字符串时,也需要重新指定内存区域进行赋值。

java中String类型经常使用,牵扯大量的增删改查,每次增删改查之前都要检查这个String对象的安全性,就是通过hashCode,设计成不可变对象时候就保证了每次增删改hashcode的唯一性,就可以放心操作。字符串值都被保留在常量池中,如果是可变的,会产生逻辑错误。

String s = new String("abc") 创建了两个对象 一个是堆空间中new结构 一个是char[]对应的常量池中的数据:"abc"

常量和常量拼接在常量池,变量和常量拼接在堆空间。如果拼接的结果调用intern()方法,返回值就在常量池中。

5.String、StringBuffer、StringBuilder三者异同

String:不可变的字符序列

StringBuffer:可变字符序列 线程安全的,方法被sychronized修饰,效率低 底层使用char[] 长度为16

StringBuilder:可变的字符序列 jdk5.0新增,线程不安全,效率高 底层使用char[]

6.PreparedStatement 与 Statement 的异同?

① PreparedStatement 是 Statement的子接口

② 开发中使用 PreparedStatement 替换 Statement

③ PreparedStatement 是预编译sql语句,最大可能提高性能,在编译完后被数据库服务器缓存下来,直接使用缓存下来的sql语句,不需要重新编译,同时可以防止sql注入问题。

7.面向对象与面向过程的区别。

面向过程就是分析出解决问题的步骤,然后一步一步实现,在使用的时候分步调用即可;

面向对象就是把问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是描述某个事物在整个解决问题步骤中的行为。面向对象的思想基于面向过程

面向对象优点易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 

缺点:性能比面向过程低

8.JDK 和 JRE 有什么区别?

JREJava Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。

JDKJava Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。

JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。

9.&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

10.装箱和拆箱的执行过程

装箱是通过调用包装器类的 valueOf 方法实现的

拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。

如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法。

11.数组(Array)和列表(ArrayList)的区别?什么时候使用Array?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

Array大小是固定的,ArrayList的大小是动态变化的。

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

12.什么是值传递和引用传递?

值传递是对于基本数据而言,传递的是该变量的副本,改变副本不影响原值。

引用传递是对对象变量而言,传递的是地址,修改地址会改变原对象。

13.请你解释为什么重写equals还要重写hashcode?

HashMap中,相同的对象返回相同的hashcode值,如果不同时重写这个结论就产生错误,结合集合类去解释。

14.请解释hashCode()和equals()方法有什么联系?

➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。

➁如果两个对象的hashCode相同,它们并不一定相同。(重地和通话哈希码相同)

15.重写与重载的区别

 1)重写:父子类中,方法名相同,参数列表相同。

         遵循"运行期"绑定,根据引用指向对象的类型调用方法。

运行时确定如何调用称为动态绑定(晚绑定) 多态体现(动态绑定)

 2)重载:一个类中,方法名相同,参数列表不同,方法体一般也不同。

         遵循"编译期"绑定,根据引用的类型调用方法。

编译时确定如何调用称为静态绑定(早绑定)

16.final:不能变

1)修饰变量:变量存储的地址不能被改变

2)修饰方法:方法不能被重写

3)修饰类:类不能被继承

17.多态

多态性指的是在程序中允许出现重名现象,多态的体现:重载+重写

18.接口和抽象类的区别:

1.接口和抽象类都不能有实例

2.抽象类中可以有构造方法,普通方法和普通成员变量,接口中只能声明静态公共常量,默认都是抽象方法。

3.接口需要被实现,抽象类需要被继承

4.接口可以多继承,多实现,抽象类单继承

5.抽象类提供一种 IS-A关系,接口是LIKE-A关系。

19.请你谈一下面向对象的"六原则一法则"。

1. 单一职责原则:一类只做它该做的事。

2. 里氏替换原则:子类必须能够替换基类(父类),否则不应当设计为其子类。

3. 依赖倒换原则:设计要依赖于抽象而不是具体化。

4. 接口隔离原则:接口要小而专,不能大而全。

5. 开闭原则 :一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

6. 组合/聚合复用原则:尽量使用组合和聚合,少使用继承的关系来达到复用的原则。

7. 迪米特法则:低耦合,高内聚。

20.java和js

java面向对象 js基于对象 本身提供对象

java需要编译 js是解释性编程语言不需要编译

java变量必须要声明 js使用可以不需要

21.int和integer区别

为了能够将基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类,int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化

- 原始类型: boolean,char,byte,short,int,long,float,double

- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

<<表示左移位

>>表示带符号右移位

>>>表示无符号右移

22. final finally finalize

final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。

finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块 中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。

finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调 用,当我们调用 System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的后判断。

23.Java获取反射的三种方法

1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制

public class Get {    
    //获取反射机制三种方式    
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一(通过建立对象)        
        Student stu = new Student();        
        Class classobj1 = stu.getClass();        
        System.out.println(classobj1.getName());        
        //方式二(所在通过路径-相对路径)        
        Class classobj2 = Class.forName("Student");
        System.out.println(classobj2.getName());                                 
        //方式三(通过类名)        
        Class classobj3 = Student.class;        
        System.out.println(classobj3.getName());    
    }   
}

集合

想了解集合底层原理可以点下面连接

集合底层原理

1.ArrayList和LinkedList的区别

二者都线程不安全,相对线程安全的Vector,执行效率高。 此外,ArrayList是基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

2.ArrayList和Vector的区别

Vector是线程安全的(synchronized),因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用 ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大 小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。

3.List和Map的区别?

List存储单列数据的集合,Map存储键和值这样的双列集合。List存储数据是有序的且值可以重复。Map存储的数据无序。Map键不可以重复,最多允许一个null键,值可以重复,允许多个null。

4.ArrayList,Vector,LinkedList的存储性能和特征?

ArrayList和Vector都是使用数组方式存储元素,可以直接按照索引查找元素,访问快增删慢,而LinkedList使用双向链表存储数据,查找慢,增删快。Vector使用了synchronized方法,线程安全,性能上较ArrayList差。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得它可以被当作堆栈或者队列来使用。

5.HashMap和Hashtable的区别

1、继承的父类不同

Hashable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2、线程安全性不同

HashTable是线程安全的,HashTable方法都加入了Synchronized,HashMap是非安全的。

3、是否提供contains方法

HashMap把contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。

Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

4、key和value是否允许null值

HashMap允许空值,键key最多只能1个null值,value允许多个null,HashTable用 get()方法来判断HashTable中是否存在某个键, HashMap用containsKey()方法来判断。

Hashtable中,key和value都不允许出现null值。

5、两个集合遍历方式的内部实现上不同

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式

6、hash值不同

哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

7、内部实现使用的数组初始化和扩容方式不同

HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。

6.List、Map、Set三个接口,存取元素时,各有什么特点?

List以特定顺序存取元素,可以有重复元素。Set元素不允许重复,存取无序。Map通过键值对存取元素,也是无序的。

HashSet按照hashcode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储。

LinkedHashSet按插入的顺序存储。

7.Collection 和 Collections的区别。

Collection是集合类的上级接口,继承他的接口主要有Set 和List。

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化( synchronizedXxx()方法将集合转换为线程安全的 )等操作。

8. HashSet 是如何保证不重复的

向 HashSet 中 add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合 equles 方法比较。 HashSet 中的 add ()方法会使用 HashMap 的 add ()方法。以下是 HashSet 部分源码:

private static final Object PRESENT = new Object(); 
private transient HashMap<E,Object> map; 
public HashSet() {        
    map = new HashMap<>(); 
} 
public boolean add(E e) {        
    return map.put(e, PRESENT)==null; 
}

HashMap 的 key 是唯一的,由上面的代码可以看出 HashSet 添加进去的值就是作为 HashMap 的key。所以不会重复( HashMap 比较key是否相等是先比较 hashcode 在比较 equals )。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值