欢迎来到知了汇智!
联系电话:知了汇智-电话号码 028-62016472 / 13228113191

Java面试常考题集合之Java概念篇-知了汇智

Java面试常考题集合之Java概念篇

       相信绝大多数人学习Java的目的就是为了就业吧,而想要入职Java开发工程师,面试是必不可少的一个环节,知了堂特意为大家整理了Java面试常考题集合之Java概念篇,希望对大家面试Java开发工程师有一定的帮助。

       相关资料:Java面试常考题集合之Java概念篇
                       Java面试常考题集合之集合与数组


  1.简述你所知道的Linux:
  Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网、云计算、智能手机(Android)等领域。由于Java主要用于服务器端的开发,因此Java应用的部署环境有很多为Linux。
  Windows操作系统的目录结构,是以盘符为单位,C盘、D盘、E盘等等,数据存储在各个盘符之下,而Linux操作系统最顶层只有一个根目录root,所有文件都存储在这一个根目录之下。
  Linux不像Windows的图形操作界面,是通过命令的方式进行操作,常用命令有:
  a . pwd:用于显示当前工作目录;
  b . ls:用于查看当前工作目录内容;
  c . cd:用于改变当前工作目录。
 
  2.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
  Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
  Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
 
  3.JDK、JRE、JVM关系是什么?
  JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。开发工具如:用于编译java程序的javac命令、用于启动JVM运行java程序的java命令、用于生成文档的javadoc命令以及用于打包的jar命令等等。
  JRE(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的系统类库。系统类库即为java提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。
  JVM(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持。
  简单说,就是JDK包含JRE包含JVM。

Java面试常考题集合之Java概念篇
 
  4.Java支持的数据类型有哪些?什么是自动拆装箱?
  基本数据类型:
  整数值型:byte,short,int,long,
  字符型:char
  浮点类型:float,double
  布尔型:boolean
  整数默认int型,小数默认是double型。Float和long类型的必须加后缀。
  首先知道String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。
  而包装类就属于引用类型,自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换,因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString(当然用类名直接调用也可以,便于一眼看出该方法是静态的),还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。
 
  5.面向对象是什么?
  面向对象是一种思想,世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP),Java是一个支持并发、基于类和面向对象的计算机编程语言,面向对象软件开发的优点:
  代码开发模块化,更易维护和修改;
  代码复用性强;
  增强代码的可靠性和灵活性;
  增加代码的可读性。
  面向对象的四大基本特性:
  抽象:提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:属性(数据)和操作(行为)。这个抽象模型我们称之为类。对类进行实例化得到对象。
  封装:封装可以使类具有独立性和隔离性;保证类的高内聚。只暴露给类外部或者子类必须的属性和操作。类封装的实现依赖类的修饰符(public、protected和private等)
  继承:对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。这里指的继承包含:类的继承和接口的实现。
  多态:多态是在继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类对象。父类引用指向不同的子类对象时,调用相同的方法,呈现出不同的行为;就是类多态特性。多态可以分成编译时多态和运行时多态。
  抽象、封装、继承和多态是面向对象的基础。在面向对象四大基础特性之上,我们在做面向对象编程设计时还需要遵循有一些基本的设计原则。
  面向对象的七大设计原则:
  SOLID原则(单一职责原则、开放关闭原则、里氏替换原则、接口隔离原则和依赖倒置原则)
  迪米特法则
  组合优于继承原则(合成复用原则)。
  在遵循这些面向对象设计原则基础上,前辈们总结出一些解决不同问题场景的设计模式,以四人帮的gof23最为知名。
  这里只是简单描述了定义和特征以及设计模式的关系,具体细节不讨论。
 
  6.请写出下面几个表达式的结果,答案可以用10进制或16进制书写
  1). 0xaa | 0x55
  2). 15 & 240
  3). 10 ^ 12
  4). -2 >> 1
  5). -2 >>> 1
  1). 分析:十六进制数用0x……来表示,后面一个十六进制位是四位,两个十六进制位为一个字节,最多后面可以有8个十六进制位,32个字节,如:0xFFFFFFFF。 或(“ | ”)运算,全0为0,其他为1。
  所以:0xaa 用二进制表示为 10101010 ,0x55 用二进制表示为 01010101 ,按位或之后为 11111111 ,十进制数为255,十六进制数为 0xFF 。
  2). 分析:10进制转换成2进制,用该数字除以2,记录商和余数,利用商再次除以2,记录商和余数……直到上为0或余数为0停止,余数逆序组成二进制的从低到高位(最后的余数为二进制最低位)。与(“ & ”)运算,全1为1,其他为0 。
  所以: 15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0
  3). 分析: 亦或(“ ^ ”)运算,相同取0,不同取1 。
  所以:1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06 。
  4). 分析: 带符号右移(“ >> ”),即有符号位时,负数符号位补1,正数符号位补0, -2 的二进制求法是正数取反加1,因此 2 的二进制表示为0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一为
  1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二进制表示。
  注: >> , << , >>> , 运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。
  所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进 制数为 -1 。
  5). 分析:无符号右移 (“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。
  所以: -2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。
  注:右移和无符号右移主要区别就在于左面最高位补 0 还是补 1 的问题,无符号右移任何时候最高位都补 0 , 有符号右移则是正数补 0 ,负数补 1 。(没有无符号左移!)。
 
  7.&和&&的区别?
  &运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
 
  8.什么是值传递和引用传递?
  值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
  引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
  一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。
 
  9.是否可以在static环境中访问非static变量?
  static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
 
  10.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
  Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
 
  11.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
  当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
  Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
  Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
 
  12.Java支持多继承么?
  Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。
 
  13.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
  通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。
 
  14.接口和抽象类的区别是什么?
  从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
  Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
  接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  类可以实现很多个接口,但是只能继承一个抽象类
  类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  抽象类可以在不提供接口方法实现的情况下实现接口。
  Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
  也可以参考JDK8中抽象类和接口的区别。
 
  15.用最有效率的方法计算2乘以8?
  答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
 
  16.手写单例模式(饿汉和饱汉模式)和工厂模式?
单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}

懒汉模式://懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
  (3)工厂模式:
  interface IFactory{
  public IProduct createProduct();}
  Class Factory implements IFactory{
  public IProduct createProduct(){return new Product();}}
  Public class client{
  Public Static void main (String [] args){IFactory factory=new Factory();
  IProduct product=factory.createProduct();
  product.ProductMethod();}}
 
  17.String和StringBuilder、StringBuffer的区别?
  Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
 
  版权声明:本文来源于网络,由知了堂搜集整理,仅供大家提前熟悉Java面试时使用
132 2811 3191
预约免费试学
点击咨询
预约试学