每天10个java面试题-day1

1.jdk 、jre、 jvm区别和联系

JDK: Java 开发工具(Java Develpment kit )
JRE: Java 运行时环境(Java runtime Enviroment)
JVM: Java 虚拟机(java virtual Machine)

1

2.==和equals

==:对比的是栈中的值;
   基本数据类型是变量值,引用类型是堆中的内存对象的地址
equals:object默认也是采用 ==比较,通常会重写
String中的equals方法重写后,对比的是字符串的内容

常见面试题:
在这里插入图片描述

3.final


最终的

  • 修饰类:表示类不可继承
  • 修饰方法:表示方法不可被子类覆盖,但是可以重载
  • 修饰变量:表示变量一旦被赋值就不可以更改它的值
    (1)修饰成员变量
  • 如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值
  • 如果final修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值
    (2)修饰局部变量
    系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化,因此使用final修饰局部变量时,即可以在定义时指定默认值(后面的代码不能对变量在赋值),而在后面的代码中对final变量赋初值(仅一次)
public class finalVar{

	//在声明的时候就需要赋值,或者静态代码块赋值
	final static int a=0;
	/**
	static{
		a=0;
	}
	*/
	//在声明的时候就需要赋值,或者代码块中赋值,或者构造器赋值
	final int b=0;
	/**
		b=0;
	*/

	public static void main(String[] args){
		final int localA;//局部变量只声明没有初始化,不会报错,和final无关
		localA=0;//在使用之前一定要赋值
		//localA=1;但是不允许第二次赋值
	}
}

(3)修饰基本数据类型数据和引用类型数据

  • 如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改
  • 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。但是引用的值是可变的。
public class FinalReferenceTest(){
	public static void main(){
		final int[] iArr={1,2,3,4};
		iArr[2]=-3;//合法
		iArr=null;//非法
		
		final person=new Person();
		person.setAge(19);//合法
		person=null;//非法
	}
}

4.String、StringBuffer、StringBuilder区别及使用场景


  • String是final修饰的,不可变,每次操作都会产生新的String对象;
  • StringBuffer和StringBuilder都是在原对象上操作
  • StringBuffer是线程安全的,StringBuilder是线程不安全的
  • StringBuffer是被synchronized修饰的
  • 性能 StringBuilder>StringBuffer>String

场景:经常需要改变字符串内容时,使用StringBuffer和StringBuilder,优先使用StringBuilder,多线程使用共享变量时使用StringBuffer

5.重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同、方法返回值和访问修饰符可以不同,发生在编译时
重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于父类,访问修饰符范围大于等于父类,如果父类方法访问修饰符为private则子类就不能重写该方法。

6.接口和抽象类的区别

  • 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法;
  • 抽象类中的成员变量可以是个中类型的,而接口中的成员变量只能是public static final类型的
  • 抽象类只能继承一个,接口可以实现多个

7.List和Set的区别

  • List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用Iterator取出所有元素,再逐一遍历,还可以使用get(int index)获取指定下标的元素
  • Set:无序,不可重复,最多只允许一个null元素,只能通过Iterator取出所有元素,在逐一遍历各个元素

8.hashCode与equals

9.ArrayList和LinkedList的区别

ArrayList

ArrayList,基于动态数组,连续内存存储,适合下标访问(随机访问);
  • 扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法制定初始容量可以极大提升性能、甚至超过LinkedList(需要创建大量的node对象)

LinkedList

LinkedList,基于链表,可以存储在分散的内存中,适合做数据插入和删除操作,不适合查询:需要逐一遍历
  • 遍历LinkedList必须使用Iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重进进行遍历,性能消耗极大
  • 另外不要试图使用indexOf等返回元素索引,使用indexOf对list进行了遍历,当结果为空时会遍历整个列表

10.HashMap和HashTable的区别,及底层实现


区别:
(1)HashMap没有被synchronized修饰,线程非安全,hashTable线程安全
(2)HashMap允许key和value为null,hashTable不允许
底层实现:数组+链表
jdk8开始,链表高度到8,数组长度超过64,链表转换为红黑树,元素以内部类node节点存在

  • 计算k的hash值,二次hash然后对数组长度取模,对应到数组下标,
  • 如果没有产生hash冲突(下标位置没有元素),则直接创建node存入数组
  • 如果产生hash冲突,则先进行equal比较,相同则取代该元素,不同,则判断链表高度,插入链表,链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则红黑树转变回链表
  • key为null,存在下标0的位置
    1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值