面经之JavaSE

Java是一种面向对象的编程语言,具有简单易学、跨平台、支持网络编程和多线程等特点。JVM使得Java程序可以一次编译到处运行。Java的集合框架包括ArrayList和LinkedList等,线程安全通过synchronized关键字来保证。反射机制允许在运行时动态获取类的信息和调用方法。
摘要由CSDN通过智能技术生成

Java概念

什么是编程?

编程就是让计算机为解决某个问题而使用某种程序设计语言来编写程序代码,从而得到结果的过程。

什么是Java?

Java是一门面向对象编程的强类型语言,不仅吸收了C++语言的各种优点,还摒弃了C++中多继承、指针等概念,因此Java语言具有功能强大和简单易用两大特征。

Java语言有哪些特点?

1.简单易学:Java语言吸收了C++语言的各种优点,还摒弃了C++的多继承和指针等缺点,所以Java语言更简单易学。

2.面向对象:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特征,可以降低系统的耦合性,使系统更加灵活,更加易于维护。

3.跨平台性:因为有JVM(Java虚拟机)的存在,使得Java程序可以一次编译到处运行的特征。

4.支持网络编程:Java语言的诞生本身就是简化网络编程设计的。

5.支持多线程:多线程机制是应用程序在同一时间执行多项任务。

6.健壮性:面向对象的思想,易扩展。

7.安全性高(相对安全):字节码验证、自动内存管理、没有指针、Java编译器自动检查,检测和修复代码中的错误、Java进行自动数据类型检查、JVM虚拟机。

JDK、JRE和JVM之间什么关系?

1.JDK:是整个Java的核心、是Java的开发环境,包括JRE和Java工具(Javac、Java、jdb)和Java基础类。

2.JRE:JRE是Java的运行环境,包含了JVM和Java和核心类库。

3.JVM:Java运行时环境,JVM将字节码文件解释成各系统平台的指令。

为什么Java一处编译到处运行呢?

Java程序首先会在JDK中通过Javac被编译成字节码文件,在通过JVM对不同系统进行适配,最终解释成二进制文件,从而实现一次编译到处运行。

为什么说Java语言“编译与解释并存”?

Java语言具有编译语言的特征,也具有解释语言的特征。因为Java程序要经过先编译,后解释两个步骤,由Java编写的程序需要先经过编译,生成字节码文件,这种字节码文件必须由Java解释器来解释执行。

面向对象

什么是面向对象?

把构成问题的事务分解成各个对象,而建立对象的目的不是为了完成一个个步骤,而是描述某个事物在解决整个问题过程中所发生的行为。

面型对象的三大特征?

1.封装性:把一个对象的属性私有化,同时提供一些可以被外界访问的属性和方法。

2.继承性:继承是使用已存在的类定义作为基础建立新类的技术,新类的定义可以增加新的功能或者新的数据,也可以使用父类的功能,但不能选择性的继承父类。

3.多态性:多态,顾名思义,表示一个对象具有多种的状态,具体的表现为父类的引用指向子类的实例。

实现多态的三个必要条件是什么?

1.继承:在多态中必须存在有继承关系的子类和父类。

2.重写:子类对父类中的某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

3.向上转型:在多态中需要将子类的引用赋给父类的对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

Java语法

什么是自动装箱和自动拆箱?

1.自动装箱就是基本数据类型转换为包装类,是将基本数据类型直接赋值给对应的包装类。

2.自动拆箱就是将包装类转换成基本数据类型。

包装类的作用?

1.作为和基本数据类型对应的类,类型存在,方便涉及到对象的操作,符合面向对象的操作。

2.包含每种数据类型的相关属性,如:最大值、最小值等,以及相关的操作方法。

重写和重载有什么区别?

1.重写和重载只是字面上相似,本质上并没有什么关系。

2.重写:在继承的前提下,子类保证了方法名称和形参列表返回值类型相同的情况下重写了父类方法的方法体。

3.重载:在方法名想同时,形参列表不同,简单来说就是同名不同参。

抽象类和接口的区别?

1.抽象类:抽象类使用关键字abstract声明,子类使用extends关键字来单继承且实现其所有的抽象方法,否则子类也是抽象类。在抽象类中可以有构造方法、普通变量、普通方法和抽象方法。

2.接口:接口使用interface关键字声明,子类使用implement关键字来多实现。JDK1.8之前接口中只有抽象方法,在JDK1.8之后接口中可以有静态方法(必须有方法体)和普通方法(没有方法体,需要被实现)。

Java关键字

static关键字有什么用?

static可以修饰变量、方法、代码块、内部类,static修饰后是属于类的,所以只能加载一次,他们加载的时机是随着类的加载而加载进入方法区,内存中只分配一块区域供所有的类使用,可以节省空间。

1.static修饰的变量和类一起加载,静态变量中只有一份被所有对象共享。

2.static修饰方法可以直接通过类名来调用,静态方法中不能有this和super关键字。当然将类的构造器通过static修饰可以实现单例模式,创建的对象只有一个。

3.static修饰代码块在JVM加载进方法区,且执行一次,常用于初始化。

4.static修饰内部类不依赖外部实例化而实例化,只能调用静态变量或静态方法。

==和equals的区别?

1.==在用于基本类型比较时,比较的值,对于引用类型来说比较的地址。

2.equals()只能用于引用数据类型的内容是否相等,没有重写equals()相当于==,重写equals比较的对象内容。

instanceof有什么作用?

判断一个应用类型变量所指向的对象是否是用一个类的实例。

this和super的区别?

1.this它代表当前对象名,常用于区分同名的形参和成员变量。

2.super它指向当前对象的父类,用来访问父类的成员和方法。

throw和throws的区别?

1.throw:用在方法体内,后面跟的是异常类对象名,只能抛出一个对象名,表示抛出异常,又该方法体内的语句来处理,throw是抛出了异常,执行throw一定出现了某种异常。

2.throws:跟在方法声明后面,后面跟的是异常类名,可以跟多个异常类名,用逗号隔开,表示抛出异常,由该方法的调用者来处理,throws表示又出现这些异常的可能性,并不一定出现这些异常。

final、finally和finalize的区别?

final:是一个修饰符,表示最终的。

1.final修饰类的时候不能被继承。

2.final修饰变量的时候不能被改变。

3.final修饰方法的时候不能被重写。

4.final修饰基本数据类型为常量,该值无法被修改。

5.final修饰引用数据类型,对象本身可以修改,但指向该对象的地址引用不能修改。

finally:用于处理异常的只能与try/catch语句结合使用,finally中的语句一定会执行,且在return、continue、break关键字之前执行,通常用于关闭流、释放资源等操作。

finalize:是一个方法,属于Object类GC运行机制(垃圾回收)的一部分,finalize()方法是在GC清理它所属的对象时被调用。

break、continue、return有什么区别?

1.break用于结束当前循环。

2.continue:用于跳出本次循环执行下一循环。

3.return:结束循环或方法并换回一个结果。

数据类型

八大基本数据类型有哪些?

byte、short、int、long、float、double、char和boolean

String、StringBuilder和StringBuffer的区别?

1.String:是字符串常量,底层是不可变的char[]数组,每次赋值都会创建一个新的对象,所以它的效率是最低的,同时因为是final修饰的线程也是安全的。

2.StringBulider:底层是可变的char[]数组,在扩容时不会产生新的StringBulider对象,但在使用toString()方法时会copy一份新的对象,线程是不安全的,但效率最高。

3.StringBuffer:底层是可变的char[]数组,每次添加都会调用append()方法在后面追加,性能比String高,因为有synchronized同步锁所以线程是安全的。

如何将字符串反转?

将对象封装到StringBulider中,调用reverse方法反转。

集合

Collection和Collections有什么区别?

1.Conllection是一个集合的接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如:list,set。

2.Conllections是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:conllection.sort(list)。

HashMap和Hashtable有什么区别?

1.存储:hashmap运行key和value为null,而hashtable不允许。

2.线程安全:hashmap线程不安全,hashtable线程安全。

3.推荐使用:在hashtable的类注释可以看到,hashtable是保留类不建议使用,推荐在单线程环境下使用hashmap替代。

如何决定使用HashMap还是HreeMap?

对于在map中插入、删除、定位一个元素时,hashmap是最好的选择,因为相对而言hashmap的插入更快,但如果对一个key集合进行有序的遍历,那treemap是最好的选择。

说一下HashMap的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

ArrayList 和 LinkedList 的区别是什么?

1.数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

2.随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。

3.增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

Array 和 ArrayList 有何区别?

1.Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。

2.Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。

3.Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

迭代器 Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

Iterator 和 ListIterator 有什么区别?

1.Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
2.ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
3.Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。

多线程

什么是线程安全?

多个线程同时操作一个数据时容易造成线程安全。

线程与进程的区别?

线程与进程相似,但线程是比一个进程更小的单位,一个进程在执行的过程中可以产生多个线程,与进程不同的是同类的多个线程共享一块内存空间和一组系统资源。

多线程有几种实现方式?

1.继承Thread类:优点:编码简单。缺点:无返回值,因为继承了Thread类无法继承其他的类,不利于扩展。

2.实现Runnable接口:优点:通过实现创建多线程,可以继承其他类,扩展性好。缺点:线程执行的结果无法直接返回。

3.实现Callable接口:优点:同样通过实现接口创建多线程,扩展性好。缺点:编码相较于前者比较复杂。

4.多线程也可以通过线程池创建。

开启线程为什么要调用start()方法而不是直接调用run()方法

1.new 一个Thread,线程进入了新建状态,调用start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到 时间片 后就可以开始运行了。start() 会执行线程的相应准备工作,然后自动执行run() 方法的内容,这是真正的多线程工作。
2.而直接执行run() 方法,会把run 方法当成一个main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

线程有几种状态?

1.NEW新建状态:线程刚被创建,但是并未启动。
2.RUNNABLE就绪状态:线程已经调用了start()等待CPU调度
3.BLOCKED锁阻塞状态:线程在执行的时候未竞争到锁对象,则该线程进入Blocked状态;。4.TIMED_WAITING计时等待状态:超时参数的常用方法有Thread.sleep . object.wait。
5.WAITING无限等待状态:一个线程进入Waiting状态,另一个线程调用notify或者notifyAll方法才能够唤醒
6.TERMINATED终止死亡状态:因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

Synchronized 用过吗,其原理是什么?

synchronized是可重入锁,每部锁对象会有一个计数器记录线程获取几次锁,在执行完同步代码块时,计数器的数量会-1,直到计数器的数量为0,就释放这个锁。

反射

什么是反射?反射的概念?

反射机制实在运行时,对于任意一个类都能够得到和调用他的所有属性和方法,这这种动态的获取信息以及动态的调用对象的方法的功能称为Java语言的反射机制。

反射有几种实现方式?

1.Class.forName("类的路径")。
2.类名.class。
3.对象名.getclass()。

反射的优缺点?

优点:
1.能够运行时动态的获取类的实例,提高灵活性。
2.与动态编译结合。

缺点:
1.使用反射性能较低,需要解析字节码。
2.相对不安全,破坏了封装性。

如何提高反射的效率

1、通过setAccessible(true)关闭JDK的安全检查来提升反射速度。
2、多次创建一个类的实例时,有缓存会快很多 。
3、ReflectASM工具类,通过字节码生成的方式加快反射速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个Cook

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

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

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

打赏作者

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

抵扣说明:

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

余额充值