本文介绍java的常见的面试题目,从java的基础,容器,多线程几个角度阐述java的基础知识,采用边背边写的方式,背的顺序为常规顺序,3道题一轮回。
封装,继承,多态
1、封装
封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
面相对象的不就是使用程序处理事情时以对象为中心去分析吗,与面向过程不同,面向过程关心处理的逻辑、流程等问题,而不关心事件主体。而面向对象即面向主体,所以我们在解决问题时应该先进行对象的封装(对象是封装类的实例,比如张三是人,人是一个封装类,张三只是对象中的一个实例、一个对象)。比如我们日常生活中的小兔子、小绵羊都可以封装为一个类。
比如兔子的属性有两只耳朵、四只腿、一双眼睛、三瓣嘴等;行为(功能)有跑、跳、吃素等。
2、继承
继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。类似下面这个图:
我们在上面已经封装了兔子这个类,其他动物也一样可以进行封装。在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。
3、多态
多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的优点:
继承
重写(子类继承父类后对父类方法进行重新定义)
父类引用指向子类对象
简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。
JDK和JRE的区别:
具体来说jre包含了jdk,同时包含了java的源码和编译器javac,还包含了很多java的调试和分析的工具。如果运行java程序,jre就够了;如果开发java程序就要用到jdk。
==和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的方法,把它变成了比较值。
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中有哪些作用?
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类种常见的方法有哪些?
override是重写,抽象类和接口之间的关系
普通类和抽象类之间的关系:
抽象类一定要有抽象方法吗?
不一定啊,如果有抽象方法的话一定要在子类中重写。
抽象类能使用final进行修饰吗?
不能,因为抽象类只有被继承才是有意义的。如果夫类定义成抽象类,那么该类就不会被继承。编译器也会报错说abstract和final是不合法的修饰词。
接口类和抽象类有什么区别?
按照功能分:输入流,输出流
按照类型来分:字节流和字符流
字节流和字符流的区别是,字节流按照8位传输以字节为单位输入输出数据,字符按照16位传输以字符为单位输入输出数据。
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有什么区别?
Hashmap和hashtable有什么区别?
hashmap和treemap?
在map中插入,删除和定位这类操作,hashmap是最好的选择。有序集合遍历,treemap更好。
说一下hashmap的实现原理?
链表后面接上散列。
put元素的时候,首先根据key的值计算一个hashcode。根据这个值得到这个元素在这个数组的下标位置。如果这个位置已经有元素,放入后面的链表当中。
hashset的实现原理?
arraylist和linkedlist之间的区别是什么?
arraylist是arry,linkedlist是双向链表
arraylist和array