Java基础面试点1
1.Java跨平台原理
java通过不同的系统、不同版本、不同位数的java虚拟机(jvm),来屏蔽不同的系统指令差异,而对外提供统一的接口(Java API),对于开发者而言,只需要按照接口开发即可。如果需要部署到不同的环境时,只需要在对应的系统环境安装对应版本的虚拟机即可。
2.装箱和拆箱
Java中提供了8中基本的数据类型:byte、short、 int、 long 、float 、double、 char 、boolean。每一个基本类型都有与之对应的包装类型,如:int – Integer,boolean – Boolean等。
Integer i = 1; //自动装箱
Integer ii = Integer.valueOf(1); //手动装箱
System.out.println(i == ii); // true
再来看看自动装箱的源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
实际上就是从缓存里面取出来返回。low~high: -127~128,细节可自行查看源码,而不在此范围内的话则会返回一个新的Integer对象。也就是说, Integer i = 1;是在编译的时候调用了valueOf()方法来进行装箱(其中1是直接从缓存里面取出来的)。装箱就是将基本类型转换成包装类型的过程。
拆箱:
Integer i = 1; //自动装箱
int x = i; //自动拆箱
int xx = i.intValue(); //手动拆箱
System.out.println(x == xx); //true
public int intValue() {
return value;
}
直接返回值。换句话说,拆箱就是将包装类型转换成基本类型的过程,而自动拆箱就是在编译的时候调用了intValue()。
**那为什么有了基本类型,还需要包装类型?**因为java是一款面向对象的编程语言,基本类型不具备面向对象的特征。换句话说就是基本类型没有一系列的操作数据的方法,而包装类型则满足了这一点。
3.==和equals()究竟有什么区别?
3.1 ==
==用来判断两个变量的值是否相等,变量可以分为基本类型和引用类型。
int i = 1;
int b = 1;
System.out.println(i==b);//true
如果是基本数据类型之间相互比较,直接比较它们的值。
Integer a = 128;
Integer b = 128;
int c = 128;
System.out.println( a==b ); //false
System.out.println( a==c ); //true
验证了上面说的Integer的缓存机制,128超出了范围,所以会创建新的对象,所以a和b的引用内存地址是不一致的。
所以引用类型与引用类型,比较的是它们对应的引用的内存的首地址;基本类型和引用类型比较,比较的是它们的值。
3.2 euqals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Object类的equals():
public boolean equals(Object obj) {
return (this == obj);
}
equals()比较的是两个对象长得是否一样(比如String重写的equals(),可以理解为比较的内容是否一致),判断两个对象的某些特征是否一样。Object的equals()方法直接是判断对象是否相等,如有需要可以重写。
4.String、StringBuilder、StringBuffer的区别
4.1 String的内容是不可变的。String的底层使用了一个不可变的字符数组(final char[]) :
而StringBuilder和StringBuffer则可以改变。
StringBuilder和StringBuffer提供了一系列改变内容的方法,比如append();
String在拼接字符串的时候会创建很多中间对象,而StringBuilder和StringBuffer是在同一个对象进行拼接的,效率不一样。
StringBuilder和StringBuffer的区别就是:StringBuilder是线程不安全的,效率高;而StringBuffer则是线程安全的(方法加了锁synchronized),效率低。
5.讲一下Java中的集合?
5.1 Java中的集合分为 value ,key–value(Collection,Map)两种。
存储value的分为 List 和 Set。
List是有序的,可以重复的。
Set是无序的,不可重复的,根据equals()和 hashCode()判断。
存储在Set中,必须重写equals()和 hashCode()
存储key-value的为 Map。
5.2 List常用的ArrayList和LinkList。区别和使用场景?
ArrayList底层使用的是数组。
而LinkList的底层是链表:
数组具有索引,查询特定的元素比较快,而插入删除比较慢(数组是一块连续的内存,如果删除或插入时,需要移动内存)。
链表不要求内存是来连续的,在当前元素中存放上一个或下一个的地址。查询时需要从头部开始一个一个的找。所以查询效率低,而插入等操作时不需要移动内存,只需要改变引用指向即可,所以做插入删除等操作效率比较高。
所以二者的使用场景:
ArrayList(查询多,插入删除少的情况)
LinkList(查询少,插入删除多的情况)
5.3 HashMap 和 HashTable的区别
5.3.1.HashMap 和 HashTable 都可以存储 key-value的数据
5.3.2.HashMap 是可以把 null 作为key或者value的,而HashTable则不能。
5.3.3.HashMap是线程不安全的,效率高;而HashTable则是线程安全的,效率低。
想要线程安全并且效率高? 了解一下ConcurrentHashMap 。
5.4 HashMap 和 ConcurrentHashMap 的区别?
ConcurrentHashMap:
通过把整个 Map 分为 N 个 Segment(类似HashTable),可以提供相同的线程安全,而且效率提升N倍,默认提升16倍。
由于时间问题,后面只写结论,朋友们可以有疑惑可自行去验证一下,后续再更。
推荐阅读
-
1.java小作业-计算1到100的整合-指定输入多少行输出就打印多少行-打印24小时60分钟每一分钟-重载基础练习-面向java编程初学者
-
Java基础系列--08_集合1
-
荐 Java语言基础(1)
-
Java基础练习1(数据类型转换)
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时101:反射实例化对象
-
Java基础之Collections框架Map接口实现类HashMap及其源码分析(1)
-
阿里三面,复盘总结55题:java基础+分布式+网络+架构设计
-
1.Java基础语法
-
【刷题1】LeetCode 39. 组合总和 java基础
-
Java基础学习1