Java面试合集(一)

JavaSE

1.java三大版本:

javaSE,javaME,javaEE

2.JDK,JRE,JVM请添加图片描述

JDK(开发者工具)>JRE(运行时环境)>JVM(虚拟机)

数据类型

  • 基本类型

Byte,short,int,long,float,double,char,boolean

  • 引用类型

类,接口,数组

i++和++i的区别

a++: ++在后,先使用,后+1赋值
++a: ++在前,先+1赋值,后使用

类型转换

  • 自动转换 容量低–>高:

byte,shoat,char,int,long,float,double

  • 强制转换 变量名 高–低
int i = 128;
byte b = (byte)i; //强制转换 内存溢出 -128~127
double d =i; //自动转换

break和continue的区别

  • break可用在任何循环的主体部分,由于强行退出循环,也可以用在switch语句。 跳出switch语句。
  • continue用于循环语句中,终止某次循环过程,跳过剩余语句,之间进行下一次循环条件判断。

方法重载和方法覆盖(重写)的区别

重载是在一个类中,有相同的方法名,参数列表不同的方法。 方法重载的规则:

  • 方法名称必须相同
  • 参数列表必须不同(个数、参数类型、或排序不同)
  • 返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为方法的重载

覆盖(重写)

  • 重写:子类的方法必须与父类方法必须一致,方法体不同。
  • 重写是方法的重写,与属性无关
  • 重写方法只与非静态方法有关,与静态方法无关(静态方法不能被重写)

注意点
1.方法名、参数列表必须相同
2.修饰符范围可以扩大,不能缩小(public>protect>private)
3.抛出的异常 范围可以被缩小,不能扩大
4.被**static(属于类,不属于实例),final(常量方法),private(私有)**修饰的方法不能重写

Arrays类

数组的工具类java.util.Arrays
常用功能

  • 给数组赋值:fill方法。
  • 排序:sort方法,升序。
  • 比较数组:equals方法比较数组中元素值是否相等。
  • 查找数组元素:binarySearch对排序好的数组进行二分查找法操作。
  • 打印数组元素:Arrays.toString(数组名);

Object内部类

Object 类是java.lang包的一个类,是java所有类的父类(根类)。直接父类或间接类型

  • 获取 引用中存储的对象 的实际类型。getClass()方法
  • 获取 对象的哈希码值 int hashCode()方法
  • 返回 对象的字符串形式 String toString()
  • 在对象垃圾回收时,由JVM的垃圾回收器自动调用,进行垃圾回收相关工作。void finalize()
  • 用于 比较2个对象的内容 是否相同 boolean equals(Object obj)
==和.equals的区别

1> == 判断相等
A. 比较2个基本类型的数据,比较值是否相同;
B. 比较2个引用类型的数据,比较(对象的首)地址是否相同。
开发中的应用:比较2个引用 是否指向 同一个对象。
2> equals方法 判断内容相等
只能比较2个引用类型的数据, 比较 内容 是否相同。

集合

常用集合的分类

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

Collection集合
请添加图片描述

List和Set集合详解

list和set的区别
请添加图片描述

List:

  • 有序、有下标、元素允许重复
  • 实现类:ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素

Set:

  • 无序、无下标、元素不允许重复
  • 实现类: HashSet

Map集合

  • Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value
  • 键key – 唯一、无序无下标
  • 值value – 可以重复、无序无下标

请添加图片描述

实现类:HashMap非线程安全

list,set,map的区别

list 有序,可重复
set 无序,不可重
键值对,键唯一,值不唯一,键不能重复,值可以重复

面向对象(OOP)

三大特性

封装 程序设计追求“高内聚,低耦合” 属性私有Private

继承 (extends ) java中只有单继承

多态
注意点:
1.多态是方法的多态,没有属性的多态
2.父类和子类,有联系 类型转换异常: ClassCastException
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象!

super & this的区别

  • super()调用父类的构造方法,必须在构造方法的第一个
  • super必须只能出现在子类的方法或构造方法中
  • super()和this()不能同时调用构造方法,因为this也必须写在第一行

super与this的区别:super代表父类对象的引用,只能在继承条件下使用;this调用自身对象,没有继承也可以使用。

instanceof运算符

语法: 引用名 instanceof 类名9
功能: 判断前面引用指向的实际对象 是否是 后面的类(一种/个 is a ),是结果为true,否则结果是false。

三个修饰符

访问修饰符:private 默认 protected public
修饰符: abstract static final
注意:以上修饰符在一起使用时,没有先后顺序。

abstract 抽象的 可以修饰类和方法
static 静态的 可以修饰属性、成员方法和代码块
final 最终的 可以修饰 变量、成员方法和类

抽象类(abstract)
  • abstract修饰的类就是抽象类,修饰的方法就是抽象方法。
  • 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。
  • 抽象类不能使用new来创建对象,它是用来让子类继承的。
  • 抽象方法只有方法的声明,没有实现,让其子类实现。
  • 子类继承抽象类,必须实现抽象类的所有方法,否则该子类也要声明为抽象类。
静态(static)
  • 静态方法中 不允许 直接使用 本类的非静态成员(非静态属性+非静态方法)

  • 静态方法中 允许直接调用 本类的静态成员(静态属性+静态方法)

  • 静态方法中 不允许 使用this和super

  • 静态方法 可以被继承

最终的(final)
  • final修饰的变量 是最终变量,只允许赋1次值,不允许修改。
  • final修饰的方法 称最终方法,不允许被覆盖
  • final修饰的类 称最终类,不允许被继承。

接口(interface)

  • 普通类:只有具体实现
  • 抽象类:具体实现和规范(抽象方法)都有
  • 接口:只有规范,没有方法实现,专业的约束!约束与实现分离:面向接口编程~
  • 接口就是规范,定义的是一组规则,"你是什么…必须做什么…"的思想。
  • 接口的本质是约束,就像人间法律一样,制定好大家都遵守。

注意点:

  • 接口没有构造方法,不能被实例化
  • 实现类必须要重写接口中的方法
  • 实现类(implements) 可以实现多个接口
接口和抽象类的区别

相同点: 1. 编译后都可以生成.class文件
2. 都可以定义属性、成员方法
3. 都不能创建对象,但可以声明引用

不同点: 1. 接口中 所有属性 默认是 public static final 修饰的(常量);
2. 接口中 的方法 默认是 public abstract修饰的;
3. 接口中 不能定义构造方法;抽象类中可以

异常

异常类分为两大类,错误Error和异常Exception

请添加图片描述

throw和throws的区别

throw: 手动抛出异常,写在方法体中,语法 throw 异常对象;
throws: 消极的处理异常,写在方法声明的最后

  1. final、finally和finalize的区别

final 是修饰符,可以修饰 变量、方法、类
final修饰的变量,是最终变量,只能赋值1次 不允许修改
final修饰的方法,是最终方法,不允许被覆盖
final修饰的类,是最终类,不允许被继承
finally用在try…catch…finally中代表 不论try中的代码是否有异常,总是会被执行到的代码
finalize是Object类的一个方法,用于在垃圾回收器回收垃圾对象时 由JVM自动调用

IO流

IO流也称为输入输出流、就是用来读写数据的
I:input,是数据从硬盘文件读入到内存的过程,称之为输入,负责读
O:output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出、负责写

多线程

创建线程方式1:继承Thread类,重写run(),调用start()开启线程
创建线程方式2:实现Runnable接口,重写run(),执行线程需要丢给Runnable接口实现类(Thread类实现了Runnable),调用start开启线程
继承Thread和实现Runable对比
创建线程方式3:实现Callable接口,带返回值的

四、面试题【重点】

  • 创建线程的2种方式
    1> 继承Thread父类 2> 实现Runnable接口3>实现Callable接口
  • 什么是线程同步
    在多线程环境中,为了保证临界资源对象的 正确性,而 不破坏 原子操作。
  • 线程同步如何实现
    使用synchronized,有2种使用方法,同步代码块和同步方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拧螺丝的舒克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值