Java常见面试题

1,JAVA中的几种基本数据类型是什么,各自占用多少字节?
int:4
short:2
long:8
double:8
float:4
char:2
byte:1
boolean:1
2,String类能被继承吗,为什么?
不可以,因为String类是由final修饰,用final修饰的类是不能被继承的
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
3,String,StringBuffer,StringBuilder的区别?
这三个类的主要区别在于运行速度与线程安全。
运行速度:StringBuilder>StringBuffer>String
线程安全:Sring是不可变类是线程安全的,StringBuffer是线程安全的,StringBuilder是线程不安全的
(1)运行速度:String与常量,其他两个是变量
String str = ""hello";
str += “world”;
JVM对于上面代码是这样执行的,先创建一个String对象的str,将“hello”赋值给str,然后到第二行又创建了一个String对象str,
给他赋值,之前的str被GC回收掉,所有Java中对String对象进行的操作实际上是一个不断产生新的对象并且将旧对象回收的
过程,所以执行起来比较慢。而两个两个是变量,对变量直接进行操作,不需要进行创建和回收对象,所以比较快。
(2)线程安全
如果一个StringBuffer对象在字符串缓冲区被多个线程使用的时候,StringBuffer中的很多方法都是带有synchronied关键字,所以是
线程安全的,而StringBuilder没有这个关键字所以是线程非安全的。

总结:

String:适合少量的字符串操作
StringBuilder:适合单线程下在字符串缓冲区进行大量操作的情况
StringBuffer:适合多线程下在字符串缓冲区进行大量操作的情况
4,ArrayList和LinkedList有什么区别?
(1)ArrayList是实现了基于动态数组的数据结构,LinkList实现了基于链表的数据结构
(2)对于随机访问set和get,ArrayList的速度要比LinkList要快,因为LinkList要移动指针
(3)对于新增和删除操作,LinkList要比ArrayList快,因为ArrayList要移动数据
5,讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量(父类实例成员变量)
父类构造函数
子类非静态变量(子类实例成员变量)
子类构造函数
6,用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
最常用是Map的实现了有HashMap,ConcurrentHashMap,LinkedHashMap,TreeMap,HashTable
其中最频繁使用的事HashMap与ConcurrentHashMap,区别在于HashMap是非线程安全的,HashTable是线程安全的
并发下使用的是ConcurrentHashMap与HashTable,主要区别在于
(1)hash计算呢公式不同
(2)HashTable的存储方式是链表+数组,数组里放的是hash的第一个数据,链表中放的是hash冲突的数据,ConcurrentHashMap是数组+链表+红黑树
(3)默认容量都是16,负载因子是0.75
(4)HashTable是通过synchronized来保证线程安全,ConcurrentHashMap是通过CAS来保证线程安全
7,JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计?
JDK8放弃了分段锁运用了Node锁,减低锁的粒度,提高性能,并使用CAS操作来确保Node的一些操作的原子性,代替了锁。
但是ConcurrentHashMap的一些操作使用了synchronized锁而不是RenntrantLock,虽然谁jdk8d synchronized的性能进行了优化,但是我
还是觉得用RenntrantLock更能提供性能。
8,有没有有顺序的Map实现类,如果有,他们是怎么保证有序的?
LinkHashMap和TreeMap是有序的,HashMap 无序
LinkHashMap是按插入的顺序排序;
TreeMap是按key排序
9,抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么?

区别:
(1)接口是公开的,里面不能有私有方法或变量,而抽象类中可以有私有方法或变量。
(2)实现接口,一定要实现接口中所有的方法,而抽象类不是。
(3)接口可以实现多重继承,而一个类只能继承一个超类。
类只能继承一个类;
接口可以继承多个接口;
类可以实现多个接口。
10,继承和聚合的区别在哪?
多模块Maven项目中的聚合与继承其实是两个概念,其目的完全是不同的。前者是为了方便快速构建项目,后者是为了消除重复配置。
对于聚合模块来说,他知道有哪些被聚合的模块,但是那些被聚合的模块不知道这个聚合模块的存在
对于继承关系的父POM来说,他不知道有哪些子模块继承于它,但哪些子模块都必须知道自己的父POM是什么
如果非要说这个两个特性的共同点,那么可以看到,聚合POM与继承关系中的父POM的packaging都必须是pom,同时,聚合模块与继承关系的父模块除了POM之外都没有实际的内容。
11,IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型?
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

reactor模型:反应器模式(事件驱动模式):当一个主体发生改变时,所有的属体都得到通知,类似于观察者模式。
12,反射的原理,反射创建类实例的三种方式是什么。
原理:在运行过程中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象都能调用他的任意一个属性和方法,
这种动态获取信息以及动态调用对象方法的功能成为Java的反射机制。

(1),Class.forName("A");
(2),A.class;
(3),new A().getClass();
13,反射中,Class.forName和ClassLoader区别 。
(1),Class.forName除了将.class文件加载到JVM中外,还会对类进行解释,执行static代码块。
(2),ClassLoader只干一件事,将.class文件加载到jvm中,不会执行static中的代码,只在newInstance时才会执行static代码块。

14,描述动态代理的几种实现方式,分别说出相应的优缺点。(动态代理与cglib实现的区别)
动态代理主要有jdk代理和cglib代理。
jdk动态代理的前提是目标类必须实现一个接口,代理对象跟目标类实现一个接口,从而避免虚拟机的校验。
cglib动态代理是继承并且重写目标类,所以目标类和方法不能声名成final。

15,为什么CGlib方式可以对接口实现代理。
cglib是继承并重写目标类,所以目标类和方法不能声明为final,而接口是可以被继承的。
16,final的用途?
(1)被final修饰的类不可继承;
(2)被final修饰的方法不可重写;
(3)被final修饰的变量不可改变。
17,写出三种单例模式实现 。
(1)饿汉式:
public class EagerSingleton
{
    private static EagerSingleton instance = new EagerSingleton();
    
    private EagerSingleton()
    {
        
    }
    
    public static EagerSingleton getInstance()
    {
        return instance;
    }
}

(2)懒汉式:
public class LazySingleton
{
    private static LazySingleton instance = null;
    
    private LazySingleton()
    {
        
    }
    
    public static LazySingleton getInstance()
    {
        if (instance == null)
            instance = new LazySingleton();
        return instance;
    }
}
(3)双检锁:
public class DoubleCheckLockSingleton
{
    private static DoubleCheckLockSingleton instance = null;
    
    private DoubleCheckLockSingleton()
    {
        
    }
    
    public static DoubleCheckLockSingleton getInstance()
    {
        if (instance == null)
        {
            synchronized (DoubleCheckLockSingleton.class)
            {
                if (instance == null)
                    instance  = new DoubleCheckLockSingleton();
            }
        }
        return instance;
    }
}
18,如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。
父类的equals不一定满足子类的equals需求。比如所有的对象都继承Object,默认使用的是Object的equals方法,在比较两个对象的时候,是看他们是否指向同一个地址。

但是我们的需求是对象的某个属性相同,就相等了,而默认的equals方法满足不了当前的需求,所以我们要重写equals方法。

如果重写了equals 方法就必须重写hashcode方法,否则就会降低map等集合的索引速度。

19,请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
OO设计理念:封装、继承、多态
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。所以我们可以通过public、private、protected、default 来进行访问控制

20、深拷贝和浅拷贝区别。
浅拷贝只拷贝指针,深拷贝就是拷贝他的值,重新生成的对像。
``
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值