欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础面试点1

程序员文章站 2022-05-05 22:49:38
...

1.Java跨平台原理

Java基础面试点1
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[]) :
Java基础面试点1

而StringBuilder和StringBuffer则可以改变。
Java基础面试点1
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底层使用的是数组。
Java基础面试点1
而LinkList的底层是链表:
Java基础面试点1
数组具有索引,查询特定的元素比较快,而插入删除比较慢(数组是一块连续的内存,如果删除或插入时,需要移动内存)。
链表不要求内存是来连续的,在当前元素中存放上一个或下一个的地址。查询时需要从头部开始一个一个的找。所以查询效率低,而插入等操作时不需要移动内存,只需要改变引用指向即可,所以做插入删除等操作效率比较高。
所以二者的使用场景:
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倍。

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