目录
仅挑选部分面试题
0. &和&&的区别
判断用户登录时用户名不为空或者空字符串username!=null && username.equals("")
如果username=null,这段代码不会执行&&右边的代码,不能使用&运算符,否则会出现NullPointerException异常。(这就是短路与,如果左边false,右边就直接被短路)
1.(重载)overload和(重写)override区别
重载实现的是编译时的多态性而重写实现的是运行时的多态性。
重载(overload)
(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。函数的返回值只能作为函数运行后的一个"状态",他是保持方法和调用者与被调用者进行通信的关键,并不能作为方法的"标识"。
重写:(override)
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类
(3)子类函数的访问修饰权限不能少于父类的
2. ==和equals区别
==:基本类型(比较数值),引用数据类型(对象的地址值)
equals:比较对象内容是否相等(引用类型的变量所指的对象地址)
3. Java中有哪些异常,error和Exception的区别是什么
RuntimeException:
java.lang.ArrayIndexOutOfBoundsException–数组越界异常
java.lang.ArithmeticException --算术条件异常
java.lang.IllegalArgumentException–非法参数异常
java.lang.ArrayStoreException --数组中包含不兼容的值抛出的异常
java.lang.NegativeArraySizeException–数组长度为负异常
java.lang.ClassNotFoundException–找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
java.lang.NullPointerException–空指针异常(比如说调用null对象的方法)
IOException:
IOException:操作输入流和输出流时可能出现的异常
FileNotFoundException:文件未找到异常
Error(错误):
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
Exception(异常):
是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
原文:https://blog.youkuaiyun.com/qq_29229567/article/details/80773970
- final、finally、finalize的区别
final:声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被修饰的类不可被继承。例如String就是final类。
inally:异常处理语句的一部分,表示总是执行
finalize:Object类的一个方法,在垃圾回收器中执行的是的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等,该方法更像是一个对象声明周期的临终方法,当该方法被系统调用则代表该对象即将死亡,但是注意是我们主动行为调用该方法并不会导致该对象死亡,这是一个被动的方法,其实就是回调方法,不需要我们调用。
5. String、StringBulider、StringBuffer区别
String:String是只读字符串,是不可以被改变的,因为String被设计成不可变(immutable)类,对象是不可变对象。
StringBuffer/StringBuilder表示字符串可以直接进行修改。
执行速度:StringBuilder>StringBuffer>String
StringBuffer是线程安全的,StringBuilder是线程不安全的
6. 日期API工具,实现加减天、周、月数等等
LocalDate today = LocalDate.now();
//今年是否是闰年
System.out.println("year "+today.getYear() +" is Leap year? "+today.isLeapYear());
//今天和一个日期对比
System.out.println("today is before 2019-12-07? "+today.isBefore(LocalDate.of(2019,12,07)));
//获取当前日期时间
System.out.println("current time= "+today.atTime(LocalTime.now()));
//对日期进行加减操作
System.out.println("10 days afer today will be "+today.plusDays(10));
System.out.println("10 days before today will be "+today.minusDays(10));
打印结果:
year 2019 is Leap year? false
today is before 2019-12-07? true
current time= 2019-07-19T10:53:08.793
10 days afer today will be 2019-07-29
10 days before today will be 2019-07-09
7. Integer类型的比较
Integer f1=100,f2=100,f3=128,f4=128;
System.out.printf(String.valueOf(f1==f2));
System.out.printf(String.valueOf(f3==f4));
打印结果
truefalse
解释:当我们给一个对象赋int值的时候,会调用Integer
类的静态方法valueOf,简单的说如果整形的字面量值在-128到127之间,不会new一个新的Integer对象,而是直接引用常量池中的Integer对象。
8. String常用类
9.两个对象值相同(x.equals(y)==true),但却可有不同hashCode,这句话是对的吗
不对,如果两个对象x和y满足x.equals(y)==true,他们的哈希码(hashCode)应当相同。