Java基础面试题(1-10)必备,你全熟悉吗?

每天分享10到Java面试题

每天准备10到面试题,每天进步一点点,只为更好的进步!

1.重载和重写的区别

  1. 重载:(回答该问题之前,想一想自己在学习的过程中,有没有写过此类代码,如果不清楚,建议看代码,会理解比较透彻,不建议死记硬背!)重载,它发生在一个类中,在该类中方法名是必须相同的,参数类型不同 ,个数不同,顺序不同,以及方法的返回值和访问修饰符都可以不同,而且发生在编译时。
  2. **重写:**一般发生在父子类中,方法名,参数列表必须相同,返回值的范围小于等于父类,抛出的异常范围小于等于父类(即为父类的全集、子集或者空集),访问修饰符的权限必须大于等于父类;如果父类中的方法被private修饰符修饰,则子类就不能重写该方法。

2.String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?

回答此问题一般从可变性、线程安全性、性能三个方面来回答:
(1)可变性: String类中使用final关键字字符数组保存字符串,即private final char[] value,由于有final修饰,所以Sting对象是不可变的。而StringBuilder与StringBuffer都是继承于AbstractStringBuilder类,而该类和String类一样,也是采用字符数组保存字符串,但是该类底层是char[] value,并没有final关键字修饰,所以StringBuilder和StringBuffer是可变的。

(2)线程安全性: 由于String中的对象都是不可变的,我们一般理解为常量,所以是线程安全的。而对于StringBuffer来说,对方法中加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而对于StringBuilder的来说,并没有对方法或者调用的方法加同步锁,所以是非线程安全的。

(3)性能: 每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指向新的 String 对象。StringBuffer和StringBuilder每次都是对其对象本身进行操作,而不是生成新的对象兵改变对象的引用。但是在相同的情况下,StringBuilder要比StringBuffer性能快一些,因为StringBuffer是线程安全的。
总结: 如果操作少量的数据,建议使用String;如果在单线程操作大量数据,建议使用StringBuilder,在多线程下使用StringBuffer。

3.自动装箱与拆箱

装箱: 将基本类型用他们对应的引用类型包装起来;
拆箱: 将包装类型转换为基本数据类型;
而这些包装类都是在 java.lang中的

基本数据类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

4.== 与 equals()的区别?

==: 它的作用是判断两个对象的地址值是否相等。即判断两个对象是否为同一对象。(基本数据类型中比较的值,引用数据类型比较的是内存)
equals(): 作用就是判断两个对象是否相等。但是也要分两种情况使用:
(1)看类是否重写了equals方法,如果没有重写,则通过equals()比较的是两个类的地址是否相等,本质上还是通过 == 来实现的。因为equals()底层实现是采用==来实现的
(2)如果重写了该方法,则比较的是两个对象的内容是否相等;如果相等,则返回true。
思考一下:String a = “AAA”;String b = “AAA”;为什么a==b则返回true?
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

5.接口和抽象类的区别?

  1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法。
  2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定。
  3. 一个类可以实现多个接口,但最多只能实现一个抽象类。
  4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定。
  5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
    备注: 在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错!

6.冒泡排序

关于冒泡排序,还是挺重要的,自己再熟悉一下原理,以及看看自己是否能独立写出来**。毕竟笔试过程中,你不可能拿着手机去百度吧!**

public class Sort {
	public static void sort() {
		Scanner input = new Scanner(System.in);
		int sort[] = new int[10];
		int temp;
		System.out.println("请输入10个排序的数据:");
		for (int i = 0; i < sort.length; i++) {
			sort[i] = input.nextInt();
		}
		for (int i = 0; i < sort.length - 1; i++) {
			for (int j = 0; j < sort.length - i - 1; j++) 			{
				if (sort[j] < sort[j + 1]) {
					temp = sort[j];
					sort[j] = sort[j + 1];
					sort[j + 1] = temp;
				}
			}
		}
		System.out.println("排列后的顺序为:");
		for(int i=0;i<sort.length;i++){
			System.out.print(sort[i]+"======");
		}
	}
	public static void main(String[] args) {
		sort();
	}
}

7.List的三个子类的特点

1.ArrayList 底层结构是数组,底层查询快,增删慢
2.LinkedList 底层结构是链表型的,增删快,查询慢
3.Voctor 底层结构是数组 线程安全的,增删慢,查询慢

8.List 和 Map、Set 的区别(必会)

结构特点:
List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;
List 中存储的数据是有顺序,并且允许重复;
Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的 hashcode 决定,位置是固定的(Set 集合根据 hashcode 来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);
实现类
List 接口有三个实现类(LinkedList:基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;Vector:基于数组实现,线程安全的,效率低)。
Map 接口有三个实现类(HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键;HashTable:线程安全,低效,不支持 null 值和 null 键;LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序;SortMap 接口:TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序)。
Set 接口有两个实现类(HashSet:底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hashCode()方法;LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp)。

9.HashMap 和 HashTable 有什么区别?

1.HashMap 是线程不安全的,HashMap 是一个接口,是 Map 的一个子接口,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap 的效率要较 HashTable 的效率高一些.
2.HashTable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者 Value 值;
3.HashTable 是 sychronize,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;

10.HashMap,HashTable,ConcurrentHashMap之间的区别,及性能对比(必会)

性能: ConcurrentHashMap(线程安全) > HashMap > HashTable(线程安全)
1、HashMap是非线程安全的,HashTable是线程安全的。
2、HashMap的键和值都允许有null值存在,而HashTable则不行。
3、因为线程安全的问题,HashMap效率比HashTable的要高
4、Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。一般现在不建议用HashTable, 一是 HashTable是遗留类,内部实现很多没优化和冗余。二是 即使在多线程环境下,现在也有同步的ConcurrentHashMap替代,没有必要因为是多线程而用HashTable。

HashTable使用的是Synchronized关键字修饰,ConcurrentHashMap是使用了锁分段技术来保证线程安全的。
Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。
ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老大学Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值