- &和&&的区别
&运算符有两种用法: (1)按位与; (2)逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是false, 右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null 而且不是空字符串,应当写为username != null &&!username.equals("),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals 比较,否则会产生NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(|) 的差别也是如此。 - 两个对象值相同 (x.equals(y) == true) ,但却可有不同的hashCode,这句话对不对?
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hashCode) 应当相同。
Java对于eqauls方法和hashCode 方法是这样规定的: (1 )如果两个对象相同(equals 方法返回true) ,那么它们的hashCode值一定要相同; (2)如果两个对象的hashCode相同,它们并不一定相同。 当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
关于equals和hashCode方法,
首先equals方法必须满足自反性(x.equals(x)必须返回true) 、对称性(x.equals(y)返回true时, y.equals(x)也必须返回true) 、传递性(x.equals(y)和y.equals(z)都返回true 时,x.equals(z)也必须返回true) 和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值) , 而且 对于任何非null 值的引用x, x.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括: 1. 使用==操作符检查"参数是否为这个对象的引用"; 2.使用instanceof 操作符检查"参数是否为正确的类型"; 3.对于类中的关键属性,检查参数传入对象的属性是否与之相匹配; 4.编写完equals方法后,问自己它是否满足对称性、传递性、一致性; 5. 重写equals时总是要重写hashCode; 6. 不要将equals 方法参数中的Object 对象替换为其他的类型,在重写时不要忘掉@Override注解。 - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。说明: Java 中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper 类中,再将Wrapper 对象传入方法) - 值传递和引用传递
1.值传递是指一个参数传递给一个函数时,函数接收的是原始值得副本。
2.引用传递是一个参数传递给一个函数时,函数接收的是原始值的地址。
3.java应用程序中,有且仅有一种传递,即值传递。
4.对象是按引用传递的。 - char 型变量中能不能存储一个中文汉字,为什么?
char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode (不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char 类型占2个字节(16比特) ,所以放一个中文是没问题的。
补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode, 当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字
符流和字节流之间进行转换的转换流,如InputStreamReader 和OutputStreamReader, 这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于C程序员来说,要完成这样的编码转换恐怕要依赖于union (联合体/共用体)共享内存的特征来实现了。 - 执行下面的代码,得到的返回值是什么?
代码在走到第3行的时候遇到了一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候,异常机制有这么一个原则如果在catch中遇到了return或者异常等能使该函数终止的话那么有finally就必须先执行完finally代码块里面的代码然后再返回值。因此代码又跳到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。因此上面返回值是3。7. error 和exception的区别? (2017-2-23)
Error类和Exception类的父类都是Throwable类,他们的区别如下。- Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
- Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
- Exception类又分为运行时异常( Runtime Exception) 和受检查的异常(Checked Exception ),运行时异常ArithmaticException,IlegalArgumentException,编译能通过,但是一运行就终止了 ,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch 捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
- 请写出你最常见的5个RuntimeException
下面列举几个常见的RuntimeException。- java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
- java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
- java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
- java.lang .IndexOutOfBoundsException数组角标越界异常,常见于操作数组对象时发生。
- java.lang.llegalArgumentException 方法传递参数错误。
- java.lang.ClassCastException 数据类型转换异常。
- java.lang.NoClassDefFoundException 未找到类定义错误。
- SQLException SQL异常,常见于操作数据库时的SQL语句错误。
- java.lang.InstantiationException 实例化异常。
- java.lang.NoSuchMethodException 方法不存在异常。
- throw 和throws的区别
throw:- throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
- throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例, 执行throw 一定是抛出了某种异常。
throws: - throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
- throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
- throws 表示出现异常的一种可能性,并不一定会发生这种异常。
- final、 finally、 finalize 的区别?
- final: Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StringBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写(这里需要注意的是不能被重写,但是可以被重载,这里很多人会弄混),所以不能同时用abstract和final修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的
final详解 - finally: 异常处理语句结构的一部分,表示总是执行。
- finalize: Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法, 当该方法被系统调用则代表该对象即将"死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法) , 不需要我们调用。
- final: Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StringBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写(这里需要注意的是不能被重写,但是可以被重载,这里很多人会弄混),所以不能同时用abstract和final修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的
- switch不能用于long类型
switch支持int和枚举类型,可以用char,byte,short,int类型,jdk1.7中支持string类型,但是不支持long类型,因为
byte取值范围-128~127
int的取值范围为(-2147483648~2147483647)
short的取值范围为-32768~32767,占用2个字节
long类型数据范为-9223372036854774808~9223372036854774807
当long转为int是会造成精度损失 - 什么情况下用 "+"运算符进行字符串连接比调用StringBuffer / StringBuilder对象的append方法连接字符串性能更好?
在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder.那么是不是可以根据这个结论推出使用" + “和StringBuilder的效果是一样的呢? 这个要从两个方面的解释。如果从运行结果来解释,那么”+ “和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。
当然,如果连接字符串行表达式很简单(如上面的顺序结构) ,那么” + “和StringBuilder基本是一样的, 但如果结构比较复杂,如使用循环来连接字符串,那么产生的Java Byte Code就会有很大的区别。
虽然编译器将” +"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环, 就会创建一StringBuilder对象虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。 - 请说出下面程序的输出
s1 == s5 是因为常量池已经有s1的值 s5的值与s1相同直接引用同一个内存地址 s1 != s6是因为s3 s4是单独的内存地址 s6也是新的内存地址
注意:s6 != s3 + s4;
补充:解答上面的面试题需要知道如下两个知识点: .- String对象的intern () 方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals 结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
2.字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这点可以用javap -C StringEqualTest.class命令获得class文件对应的JVM字节码指令就可以看出来。
- String对象的intern () 方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals 结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
- Java的基本数据类型都有哪些各占几个字节
String是引用类型,底层用char数组实现的。 - shorts1=1;s1=s1+1;有错吗?shorts1=1;s1+=1有错吗
前者不正确,后者正确。对于shorts1 = 1;s1 =s1 + 1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short 型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 =(short)(s1 + 1);其中有隐含的强制类型转换。 - 下面 Integer类型的数值比较输出的结果为?
如果整型字面量的值在-128到127之间,那么不会new新的Integer 对象,而是直接引用常量池中的Integer 对象,所以上面的面试题中f1 == f2的结果是true, 而f3==f4 的结果是false。
- 在成员方法中 不能通过this调用构造方法
javaSE面试题
最新推荐文章于 2023-03-13 10:51:57 发布