1.面向对象和面向过程:

面向对象:因为需要维护对象,所以需要消耗更多的内存。并且因为有对象的存在,所以更易维护,更易扩展和更易复用。

面向过程:因为不需要实例化对象,所以性能高。但不易维护、扩展和复用。

2.java语言的特点:

面向对象的三大特性:继承、封装和多态。

跨平台、支持多线程和网络编程。

3.jdk和jre的区别:

jre翻译过来就是java的运行环境,主要包括java虚拟机、java类库和java命令等。能编译程序但无法创建程序。

jdk包含了jre,并且还多了java编译器javac,和javadoc工具,可以编译和创建程序。

4.java和c++的区别:

相同点:都是面向对象,支持封装、多态和继承。

不同点:java是单继承,自动内存管理。c++是多继承,需要手动释放资源。

5.字符常量和字符串常量区别:

字符常量用char表示,使用单引号,可以看作一个整型值参与运算,占2个字符。

字符串常量:使用双引号,占若干个字节。

6. 重写和重载:

重写:子类继承父类的相同方法,方法名和传参输出这些需要一致,进行方法体内部的重写。父类方法被static和final,private修饰时,无法被重写。

重载:同一个类中方法名相同,但传参个数或者传参类型不一致。

7.三大特征:

多态:父类引用指向子类对象,编译期间不确定,运行期间才能确定。

继承:子类继承父类,可以使用父类的方法,以便于进行复用。

封装:把类的属性进行私有化,并对外提供属性的方法。

8.String、Stringbuilder和Stringbuffer

String:String类使用final修饰,所以String创建的对象不可改变,每当进行字符串拼接时,会重新创建对象,消耗内存。

Stringbuilder:线程不安全,但效率高。

Stringbuffer:线程安全,但效率低。

9. 自动拆箱和自动装箱:

自动装箱:基本数据类型转为引用类型。

自动拆箱:引用类型转为基本数据类型。

10.为什么java类中需要定义无参构造器:

当使用super()方法来调用父类时,会默认调用父类的无参构造器,当定义了有参构造器时,没有定义无参构造器,调用super()方法会报错。

11.接口和抽象类:

接口:不能拥有实例方法,只能定义静态常量,一个类可以有多个接口,interface和implement

抽象类:抽象类中可以有非抽象方法,可以有普通变量,只能单继承。abstract和extents

12.成员变量和局部变量:

成员变量:定义在类中。

局部变量:定义在方法体中。

13.==和equals:

==是比较对象的地址。

equals如果对象没有重写equlas方法,则跟==相同,比较对象的地址,当重写了equals方法,则比较equals方法。

14.为什么重写了equals方法,需要重写hashcode方法:

因为使用hashmap等方法时,需要使用对象的hashcode值,有可能你需要放入两个内容相同的对象,因为hashcode不一样,导致识别成两个对象。

15.程序、进程和线程:

程序:可以运行的文件。

进程:程序的一次运行过程。

线程:进程的单位,一个进程可能产生多个线程。

16.线程的运行状态:

对象new出来新建状态----调用start方法进入可运行状态-----cup调用进入运行状态------因为某些原因进入阻塞状态-----最后程序运行完或异常等情况进入死亡状态

17.final关键字:

final关键字可以修饰类、方法和变量。

修饰类:无法被继承。

修饰方法:无法重写。

修饰变量:必须初始化且之后无法改变。

18.异常:

所有异常的父类:throwable。两个重要子类:error和exception

error:程序无法处理的异常,例如虚拟机内存溢出等。

exception:程序可以处理的异常。try catch finally

19.finally不会执行的情况:

在进入到try catch之前退出方法。

执行system.exit().

关闭cpu

20.io流:

按流向分为输入流和输出流。

按操作单元:字节流和字符流。

21.深拷贝和浅拷贝:

浅拷贝:对值进行拷贝,对对象的引用进行拷贝。

深拷贝:对值进行拷贝,对象先创建,再进行拷贝。

22.数组转集合、集合转数组:

Arrays.asList();

Collection.toarry();

23.static关键字:

static修饰方法和成员变量时,属于类,可以被类直接调用,而不需要创建对象。

static修饰代码块时,再执行构造方法前时会先执行代码块内容,且只初始化一次。

24.this关键字:

表示当前对象。

25.super关键字:

用于子类访问父类的方法和变量。

26.反射:

再运行阶段,可以动态的获取类信息,并动态的调用对象。对任何一个类,可以知道该类的所有信息,对任何对象,可以调用所有属性和方法。

优点:运行期间动态加载类,提高灵活性。

缺点:性能比直接创建对象低,并且动态创建对象,降低了程序的安全行。

27.反射应用场景:

Spring的bean创建和aop的动态代理。

jdbc的连接数据库驱动

28.集合:

集合分为collection和map。

collection分为:list和set。list有序且可重复,set无序且不可重复。

map主要包括键值对,key,value。

29.arrylist和linkedlist:

arrylist底层使用数组,数组内存中是一段连续内存,所以查询快,但操作慢。因为底层改变数组又要重写创建数组。

linkedlist底层使用链表,所以操作快,但查询慢。因为链表可以直接替换值所以操作快,但查询的话,会重头到脚的查找,所以查询慢。

30.线程创建方式:

继承thread类。

实现runnable接口。重写run方法。

实现callable接口,重写call方法。

使用线程池。

31.java跨平台原理:

因为jvm,不同的操作系统对应不同的jvm,将java程序编译成.class文件放到对应的jvm中,由jvm最后解析成对应操作系统能识别的底层语言。

32.多线程停止:

sleep:等待一段时间,继续运行。

wait:等待一段时间,但需要唤醒操作。

yield:让出当前线程,让同等级的线程先运行。

join:加入其他线程,等其他线程运行完后,自己再运行。

33.死锁:

多个线程因为竞争资源,又不释放自己的资源,导致的一种相互等待的状态。

解决方法:最好一个线程只锁定一个对象,且需要锁定其他对象时,先释放自己已经锁定的对象。

34.socket:

socket套接字,封装了tcp和ip的接口,网络通讯就是socket通讯,主要进行io数据传输操作。

35.接口优点:

解决了java单继承的局限性。只定义方法不实现,保证了安全行,且易扩展,起到了规范的作用。

36.线程优先级遵循原则:

子线程继承父线程的优先级,线程级别越高,越容易执行。

37.jar包和war包:

jar包:可以简单理解为java打的包,包含了class文件。

war包:可以简单理解为web项目的包,不仅包括class文件,还有一堆配置文件和html等。

38.java可变参数:

类型一样,但参数个数一样。

39.类加载方式:

new对象。

反射class.forname方法。

类加载器:loadclass来加载类,再调用newinstance方法来实例对象。

最后修改:2022 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏