java面试基础

1. 面向对象的三大特征:封装、继承、多态。

2. java基本数据类型:byte、short、int、long、float、double、boolean、char。

                        字节数:1 2 4 8 4 8 1 2

3. jdk:java核心,包含java运行环境jre、java工具、java基本类库。

    jre:环境集合,包含虚拟机、核心类库。

    jvm:实现跨平台运行的核心。

4. 重载和重写

重载:同一类中,名字相同,参数类型、个数、顺序不同(单个不同就行)

重写:子类继承父类,名字、参数 相同,返回值和抛出异常类小于等于父类,访问修饰符大于父类。

5. == 和 equals 区别

在java中,对于基本数据类型 == 比较的是值,对于引用数据类型 == 比较的是地址

qeuals 在默认情况比较的是地址,但是String、Integer、Date等重写了equals方法,比较的是值。

字符串属于引用数据类型。

6. String、StringBuffer、StringBuilder的区别

String使用final关键字修饰属于字符串常量,是线程安全的。

StringBuffer、StringBuilder继承AbstractStringBuilder有很多方法 apend、insert、indexof等

StringBuffer对方法上锁,所以是线程安全的,StringBuilder是线程不安全的。

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

        抽象类 使用 extends继承,可以有构造函数、main方法,只能继承一个抽象类,接口implements实现,可以实现多个。

8. string 常用的方法:

       indexOf、charAt、replace、trim、split、length、getBytes、equals...

9. 单例模式:

        一个类在多线程的环境下,只被创建一次,有 饿汉式(线程安全,直接初始化)、懒汉式(线程不安全,延迟初始化)、双检锁(线程安全、延迟初始化)

10. 反射

        在程序运行时,可以动态获取到:类的所有信息、调用对象的任意方法。

获取class对象的三种方法:getClass() 、 .class、 forName("类的全路径")

11. jdk1.8 新特性

        lambda表达式允许把函数作为一个方法的参数

        允许直接引用已有java类或者对象的方法或构造方法

        有且有一个类的抽象方法叫做函数式接口

        接口允许定义默认方法和静态方法

        Stream流

        日期、时间类的改进

        optional类 : null容器对象

        内置 base64 解码和编码

12. java异常

        throwable 为顶级父类,下面有 Error:jvm无法预期的错误和Exception:可捕获的异常

Exception又分为:RuntimeException:NullPointerException、IndexOutOfBoundsException等不捕获或者抛出可以通过编译阶段 和非运行时异常 IOException、SQLException 不处理无法通过编译。

13. BIO、NIO、AIO

        BIO为同步阻塞式IO,传统IO,简单,并发低。NIO为同步非阻塞IO,通过Channel实现多路复用。AIO为异步非阻塞IO,基于事件和回调机制。


14. Theadlocal的原理

        Theadlocal为共享变量创建一个副本,每个线程访问自己内部的变量,保证了线程的安全,实际上TheadLocal无法存储值,他借助静态内部类TheadLocalMap进行存储,theadlocal本身为key,共享变量为value。是弱引用,在gc时可能被回收,造成内存泄露,所以要调用remove方法。

15. 同步锁、死锁、乐观锁、悲观锁

同步锁:同一时间只允许一个线程访问共享变量。 synchronized 可以获取一个对象的同步锁

死锁:多个线程阻塞,需要某个阻塞内释放的资源

乐观锁:很乐观,认为别人不会改自己要修改的数据,但是在自己修改后会使用版本号机制和cas算法进行判断,如果被修改则返回异常信息。

悲观锁:认为别人总会修改,所以拿数据会上一把锁不让别人修改。

16. synchronized 底层实现原理

       保证同一时刻内只有一个方法可以进入临界区。

        java中每个对象都可以作为锁

17. synchronized volatile 的区别

volatile使用在变量级别,只能保证可见性不能保证原子性,不会造成线程阻塞、不会被编译器优化。

synchronized 使用在 变量、方法、类,保证可见性、原子性,会造成阻塞,可能被优化。

18. synchronized和lock区别

synchronized 是java 的关键字,无法判断获取锁的状态,会自动释放锁,可重入,不可中断、非公平

lock是java类,可以判断是否获取到锁,需要unlock手动释放锁,可重入、可判断、公平锁。

19. 二分查找: 前提有序 , 中间开始

20. 排序:

冒泡: 比较相邻的两个元素,大的放后面,重复运行(while、或者 双重for)

选择排序:先把最小的放前面,再把最小的放第二.....

插入排序:比前面大,不动,比前面小,交换位置,继续比较,直到不动。

快速排序:选最右基准点,大的放右边,小的放左边,排完将基准点放中间,然后两边重新开始,直到无法进行(l = h)。

21. hashMap    1.7为数组+链表   1.8:数组+链表(转化红黑树)

链表转化红黑树的条件为  链表长度>8,数组容量≥64,因为链表过长会影响性能。

一开始不转化的原因是:短链表性能并不低且占内存少,如果hash值足够均匀,链表很难>8,数化是为了防止dos攻击。

退化:扩容拆分,树元素<=6,和 remove前,跟 的 左、右、 左左 节点不在。

put: 1.7 头插,扩容需要大于阈值且根节点没有空位, 1.8 尾插。

索引计算:二次哈希。

多线程操作问题: 1.7 扩容死连、数据错乱, 1.8数据错乱。

key可以为null,但是必须实现hashcode和equals方法

22. 集合长度可变,存储对象的类型可以不一致。数组长度固定,只能存储一种类型。

23. list和set是存储单列数据的集合,map是存储双列数据的集合

list有序,值可以重复,set 无序,不可重复,map无序,键不可以重复,值可以。

24. hashmap 和 hashtable 和 concurrentHashMap的区别

hashMap 非线程安全,key可以为null  , 另外两个线程安全,不可以为null

hashtable Synchronized 保证安全,ConcurrentHashMap 1.8 之前 segment分段锁,1.8之后 cas+cynchronized

.....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值