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和LinkedList。区别和使用场景?
ArrayList底层使用的是数组。
在这里插入图片描述
而LinkedList的底层是链表:
在这里插入图片描述
数组具有索引,查询特定的元素比较快,而插入删除比较慢(数组是一块连续的内存,如果删除或插入时,需要移动内存)。
链表不要求内存是来连续的,在当前元素中存放上一个或下一个的地址。查询时需要从头部开始一个一个的找。所以查询效率低,而插入等操作时不需要移动内存,只需要改变引用指向即可,所以做插入删除等操作效率比较高。
所以二者的使用场景:
ArrayList(查询多,插入删除少的情况)
LinkedList(查询少,插入删除多的情况)

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倍。

由于时间问题,后面只写结论,朋友们可以有疑惑可自行去验证一下,后续再更。

发布了13 篇原创文章 · 获赞 15 · 访问量 2418

猜你喜欢

转载自blog.csdn.net/weixin_43274097/article/details/103155882