2020年25大一线互联网高频Java面试题(一):JavaOOP面试题
由于篇幅原因,有需要2020年25大一线互联网高频Java面试题完整文档“【点击这里】”即可获取资料免费领取方式!
1、什么是B/S架构?什么是C/S架构
- B/S(Browser/Server),浏览器/服务器程序
- C/S(Client/Server),客户端/服务端,桌面应用程序
2、Java都有那些开发平台?
- JAVA SE:主要用在客户端开发
- JAVA EE:主要用在web应用程序开发
- JAVA ME:主要用在嵌入式应用程序开发
3、什么是JDK?什么是JRE?
- JDK:java development kit:java开发工具包,是开发人员所需要安装的环境
- JRE:java runtime environment:java运行环境,java程序运行所需要安装的环境
4、Java语言有哪些特点
- 简单易学、有丰富的类库
- 面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)
- 与平台无关性(JVM是Java跨平台使用的根本)
- 可靠安全
- 支持多线程
5、面向对象和面向过程的区别
- 面向过程:
一种较早的编程思想,顾名思义就是该思想是站着过程的角度思考问题,强调的就是功能行为,功能的执行过程,即先后顺序,而每
一个功能我们都使用函数(类似于方法)把这些步骤一步一步实现。使用的时候依次调用函数就可以了2. 面向对象:
一种基于面向过程的新编程思想,顾名思义就是该思想是站在对象的角度思考问题,我们把多个功能合理放到不同对象里,强调的是
具备某些功能的对象。
具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易
于开发大型软件产品,有良好的可维护性。
在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。
6、什么是数据结构?
计算机保存,组织数据的方式
7、Java的数据结构有那些?
1.线性表(ArrayList)
2.链表(LinkedList)
3.栈(Stack)
4.队列(Queue)
5.图(Map)
6.树(Tree)
8、什么是OOP?
面向对象编程
9、类与对象的关系?
类是对象的抽象,对象是类的具体,类是对象的模板,对象是类的实例
10、Java中有几种数据类型
整形:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean
11、标识符的命名规则。
- 标识符的含义:
是指在程序中,我们自己定义的内容,譬如,类的名字,方法名称以及变量名称等等,都是标识符。 - 命名规则:(硬性要求)
标识符可以包含英文字母,0-9的数字,$以及_
标识符不能以数字开头
标识符不是关键字 - 命名规范:(非硬性要求)
类名规范:首字符大写,后面每个单词首字母大写(大驼峰式)。
变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
方法名规范:同变量名。
12、instanceof关键字的作用
instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:
boolean result = obj instanceof Class
其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或
间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定
类型,则通过编译,具体看运行时定。
inti=0;
System.out.println(i instanceof Integer);//编译不通过i必须是引用类型,不能是基本类型
System.out.println(i instanceof Object);//编译不通过
Integer integer=newInteger(1);
System.out.println(integer instanceof Integer);//true
//false,在JavaSE规范中对instanceof运算符的规定就是:如果obj为null,那么将返回false。
System.out.println(nullinstanceofObject);
13、什么是隐式转换,什么是显式转换
显示转换就是类型强转,把一个大类型的数据强制赋值给小类型的数据;隐式转换就是大范围的变量能够接受小范围的数据;隐式转换和显
式转换其实就是自动类型转换和强制类型转换。
14、Char类型能不能转成int类型?能不能转化成string类型,能不能转成double类型
Char在java中也是比较特殊的类型,它的int值从1开始,一共有2的16次方个数据;
Char<int<long<float<double;Char类型可以隐式转成int,double类型,但是不能隐式转换成string;如果char类
型转成byte,short类型的时候,需要强转。
15、什么是拆装箱?
- 装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的
valueOf(int) 方法
拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int)。调用方法:Integer的intValue方 法
在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i = new Integer(10);
而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这
样就可以了:
Integer i = 10;
面试题1: 以下代码会输出什么?
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
结果:
true
false
16、Java中的包装类都是那些?
byte:Byte,short:Short,int:Integer,long:Long,float:Float,double:Double,char:Character ,boolean:Boolean
17、一个java类中包含那些内容?
属性、方法、内部类、构造方法、代码块。
18、那针对浮点型数据运算出现的误差的问题,你怎么解决?
使用Bigdecimal类进行浮点型数据的运算
19、面向对象的特征有哪些方面?
抽象:
抽象是将一类对象的共同特征总结出来构造类的过程, 包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属
性和行为,并不关注这些行为的细节是什么。
继承:
继承是从已有类得到继承信息创建新类的过程.提供继承信息的类被称为父类(超类、基类) ;得到继承信息的类被称
为子类(派生类)。继承让变化中的软件系统有了一定的延续性 ,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博土的《Java 与模式》或《设计模式精解》中.关于桥梁模式的部分)。
封装:
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问
只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自
治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写
一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,
只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,
明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是
封装得足够好的,因为几个按键就搞定了所有的事情)。
多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分
为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的
服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B
系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须
刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,
甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道
供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载
(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)
实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的
东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已
有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样
的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要
注意子类函数的访问修饰权限不能少于父类的。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
原因: 在某个范围内的整型数值的个数是有限的,而浮点数却不是。
重写 总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)
则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来
判断重载。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
重载总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
25、equals与== * 的区别
:
- == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是
指相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。
equals:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以
适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的
equals方法返回的却是== 的判断。
总结:
所有比较是否相等时,都是用equals 并且在对常量相比较时,把常量写在前面,因为使用object的
equals object可能为null 则空指针
在阿里的代码规范中只使用equals ,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来排
查老代码使用“==”,替换成equals
36、++i与i++的区别
i++:先赋值,后计算
++i:先计算,后赋值
37、程序的结构有那些?
顺序结构
选择结构
循环结构
38、数组实例化有几种方式?
静态实例化:创建数组的时候已经指定数组中的元素,
动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值
39、Java中各种数据默认值
Byte,short,int,long默认是都是0
Boolean默认值是false
Char类型的默认值是’’
Float与double类型的默认是0.0
对象类型的默认值是null
40、Java常用包有那些?
Java.lang
Java.io
Java.sql
Java.util
Java.awt
Java.net
Java.math
接口:
- 全部的方法都是抽象方法,属性都是常量
- 不能实例化,可以定义变量。
- 接口变量可以引用具体实现类的实例
- 接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法
- 接口之间可以多实现
- 一个具体类可以实现多个接口,实现多继承现象
63、Hashcode的作用
java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该
元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较满。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将
哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素
的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行
任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这
样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
由于篇幅原因,有需要2020年25大一线互联网高频Java面试题完整文档“【点击这里】”即可获取资料免费领取方式!
上一篇: java中异常和IO流
下一篇: NMF和SVD在推荐系统中的应用(实战)