博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java面试题
阅读量:4980 次
发布时间:2019-06-12

本文共 3802 字,大约阅读时间需要 12 分钟。

Java的特性:

封装,继承,多态?

什么是多态?

允许不同对象对同一个行为做出不同的响应。同一消息可以根据发送对象的不同采用多种不同的行为方式。有以下几个优点:

1:可替换性:多态对原有代码具有可替换性。

2:可拓展性:在不改变原有的类结构的情况下,添加新的子类。

3:接口性:多态是父类通过方法签名,给子类定义一个公用的接口,由子类来继承和实现它。

4:灵活性。

5:简洁性。

代码中如何实现多态:

1:接口实现。

2:继承父类重写方法。

3:同一类中进行方法重载。

虚拟机是如何实现的:

动态绑定,在执行期间,判断所引用对象的实际类型。由实际类型去寻找对应的方法。

父类的静态方法能否被子类实现?

不能,无论是抽象类还是接口,都可以写一个静态的方法。但是要实现它。我们称为隐藏。

静态变量和实例变量的区别?

静态变量存储在方法区。属于类所有,实例变量存储在堆中,其引用存储在当前线程栈。

switch中能否使用string做参数

switch只支持byte,short,char,int 因为,byte,short可以转换成Int ,也可以是Enum类型。jdk1.7后支持String。

String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4请问s5==s2返回什么?

返回false。在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=new String(“ab”);

你对String对象的intern()熟悉么?

intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回。

比如 
String s1=”aa”; 
String s2=s1.intern(); 
System.out.print(s1==s2);//返回true

java中==和eqauls()的区别,equals()和`hashcode的区别

==是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和==的结果一样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法。

equals()hashcode()的联系

hashCode()是Object类的一个方法,返回一个哈希值。如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值。

如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的。)

a.hashCode()有什么用?与a.equals(b)有什么关系

hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,使用 equal() 方法来判断两个相等的对象,必须具有相同的 hashcode。

将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合。如果hashcode相等,然后通过equal()方法判断要放入对象与集合中的任意对象是否相等:如果equal()判断不相等,直接将该元素放入集合中,否则不放入。

有没有可能两个不相等的对象有相同的hashcode

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。如果两个对象相等,必须有相同的hashcode 值,反之不成立。

a=a+b与a+=b有什么区别吗?

+=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换。如:

byte a = 127; 
byte b = 127; 
b = a + b; // error : cannot convert from int to byte 
b += a; // ok 
(译者注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)

short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改?

有错误,short类型在进行运算时会自动提升为int类型,也就是说s1+1的运算结果是int类型。

short s1= 1; s1 += 1; 该段代码是否有错,有的话怎么改?

+=操作符会自动对右边的表达式结果强转匹配左边的数据类型,所以没错。

& 和 &&的区别

首先记住&是位操作,而&&是逻辑运算符。另外需要记住逻辑运算符具有短路特性,而&不具备短路特性。

final有哪些用法

final也是很多面试喜欢问的地方,能回答下以下三点就不错了:

1.被final修饰的类不可以被继承 
2.被final修饰的方法不可以被重写 
3.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
4.被final修饰的方法,JVM会尝试将其内联,以提高运行效率 
5.被final修饰的常量,在编译阶段会存入常量池中。

回答出编译器对final域要遵守的两个重排序规则更好:

1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

String, StringBuffer和StringBuilder区别

String是字符串常量,final修饰:StringBuffer字符串变量(线程安全);

StringBuilder 字符串变量(线程不安全)。

String和StringBuffer

String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。

StringBuffer是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer。

但是需要注意现在JVM会对String拼接做一定的优化:

String s=“This is only ”+”simple”+”test”会被虚拟机直接优化成String s=“This is only simple test”,此时就不存在拼接过程。

StringBuffer和StringBuilder

StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是jdk 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。

ArrayList和LinkedList的区别?

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

ArrayList和Array有什么区别?

  1. Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

  2. Array是指定大小的,而ArrayList大小是固定的

ArrayList和HashMap默认大小?

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段。

private static final int DEFAULT_CAPACITY = 10; //from HashMap.java JDK 7static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

如何打印数组内容

你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

 

转载于:https://www.cnblogs.com/bulrush/p/10700400.html

你可能感兴趣的文章
PM和风险管理
查看>>
POJ 2823 (滑动窗口)
查看>>
Leetcode-905 Sort Array By Parity(按奇偶校验排序数组)
查看>>
cmcc wlan 账号记住密码了,现在想换个账号使用,
查看>>
webpack4.x打包配置
查看>>
关于Github
查看>>
密码验证规则-正则表达式
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
网关-zuul介绍 第一篇 网关解决的问题
查看>>
AIDL Service Android进程间通信机制
查看>>
C#编程(二十四)----------修饰符
查看>>
Python第二天-list基本功能详解
查看>>
day4 DOM,BOM
查看>>
Mac系统的launchd、守护进程daemon(2013笔记整理)
查看>>
SpringMVC restful风格
查看>>
黑马程序员-懒加载 lazy loading
查看>>
对抗网络GAN的应用实例
查看>>
nginx防止DDOS攻击配置
查看>>
[Java]读取文件方法大全
查看>>
Java集合类ArrayList循环中删除特定元素
查看>>