Java面试------基础篇

1.JDK,JRE,JVM的区别

 JDK::jdk是java的核心,是java开发工具包,包括JRE和JVM

JRE:是运行Java所必须的环境的集合,包括JVM和Java的一些核心类库

JVM:是Java跨平台运行的的核心部分,能够运行以Java语言写作的软件程序

2.重载和重写的区别:

重载:要求方法名相同,参数列表不同,个数不同,顺序不同,方法的返回值和修饰符可以不同,发生在编译时。

重写:发生在父子类之中,方法名参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于父类,访问修饰符大于等于父类,如果父类中有方法被private修饰,则子类不可以重写该方法。

3.Java中==和equals的区别:

==的作用:

引用类型:比较的是地址值。

基本类型:比较的是内容。

equals的作用:

默认情况下比较的是地址值

注意:重写equals比较的内容

4.String、StringBuffer、StringBuilder 三者之间的区别

Sring:字符串常量,如果要操作少量的数据用 String;

SringBuffer:字符串变量(线程安全),多线程操作字符串缓冲区下操作大量数据用 StringBuffer;

SringBuilder:字符串变量(非线程安全),单线程操作字符串缓冲区下操作大量数据用 StringBuilder。

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

1>实现:接口需要实现implements接口,抽象类要继承extends

2>构造方法:抽象类可以有构造方法,接口不能

3>main方法:抽象类有main方法,接口没有

4>实现数量:类可以实现很多接口,但只能继承一个抽象类

5>访问修饰符:接口中默认使用public修饰,抽象类中可以使用任意修饰符

6.string 常用的方法有哪些?

indexOf():返回指定字符的索引

charAt():返回指定索引处的字符

replace():字符串替换

trim():取出字符串两端空白

split():分割字符串

substring():截取字符串

equals():字符串比较

7.什么是单例模式,有几种?

单例模式:某个类的实例在多线程的环境先只会被创建一次出来。

饿汉单例模式:线程安全,一开始就出初始化

 

懒汉单例模式:非线程安全,延迟初始化

 

双检索单例模式:线程安全,延迟初始化

8.反射(了解):

在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制。
获取Class对象的三个方法:
1>调用某个对象的getClass()方法:
Person person = new Person();
Class clazz=p.getClass();
2>调用某个类的 class 属性来获取该类对应的 Class 对象
Class clazz=Person.class;
3>使用 Class 类中的 forName()静态方法(最安全/性能最好)
Class clazz=Class.forName("类的全路径"); (最常用)

9.JDK1.8的新特性:

1>Lambda表达式:
Lambda 允许把函数作为一个方法的参数。
2>方法引用:
方法引用允许直接引用已有 Java 类或对象的方法或构造方法。
3>函数式接口:
有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为
Lambda 表达式。通常函数式接口上会添加@FunctionalInterface 注解
4>接口允许定义默认方法和静态方法:
从 JDK8 开始,允许接口中存在一个或多个默认非抽象方法和静态方法。
5>Stream API:
新添加的 Stream API(java.util.stream)把真正的函数式编程风格引入到 Java
中。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。
6>时间/日期类
之前的 JDK 自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方
工具包,比如 commons-lang包等。不过 JDK8 出现之后这个改观了很多,比如日期时间的创建、比较、调整、格式化、时间间隔等。
这些类都在 java.time 包下,LocalDate/LocalTime/LocalDateTime。
7>optional类
Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent()方法会返
回 true,调用 get()方法会返回该对象。
8>Java8Base64实现:
内置的Base64编码器和解码器

10.Java的异常

 

Throwable 是所有 Java 程序中错误处理的父类,有两种资类:Error 和Exception
Error错误属于JVM层面的严重错误,导致JVM无法正常运行,Exception可恢复的例外,这个可捕捉到的
常见的Runtime(运行时)异常有以下几种:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常

11.BIO,NIO和AIO的区别

BIO:Block IO同步阻塞式IO,特点,模式简单,使用方便,并发处理能力低
NIO:New IO同步非阻塞IO,特点:客户端和服务器通过Channel(管道)通讯,实现了多路复用
AIO:NIO2,实现了异步非阻塞式IO,异步IO的操作基于时间和回调机制

12.ThreadLocal的底层实现原理

ThreadLocal为共享变量创建一个副本,每个线程都可以访问自己的内部变量副本,通过ThreadLocal保证线程的安全性。
其实在ThreadLocal类中有一个静态内部类ThreadLocalMap,用键值对的形式存储每一个变量副本,
ThreadLocalMap中的Key就是当前ThreadLocal对象,Value就是对应线程变量的副本;
ThreadLocal本身并不存储值,它只是作为key存储在ThreadLocalMap中,但是它作为key用的是弱引用,在GC的时候会被回收,所以在ThreadLocalMap中就会存在一些key为null的键值对(Entry),这些Entry没法访问,本身也不会被清除, 如果没有手动删除对应 key 就会导致这块内存即不会回收也无法访问,也 就是内存泄漏;
使用完ThreadLocal后,记得手动调用remove()方法清除. 在不使用线程池的前提下, 即使不调用 remove 方法,线程的"变量副本"也会被 gc 回收,即不会造成内存泄漏的情况。
 

13.同步锁、死锁、乐观锁和悲观锁

同步锁:当多个线程同时访问一个数据时,很容易出现问题,为了避免这一问题的发生,我们要保证线程同步互斥,就是指在并发执行的多个线程,在同一时间内只允许一个线程访问共享数据,Java中可以使用synchronize关键字来获取一个对象的同步锁。
死锁:就是多个线程通时被阻塞,都在等待资源被释放。
乐观锁:顾名思义,就是很乐观,总是认为别人不会修改数据,所以不会上锁,但是在跟更新的时候还是会判断一下数据有没有被修改,可以使用版本号CAS算法来实现,像数据库提供的类似于write_conditio机制,其实都是提供的乐观锁
悲观锁:总是很悲观,总是以人为别人会修改数据,所以在每次拿到数据的时候都会上锁,这样别人想拿到这个数据就会阻塞,知道拿到锁,传统的关系型数据库就用到了很多这种锁机制,比如,行锁,表锁,读锁,写锁等,都是在操作之前就会上锁,Java中synchronize和ReetrantLock等独占锁就是悲观锁的体现

14.synchronize的底层实现原理

synchronize可以保证方法或者代码块在运行时,同一时间只有一个方法可以进入临界区,同时还可以保证共享变量的内存可见性;
Java中每一个对象都可以作为锁,这是synchronize实现同步的基础:
普通同步方法:锁的是当前实例对象
静态同步方法:锁的是当前类的Class对象
同步方法块:锁的括号里的对象

15.synchronize和volatile的区别

volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile 仅能使用在变量级别,synchronize可以用在方法,变量,代码块上
volatile 仅能实现变量修改的可见性,不能保证原子性,synchronize可以实现变量修改的可见性和原子性。
volatile 不会造成线程阻塞,synchronize可能会造成线程阻塞
volatile 标记的变量不会被编译器优化,synchronize标记的变量可以被编译器优化        

16.synchronize和lock的区别

synchronize是内置关键字,lock是一个类
synchronize无法判断获取锁的状态,lock可以判断是否获取到锁
synchronize会自动释放锁,lock需要手动finally释放锁
synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入、可判断、可公平
synchronize适合少量代码的同步问题,lock适合大量代码的同步问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值