java面经
前言 本文介绍java的常见的面试题目,从java的基础,容器,多线程几个角度阐述java的基础知识,采用边背边写的方式,背的顺序为常规顺序,3道题一轮回。
零.面向对象的三个特点 封装,继承,多态
1、封装
封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
面相对象的不就是使用程序处理事情时以对象为中心去分析吗,与面向过程不同,面向过程关心处理的逻辑、流程等问题,而不关心事件主体。而面向对象即面向主体,所以我们在解决问题时应该先进行对象的封装(对象是封装类的实例,比如张三是人,人是一个封装类,张三只是对象中的一个实例、一个对象)。比如我们日常生活中的小兔子、小绵羊都可以封装为一个类。
比如兔子的属性有两只耳朵、四只腿、一双眼睛、三瓣嘴等;行为(功能)有跑、跳、吃素等。
2、继承
继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。类似下面这个图:
【实习面试之java常见题目】我们在上面已经封装了兔子这个类,其他动物也一样可以进行封装。在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。
3、多态
多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件:
重写(子类继承父类后对父类方法进行重新定义)
父类引用指向子类对象
简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。
一. java基础
- JDK和JRE的区别:
- jdk : java development kit : 是java的工具包,提供java的开发环境和运行环境。
- JRE:java runtime environment:是java程序的运行环境。
- ==和equals的区别是什么?
对于基本类型和引用类型的效果是不同的,如下图所示:
- 基本类型:比较的是值是否相同
- 引用类型:比较的是引用是否相同
代码例子:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y);
// true
System.out.println(x==z);
// false
System.out.println(x.equals(y));
// true
System.out.println(x.equals(z));
// true
代码解读:
对于x和y来说他们都是基本类型,比较的是引用是否相同,所以==是true。
对于z来说,new的对象开辟了一段新的地址空间,所以引用不相同。
而对于equals来说他们都是比较值是否相同。
对于equals来说
equals的本质实际上就是==,只不过啊String和Integer等重写了equals方法,把他们变成了值的比较。看下面的代码会有更好的了解
class Cat {
public Cat(String name) {
this.name = name;
}private String name;
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}
}Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2));
// false
结果是false,equals的源码是:
public boolean equals(Object obj) {
return (this == obj);
}
这里面的this代表的是获取当前实例本身,所以本质上就是equal
如果有类似于Child c = new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它。
this的相关用法
同样的当我们进入到String的equals的源码的时候,我们发现了答案。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
原来是String重写了Object的equals方法,把引用改成了比较值。
总结:对于==来说基础类型比较的是值,引用类型比较的是引用的地址。对于equals来说一些String和Integer的类型重写了equals的方法,把它变成了比较值。
- 两个对象的hashcode()相同,则equals()也一定为true嘛?
不对,两个对象的hashcode()相同,但是equals不一定相同。
代码例子:
1 String str1 = "通话";
2 String str2 = "重地";
3 System.out.println(String.format("str1:%d | str2:%d",str1.hashCode(),str2.hashCode()));
4 System.out.println(str1.equals(str2));
hashcode的源码是什么
执行的结果是:
文章图片
4. 4. final在java中有哪些作用?
- final 修饰的类叫最终类,该类不能被继承
- final修饰的方法不能被重写
- final修饰的变量叫常量,常量必须被初始化,初始化之后的值就不能被更改。
- java中的Math.round(-1.5)等于多少?
等于-1,在数轴上取值的时候啊,中间值0.5向右取。
- String属于基础数据类型吗?
不属于,java的基础数据类型有8种,int,long,short,float,double,byte,char,boolean。
- java中的字符串都有哪些类?他们都有哪些区别?
操作字符串有:String,StringBuffer,StringBuilder。
String和StringBuffer,StringBuilder最大的区别在于String是不可变化的,所有的String的操作都会生成新的String的对象,然后将指针指向新的String对象。而StringBuffer和StringBuilder可以在原有的对象的基础上进行操作,所以在经常需要修改字符串的情况下还是尽量多使用StringBuilder和StringBuffer。
StringBuffer和StringBuilder之间的区别就是,StringBuffer是线程安全的,而StringBuilder是非线程安全的。但是StringBuilder的效率要高于StringBuffer。所以在单线程的环境下推荐使用StringBuilder,反之多线程应该使用StringBuffer。
- String str=“iii”与String str = new String(“iii”)一样吗?
答案
不一样,第一种情况是在常量池中检索iii,如果没有的话就在常量池中新建一个iii,并且将其地址指向str;如果有就直接指向。第二种情况是在堆内存中创建iii对象,并且将这个对象指向栈内存中的str。
- 如何将字符串进行反转?
stringbuffer和StringBuilder中有reverse的方法。可以调用这个方法直接反转字符串。
- String类种常见的方法有哪些?
- indexOf():返回指定字符的索引
- charAt() :返回指定索引位置的字符
- replace():字符串替换
- trim():去掉字符串两侧的空格
- split():分割字符串,返回一个分割后的字符串数组
- getByte():返回字符串Byte类型的数组
- length():返回字符串的长度
- toLowerCase():将一串已知的字符串转换成小写字母
- toUpperCase():将一串已知的字符串转换成大写字母
- subString():截取一串字符串
- equals():字符串的比较
override是重写,抽象类和接口之间的关系
- 普通类和抽象类之间的关系:
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以实例化。
- 抽象类一定要有抽象方法吗?
不一定啊,如果有抽象方法的话一定要在子类中重写。
- 抽象类能使用final进行修饰吗?
不能,因为抽象类只有被继承才是有意义的。如果夫类定义成抽象类,那么该类就不会被继承。编译器也会报错说abstract和final是不合法的修饰词。
- 接口类和抽象类有什么区别?
- 实现:抽象类的子类用extends来继承,而接口使用implement来实现
- 构造函数:抽象类可以有构造函数,而接口不能有构造函数
- main方法:抽象类可以有main方法,并且我们能够运行它;而接口不能有main方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。
- ???各种修饰符的作用
- java中的IO流分为几种?
按照类型来分:字节流和字符流
字节流和字符流的区别是,字节流按照8位传输以字节为单位输入输出数据,字符按照16位传输以字符为单位输入输出数据。
- Files的常用方法有哪些?
- Files.exists():检测文件是否存在
- Files.createFile():创建文件
- Files.createDirectory():创建文件件
- Files.delete():文件删除
- Files.copy():复制文件
- Files.move():移动文件
- Files.size():文件的大小
- Files.read():读取文件
- Files.write():写入文件
- java的容器有哪些?
常用的容器目录:
文章图片
https://www.cnblogs.com/code-java/p/6847922.html 有关于Java中ArrayList、Vector、LinkedList三者的异同点
https://blog.csdn.net/coding_1994/article/details/80553554 Java——HashSet和TreeSet的区别
- collection和collections有什么区别?
- java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口皆苦方法。collection接口在java类库中有很多具体方法的实现。
collection接口的意义是为各种具体的集合提供最大的统一华操作方式,其直接继承接口有List与Set - Collections则是集合类的一个 工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序,搜索以及线程安全等各种操作。
- java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口皆苦方法。collection接口在java类库中有很多具体方法的实现。
- list,set,map之间的区别是什么?
文章图片
- Hashmap和hashtable有什么区别?
- hashmap是单线程使用的,hashtable是同步的
- hashmap去掉了contains方法,但是加上了containsValue()和containsKey方法
- hashmap允许空键值,而hashtable不允许
- hashmap和treemap?
在map中插入,删除和定位这类操作,hashmap是最好的选择。有序集合遍历,treemap更好。
- 说一下hashmap的实现原理?
链表后面接上散列。
put元素的时候,首先根据key的值计算一个hashcode。根据这个值得到这个元素在这个数组的下标位置。如果这个位置已经有元素,放入后面的链表当中。
- hashset的实现原理?
- hashset底层是由hashmap实现的
- hashset的元素是直接放在hashmap的key中
- hashmap的value中存放的是present
- arraylist和linkedlist之间的区别是什么?
arraylist是arry,linkedlist是双向链表
- arraylist和array
- array可以容纳基本类型和对象
- arraylist大小是固定的,array大小是指定的
- array没有那么多功能,addall,removeal
- 并行和并发的区别?
- 并行是指两个或者多个事件在同一时刻发生;并发是指两个或者多个事件在同一时间间隔发生。
- 并行是在不同实体的多个事件,并发是在同一实体上的多个事件
- 在一台处理器上同时处理多个任务,在多台处理器上同时处理多个任务。
推荐阅读
- 技术|测试工程师需要准备哪些知识
- 技术|测试用例编写
- 技术|Redis配置详解
- DevExpress之GridControl根据单元格内容显示不同图标(图标+内容)
- 技术|(面试感悟)一名3年工作经验的程序员应该具备的技能 ...
- 华为云媒体査勇(华为云在视频AI转码领域的技术实践)
- NRZ 对比 PAM4 调制技术
- 「IT新技术」赛道拉票打call攻略(投票序号(071-100))
- 国内首个《政务APP技术指标评价规范》团体标准正式出台