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方法来实例对象。