当前位置:

《java面试宝典》CoreJava 部分

机器助手 |  2025-07-13
 33人浏览

CoreJava 部分


1.什么是面向对象?面向对象有哪些特征?
以事物为驱动的编程思想。
我理解的面向对象是必须有一个具体的事物,
这个事物可以是一个具体的人,一个具体的物,
这个事物有自己的特征(属性),有自己的行为(方法),
那么对这个事物特征的描述,和对行为的操作称为面向对象的。
继承:
实体和实体之间的一种关系。
例如:父子类之间 对于父类而言,他的一些东西(属性和方法)是可以共享的,
对于子类而言,它可以共享到父类的一些东西(属性和方法),那么
我们把父类与子类的这种关系称为继承。
封装:
实体的有些东西是自身特有的,不需要共享。
例如:
小明的爸爸有自己不想公开的东西,那么对于小明的爸爸而言,
这些东西应该设置为私有的 。这就体现出 java 的封装。
多态:行为和引用。
一个类中(行为)。
例如: 打 , 打人,打车,打麻将 ,也叫方法重载
父子类之间(引用)
儿子可以引用父亲的行为,也叫方法的重写。
2.说一下什么是 javaBean 规范:
1.要有包--类必须写在包中
2.属性都是私有--private
3.要有无参构造方法
4.写有效的 setXXX getXXX 方法
5.实现序列化接口
3.简述一下 java 基本数据类型及所占位数, java 基本数据类型:4 类 8 种
逻辑型:boolean false/true 1byte 8bit
字符型:char 2byte 16bit 运算时按照 int 类型运算
整数型:
byte(1byte 8bit) 运算时按照 int 类型运算
short(2byte 16bit) 运算时按照 int 类型运算
int(4byte 32bit)
long(8byte 64bit) 后缀为 L/l


注:整数类型的默认类型是 int 类型 也就是说 整数类型的字面量都是 int 类型
浮点数型:
float(4byte 32bit) 后缀为 F/f
double(8byte 64bit) 后缀为 D/d
注:浮点类型的默认类型是 double 类型
除了基本数据类型,其他类型都是引用类型。
引用类型首字母大写的类型:String,Integer 等
Java 中的字面量:true,false,null,18,1.8
Java 中的特殊关键字:goto const
Int a1=5+4;//正确 编译期优化
byte b1=a1+5;//错误 a1 是变量 遵循类型运算规则
short s1=2 short s2=0
s2=s1+s2;//错误 a1 是变量 遵循类型运算规则
s2+=s1;//正确 +=是复合运算类型 直接在 s2 值的基础追加一个 s1 的值
4. 说出 9 个的启动时异常:
RunTimeException
|---NullPointerException
|——ArrayIndexOutOfBoundsException
|——ArithmeticException
|——ClassCastException
|——NumberFormatException
|——SystemException
|——ArrayStoreException
|——EmptyStackException
|——BufferOverflowException
注:异常 Exception 分为两大类:
编译时异常:编译期间要检查的
运行时异常:编译期间不检查的
5.说出 5 个常用的 java-api 包
java.lang
java.util
java.sql
java.text
java.io
6.说出 String 类中常用的 5 个方法
charAt() 返回指定索引处的 char 值


concat() 将指定字符串连接到此字符串的结尾
length()返回此字符串的长度
split()根据给定正则表达式的匹配拆分此字符串
trim()返回字符串的副本,忽略前导空白和尾部空白.
7. HashMap 和 HashTable 的区别:
1.HashMap 允许空键值对,HashTable 不允许
2.HashMap 不是线程安全的,HashTable 是
3.HashMap 直接实现 Map 接口,HashTable 直接继承 Dictionary 类
8. ArrayList,Vector,LinkedList 存储性能和特性
它们都实现 List 接口
ArrayList 和 Vector 都是基于数组实现的
LinkedList 基于双向循环链表(查找效率低,添加删除容易)
ArrayList 不是线程安全的而 Vector 是线程安全的,所以速度上 ArrayList 高于 Vector
7.Collection 和 Collections 的区别。
Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜
索、排序、线程安全化等操作。
9.List、Map、Set 三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。
Set 无法拥有重复元素,内部排序。
Map 保存 key-value 值,value 可多值。
10. final, finally, finalize 的区别
final 用于声明属性,方法和类,分 别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表 示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方
法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
11. Overload 和 Override 的区别。Overload 的方法是否可以改变返回值的类型?
方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。
重写 Overriding 是父类与子类之间多态性的一种表现,方法名,参数列表,
返回值类型都得与父类的方法一致.
重载 Overloading 是一个类中多态性的一种表现。重载的方法是可以改变返回值的类型。
12.用一句话总结一下冒泡排序。
依次比较相邻的两个数,将小数放在前面,大数放在后面.
13.写出选择,冒泡,插入排序的代码
选择排序:
for(int i=0;i<ary.length-1;i++){
for(int j=i+1;j<ary.length;j++){
if(ary[i]>ary[j]){
int t = ary[i];
ary[i]=ary[j];
ary[j]=t;


}
}
}
冒泡排序:
for(int i=0;i<ary.length-1;i++){
for(int j=0;j<ary.length-i-1;j++){
if(ary[j]>ary[j+1]){
int t = ary[j];
ary[j]=ary[j+1];
ary[j+1]=t;
}
}
}
插入排序:
for (int i = 1; i < ary.length; i++) {
int temp = ary[i];
int j;
for (j = i - 1; j >= 0 && temp < ary[j]; j--) {
ary[j + 1] = ary[j];
}
ary[j + 1] = temp;
}
14.写出二分查找的代码:
注:二分法从数组查询元素,必须保证数组内部元素是有顺序的。
意思就是先对数组进行排序。
public class BinarySearch {
static int idx=1;
public static void find(int leftIndex,int rightIndex,int val,int[] arr){
int midIndex=(rightIndex+leftIndex)/2;
int midVal=arr[midIndex];//找到中间的数
if(rightIndex>=leftIndex){
//如果要找的数比midVal大
if(midVal>val){
idx++;
//在arr左边数中找
find(leftIndex,midIndex-1,val,arr);
}else if(midVal<val){
//在arr的右边去查找
idx++;
find(midIndex+1,rightIndex,val,arr);
}else if(midVal==val){
System.out.println("找到下标"+midIndex+"共查找了"+idx+"次");


}
}else{
System.out.println("没有该数!");
}
}
public static void main(String[] args) {
int[] arr=new int[]{100,300,500,800,1000,2000,3000};
find(0,arr.length-1,1000,arr);
}
}
15.实现线程安全的两种方式
1)synchronized 方法:通过在方法声明中加入 synchronized 关键字来声明
synchronized 方法。
2)synchronized 块:通过 synchronized 关键字来声明 synchronized 块。
16.实现多线程的两种方式
1)继承 Thread 类
2)实现 Runnable 接口
优先选择实现 Runnable 接口 因为比较灵活。
17. 简述如下几个概念。
程序:指令+数据的 byte 序列。PC 上面的可运行文件
进程:正在运行的程序,是程序动态的执行过程。
线程:在进程的内部,程序并发执行的过程。
并发: 进程是并发运行的, 操作系统(OS)将时间划分为很多时间片段, 尽可能
均匀分配给正在运行的程序, 微观上进程走走停停, 宏观上都在运行
这种都运行的现象叫: 并发。
18.说一下 “==”和 equals()方法在字串变量操作中的不同?
”==”比较的是两个字符串对象的地址,equals()是比较的两个字符串的具体值。
19. sleep()和 wait()有什么区别?
sleep 是线程类(Thread)的方法,导致此线程暂停,然后执行给定时间,让出
cpu 给其他线程,但不会释放对象锁,时间到了自动恢复.
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入
等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程
才进入对象锁定池 准备获得对象锁进入运行状态。
20.&与&&的区别?
&位运算符,非短路逻辑运算符,它会把所有条件执行完毕之后,才会返回结果
&&逻辑运算符(and):短路运算符,遇到不符合条件,立即终止程序的执行
21. error 和 exception 区别


error:表示恢复不是不可能的一种严重的问题,比如:内存溢出,不指望程序处理
exception 程序运行时的异常,如果程序设计合理从不会出现的情况
22.请说出你所知道的线程同步的方法。
join():合并当前线程,相当于方法调用
yield():让出 cpu
wait():使一个线程处于等待状态,并且释放所持有的对象的 lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法
要捕捉 InterruptedException 异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不
能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按
优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象
的锁,而是让它们竞争。
suspended() –挂起,该方法已过时: 在临时停止或中断线程的执行时,线程就处于挂起状态。
resume()—恢复,该方法已过时 : 在挂起的线程被恢复执行时,可以说它已被恢复。
stop()--暴力结束当前正在执行的线程,该方法已过时
23.线程的生命周期:
24.IO
字节流:
FileInputStream 和 FileOutputStream 对文件基本的输入输出操作
BufferedInputStream 和 BufferedOutputStream 加缓冲区的操作
DataInputStream 和 DataOutputStream 对基本操作的扩展,
可以一次读一种基本数据类型的数据.
字符流:
InputStreamReader 和 OutputStreamWriter 基本字符流 可以处理字符编码
BuffereReader 和 PrintWriter 可以一次读取一行数据


25.什么是反射?
在运行过程中:
1.对于任意一个类,可以知道这个类的属性和方法.
2.对于任意一个对象,可以调用这个对象的任意方法.
对于这种动态获取的信息,以及动态调用对象方法的功能称为反射机制.
java 反射机制提供的功能:
1.运行时判断任意对象的所属类;
2.运行时构造任意类的对象;
3.运行时判断和调用对象的成员变量和方法;
4.生成动态代理.
26.什么是回调函数?
某个程序 S(Student.main) 调用 服务程序 A(Arrays) 中的某个方法(sort), 服务程
序 A 的 sort 方法在某个时候反过来调用 S 的某个方法(compareTo),这种情况
下,compareTo 叫做 S 的回调方法。
例如:public class Student implements Comparable{
private int id;
private String name;
private int age;
private int score;
//构造器
//getter / setter 方法
//回调方法
public int compareTo(Object obj){
return
this.id - ((Student)obj).id;
}
}
Student s1 = new Student(1,"a",18,89);
Student s2 = new Student(2,"x",22,94);
Student s3 = new Student(3,"w",19,78);
Student [] arrs = {s1,s2,s3};
Arrays.sort(arrs);
27.遍历文件夹下所有.java 的文件?
public void listFiles(String path){
File dir = new File(path);
Files files [] = dir.listFiles(new FileFilter(){
public boolean accept(File f){
return f.getName().endWith(".java");
}
});
for(File file : files){


System.out.println(file.getName());
}
}
28.描述一下 JVM 加载 class 文件的原理机制?
JVM 中类的装载是由 ClassLoader 和它的子类来实现的
Java ClassLoader 是一个重要的 Java 运行时系统组件。
它负责在运行时查找和装入类文件的类。
UML 部分:
标准建模语言 UML。
用例图,
静态图(包括类图、对象图和包图),
行为图,
交互图(顺序图,合作图),
实现图
Oracle 部分:
1.薪水排序后薪水排名在第 3--5 的员工
1)select * from(select ename,sal,rownum rn from
(select ename,sal from emp_44 where sal is not null order by sal desc) where rownum<6)where
rn>2;
2)select * from(select ename,sal,rownum rn from
(select ename,sal from emp_44 where sal is not null order by sal desc))where rn between 3 and
5;
2. 删除一张表中所有数据的方式?
1.truncate table 命令将快速删除数据表中的所有记录
2.delete 产 生 rollback , 如 果 删 除 在 数 据 量 的 表 速 度 会 很 慢 , 同 时 会 占 用 很 多 的
rollback,segments.truncate 是 DLL 操作,不产生 rollback,速度会快一些。
3. 用一条 sql 语句取出所有姓名有重复的学员姓名和重复的记录数.
select name, count(*) from student group by name
having count(*) > 1 order by count(*) desc;
4. 去除 oracle 数据库 表中重复数据应有如下两种方法:
方法一:创建新表删除旧表法
1)create table student1 as select distinct id, name, score from student;


2)drop table student;
3)rename student1 to student;
方法二:使用 rowid(地址)伪列
删除伪列地址除了最大地址值以外的记录
delete from temp where rowid not in (select max(rowid) from temp group by id);
删除伪列地址除了最大地址值以外的记录
delete from temp where rowid not in (select min(rowid) from temp group by id);
5. 按工资进行排名,排名从 1 开始,工资相同排名相同(如果两人并列第一则没有第二名,
从第三名继续排)
方法一:
select empno,ename,sal, (select count(*)+1 from iv_emp where sal>e.sal) rank
from iv_emp e
order by rank asc;
方法二:select e.empno,e.ename,e.salary,rank() over(order by
salary desc) mingci from emp_ding e;
6. 按工资进行排名,排名从 1 开始,工资相同排名相同。
select e.empno,e.ename,e.salary,dense_rank() over(order by
salary desc) mingci from emp_ding e;
7. 查询每个部门工资最高的前 2 名员工
方法一:
select *
from( select empno,ename,salary, deptno,(select count(*)+1 from emp_ding where
salary>e.salary and deptno = e.deptno ) rank
from emp_ding e) ee
where ee.rank<=2
order by deptno,rank asc;
方法二:
select * from ( select e.empno,e.deptno,e.ename,e.salary, dense_rank()
over (partition by deptno order by salary desc) mingci from emp_ding e ) x where
x.mingci<=2;


另: CallableStatement 是用来调用存储过程的
3.数据库数据如何提高查询速度?
1. jdbc setFetchSize();
2. 数据库:索引
3. 把大表可以拆分成多个小表
4. dba 对表进行分区
4. 解析一个 XML 文档有哪些方式?
解析有:dom 和 sax 两种
dom:把整个 XML 文档放入内存,适合 XML 随机访问,占用内存资源大
sax:事件驱动型的 XML 解析方式,顺序读取,不用一次装载整个文件,
遇到标签会触发一个事件,适和对 XML 的顺序访问,占用内存资源稍小
5.XML 文档定义有几种形式?
a: 两种形式dtd schema
b: 本质区别:schema 本身是xml 的,可以被XML 解析器解析(这
也是从 DTD 上发展 schema 的根本目的),
c:有 DOM,SAX,STAX 等
6.Java 连接数据库有几种模式(方式)?
1.直接连接 JDBC(瘦连接)
2.通过客户端(胖连接)
3.使用桥连接 ODBC(桥接)
7.分页?
1. 缓存分页(假分页)
特点: 第一次取全部数据时比较慢.(可能非常慢)以后每次都从缓存中取数据,比较快.
只访问数据库一次.内存压力大.如果需求是一般只查看前几页,浪费内存资源.
2. 数据库分页(查询分页)
特点:每次只向数据库查询并返回一页的数据频繁的数据库访问.
每次查询的时间都差不多.没有缓存压力.
两者比较:
基于缓存的方式,适合小表,全部查看
基于查询的方式,适合大表,只查询部分数据
 

文章评论