== 和 equals 的区别是什么?
- ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同。
- ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
- ==指引用是否相同, equals()指的是值是否相同
用一张图可以简要的表现他们之间的关系:
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
- hashCode()返回该对象的哈希码值;equals()返回两个对象是否相等。
- HashCode 用于在散列的存储结构中确定对象的存储地址。
- 如果两个对象equals()相等,那么两个对象的hashCode()方法返回的结果也必然相等。
- 如果两个对象的 hashCode()相同,则 equals()却不一定相等。
- 如果重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
接口和抽象类有什么区别?
- 接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
- 抽象类是什么:
抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。
(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
(2) 抽象类不能被实例化
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
(4) 具体派生类必须覆盖基类的抽象方法
(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们
- 接口是什么:
(1) 接口不能被实例化
(2) 接口只能包含方法声明
(3) 接口的成员包括方法、属性、索引器、事件
(4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员
- 接口和抽象类的区别:
(1)抽象类可以有构造方法,接口中不能有构造方法。
(2)抽象类中可以有普通成员变量,接口中没有普通成员变量
(3)抽象类中可以包含静态方法,接口中不能包含静态方法
(4)一个类可以实现多个接口,但只能继承一个抽象类。
(5)接口可以被多重实现,抽象类只能被单一继承
(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
JDK和JRE有什么区别?
- JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
- JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
String类的常用方法有哪些?
- equals:字符串是否相同
- equalsIgnoreCase:忽略大小写后字符串是否相同
- compareTo:根据字符串中每个字符的Unicode编码进行比较
- compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较
- indexOf:目标字符或字符串在源字符串中位置下标
- lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标
- valueOf:其他类型转字符串
- charAt:获取指定下标位置的字符
- codePointAt:指定下标的字符的Unicode编码
- concat:追加字符串到当前字符串
- isEmpty:字符串长度是否为0
- contains:是否包含目标字符串
- startsWith:是否以目标字符串开头
- endsWith:是否以目标字符串结束
- format:格式化字符串
- getBytes:获取字符串的字节数组
- getChars:获取字符串的指定长度字符数组
- toCharArray:获取字符串的字符数组
- join:以某字符串,连接某字符串数组
- length:字符串字符数
- matches:字符串是否匹配正则表达式
- replace:字符串替换
- replaceAll:带正则字符串替换
- replaceFirst:替换第一个出现的目标字符串
- split:以某正则表达式分割字符串
- substring:截取字符串
- toLowerCase:字符串转小写
- toUpperCase:字符串转大写
- trim:去字符串首尾空格
&和&&的区别?
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,
例如,对于if(str != null && !str.equals(""))表达式,
当str为null时,后面的表达式不会执行,所以不会出现NullPointerException。
如果将&&改为&,则会抛出NullPointerException异常。
If(x == 33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长。
抽象类必须要有抽象方法吗?
- 抽象类必须有关键字abstract来修饰。
- 抽象类可以不含有抽象方法。
- 如果一个类包含抽象方法,则该类必须是抽象类。
普通类和抽象类有哪些区别?
- 抽象类不能被实例化。
- 抽象类可以有抽象方法,抽象方法只需申明,无需实现
- 含有抽象方法的类必须申明为抽象类。
- 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
- 抽象方法不能被声明为静态。
- 抽象方法不能用private修饰。
- 抽象方法不能用final修饰。
String str="i"与 String str=new String(“i”)一样吗?
- 如果内存中没有“i”字符串,二者没有区别,都是在内存中为“i”字符串分配空间,str指向“i”的内存地址。
- 区别在于,如果内存中存在“i”字符串,第一种方式不会创建新的对象,直接指向之前的那个对象;而第二种方式会在再为“i”字符串分配空间,str指向新的“i”的内存地址,这样内存中就有两个“i”字符串了。
Exception和Error的区别
Exception和Error都继承自Throwable,在Java中只有Throwable类型的实例才可以被抛出或捕获。
Error指正常情况下不太可能出现的情况,绝大部分的Error会导致程序奔溃,处于非正常的不可恢复的状态,如OutOfMemoryError、StackOverflowError。是程序中不应该试图捕获的严重问题。
Exception是程序正常运行中可以预料的意外情况,可以捕获并处理。
运行时异常和一般异常的区别
-
不受检查异常:不受检查异常通常是在编码中可以避免的逻辑错误,根据需求来判断如何处理,不需要再编译期强制要求。
-
受检查异常:在编译时被强制检查的异常。在方法的声明中声明的异常。(举例:ClassNotFoundException、IOException)
写出几种常见的运行时异常
运行时异常RuntimeException时所有不受检查异常的基类。
NullPointerException、ClassCastException、NumberFormatException、IndexOutOfBoundsException。