JAVA面试100题(基础)
每十题一更
一些常用到的JAVA基础知识整理(有错误欢迎指出)
- JRE、JDK、JVM的关系
- JDK: 包括了Java运行环境JRE、Java工具和Java基础类库。
- JRE: 是java的运行环境,其中包含了JVM、runtime class libraries(运行类库)和Java application launcher(启动器)
-
JVM: java虚拟机,java文件编译成.class文件,在虚拟机上执行。是java能够跨平台使用的基础。
图例:
-
数据类型
- 八大基本数据类型:
short(16)、int(32)、long(64)、boolean、byte(8)、char(2)、double(64)3.403E38、float(32)1.798E38
- 数字
- 整数
- byte 字节型
- short 短整型
- int 整型
- long 长整型
- 小数
- float 单精度浮点型
- double 双精度浮点型
- 文本 char 字符(绝对表示一个字符)
- 布尔类型 boolean (true false)
- 引用数据类型:
- 数组
- 类
- 接口
- 八大基本数据类型:
-
面向对象的四大特性和理解(面向对象的理解?设计类的方式?)
-
抽象:
(就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口).抽象并不打算了解全部问题,而是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一个数据抽象,而是过程抽象.
数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)
过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法) -
封装:
封装就是把过程和数据包围起来,对数据的访问只能通过特定的界面.如私有变量,用set,get方法获取 -
继承:
继承是指一个子类从一个现有的父类中派生出来,并具有原始类的属性和方法,子类可以override父类的方法,也可以添加新的属性和方法。Java中父类和子类是一对多的关系。 -
多态:
总的来说,方法的重写,重载与动态链接构成多态性.java引入多态的概念原因之一就是弥补类的单继承带来的功能不足.
动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接.
- 重载和重写
- 重写(override):指子类重写父类的方法,或重写接口的方法。
- 重载:在一个类中,相同名但参数的类型不同,或个数不同的方法。
访问权限的区别(private、protected、public、default)
- final,finally,finalize的区别和作用
-
final:
- 定义变量,包括静态的和非静态的。
- 定义方法的参数。
- 定义方法。
- 定义类。
变量被final修饰表示只能被赋值即初始化一次,相当于一个常量。
方法的参数被final修饰,表示参数在方法里不能被重新赋值修改
方法被final修饰,说明不可以被子类重写。
类被final修饰表示该类不能被继承。 -
finally:异常处理try-catch中提供finally块,无论是否出现异常,代码块中的代码都会被实现。
-
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
-
运行时异常与一般异常有何异同
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 -
接口是否可以使用继承
一个接口可以继承多个接口
不允许类多重继承的主要原因是,如果A同时继承B和C,而b和c同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口 -
简单说明什么是递归?什么情况会使用?并使用java 实现一个简单的递归程序
- 递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中
直接或间接调用自身而产生的重入现象。 - 递归算法一般用于解决三类问题:
- 数据的定义是按递归定义的。(Fibonacci(斐波那契)函数)
- 问题解法按递归算法实现。(回溯)
- 数据的结构形式是按递归定义的。(树的遍历,图的搜索)
- 这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序
并输出,例如:你给出的参数是"abc" 则程序会输出:abc acb bac bca cab cba- 算法的出口在于:low=high也就是现在给出的排列元素只有一个时。
- 算法的逼近过程:先确定排列的第一位元素,也就是循环中i所代表的元素,然
后low+1开始减少排列元素,如此下去,直到low=high
-
接口和抽象类的区别?(说完后可以再补充1.8后的新特性)
接口和抽象类的中的抽象方法,实现类或子类一定要去实现这个抽象方法。
抽象类的可以有具体实现方法和成员变量,而接口都是抽象方法(1.8中引入default方法)
一个类只能继承一个抽象类,而可以实现多个接口。
抽象类能够提高代码复用率,一般我们将多个类共有的属性或方法放在一个父类中(如Baseservice)
而接口表示的是功能的扩展,如DAO接口 -
String、StringBuilder、StringBuffer的区别
- 可变与不可变
String
通过查看String的源码我们知道String是通过字符数组来保存一个对象的,且在这个字符数组前面加了final修饰符,说明String对象是不可变的。这就导致每次String的操作就会生成新的对象,导致效率低下且浪费空间。 - 是否线程安全
String对象不可变,可理解为它是线程安全的
StringBuffer 是线程安全的,而 StringBuider 是非线程安全的。从源码可以看出, StringBuffer 在方法或调用方法前面加上了Synchronized 同步锁,所以是线程安全的。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量(通常是16个字节),就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为StringBuffer类补充了一个单个线程使用的等价类,即StringBuilder。与该类相比,通常应该优先使用StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
StringBuffer 和 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而insert 方法则在指定的点添加字符。 - 共同点
StringBuffer 和 StingBuilder 都继承自 AbstractStringBuilder(抽象类)
抽象类和接口的区别是:抽象类可以定义一些子类公共的方法,子类只需要增加新的功能,而不需要重复写已经存在的功能。接口只是定义一些常量和对方法的声明。
String转其他基本数据的方式。