JAVA面试题第三天

今天是第三天。
1.JAVA的几种数据类型
基本数据类型:
a.数值型:
1.整数类型:byte,short,int,long
2.浮点类型:float,double
b.布尔型:boolean
c.字符型:char
引用数据类型:
a.接口
b.类
c.数组

2.ArrayList和LinkedList的区别
ArrayList和linkedlist都实现了List接口
1.ArrayList是基于索引的数据接口,底层是基于数组实现的。它可以以O(1)的时间复杂度访问随机元素,LinkedList是以元素列表来存储数据的,每一个元素都与它的前一个元素和后一个元素连接在一起,它访问任意元素的时间复杂度是O(n)。
2.相比于ArrayListed,LinkedList的添加,插入,删除元素的速度更快一些,因为当元素添加到集合的任意位置的时候,不用象数组那样重新计算大小或者更新索引。
3.LinkedList比ArrayList更加占用内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素。

3讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类构造函数,子类非静态变量,子类构造函数。

4.关于HashMap
HashMap是线程不安全的,在jdk1.8它是数组+链表+红黑树实现的。采用哈希表来存储的。

5.有没有顺序的Map实现类,如果有,他们是怎么保证有序的。
TreeMap和LinkedHashMap是有序的,TreeMap默认升序,LinkedHashMap则记录了插入顺序。

6.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
1.接口和抽象类都不能直接实例化,如果要实例化,就需要让抽象类变量必须指向实现所有抽象方法的子类对象,让接口类变量指向实现所有接口方法的类对象。
2.抽象类要被子类继承,接口要被类实现。
3.接口只能做方法的申明,抽象类可以做方法的申明,也可以做方法的实现。
4.接口地变量只能是公共的静态的常量,抽象类的变量是普通的变量。
5.抽象类的方法必须全部由子类实现,如果不能,那么该类只能是抽象类,同样的接口的方法如果不能全部被类实现,那么该类只能是抽象类。
6.抽象方法只能被申明,不能实现。
7.抽象类里面可以没有抽象方法。
8.如果一个类里面有抽象方法,它只能是抽象类。
9.抽象方法要被实现,所以不能是静态的,也不能是私有的。
10.接口可以继承多个接口,类只能单根继承。

7.继承和聚合的区别在哪
继承指的是一个类继承另外一个类的功能,并且可以增加自己的新功能的能力。
聚合是一种关联关系的特例,表示的是整体与部分之间的关系,此时的整体和部分是可以分离的,他们可以有各自的生命周期,部分可以属于多个整体对象,也可以被多个整体对象所共享。

8.写出三种单例模式的实现
单例模式提供了一种创建对象的最佳方式。
优点:
1.此内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
2.避免对资源的多重占用。
https://www.jianshu.com/p/efa678272c62

缺点:
没有接口,不能继承,与单一职能原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

懒汉式:线程不安全
public class Singleton {
private static Singleton instance;
private Singleton (){}

public static  Singleton getInstance(){
	if (instance==null) {
		instance = new Singleton();
	}
	retrun instance;
}

}
这种方式不支持多线程,因为没有同步锁,多线程下不能工作。

实现方式二:懒汉式(线程安全)
public class Singleton{
private static Singleton instance;

	public static synchronized Singleton getInstance(){
				if(instance == null){
							instance = new Singleton();
				}
				return instance;
	}

}
优点:一个对象初始化一次,节省内存
缺点:必须使用synchronized来维持单例,没效率。

实现方式三:饿汉式(线程安全)
public class Singleton{
private static Singleton instance = new Singleton();

public static Singleton getInstance(){
		retrun instance;
}

}
因为作为静态资源,所以在类加载时就实例化了。
优点:没有加锁,执行效率会更高
缺点:类被加载时就初始化,浪费内存。

实现方式四:双检锁(线程安全)

public class Singleton {
	private static Singleton instance;
	
	public static Singleton getInstance(){
			if(instance == null){
				synchronized(Singleton.class){
						if(instance==null){
						instance = new Singleton();
						}
				}
			}
			return instance;
	}

}

采用双锁机制,安全且在多线程情况下能保持高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值