Java面试必看(一) 我会带着你远行 2023-05-21 06:00 101阅读 0赞 **1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?** Java虚拟机是一个可以执行Java字节码的虚拟机进程。 java的跨平台不是java源程序的跨平台 ,如果是这样,那么所以语言都是跨平台的, java源程序先经过**javac编译器**编译成二进制的**.class字节码文件**(java的跨平台指的就是.class字节码文件的跨平台,**.class字节码文件是与平台无关的**),.class文件再运行在jvm上,**java解释器(jvm的一部分)会将其解释成对应平台的机器码执行**,所以java所谓的跨平台就是**在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。** 最后解释下机器码和字节码的区别: 一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~ 二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论哪种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~ **2、JDK和JRE的区别是什么?** JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了**java虚拟机**,**java基础类库**。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。 JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的**编译器javac**,还包含了很多**java程序调试和分析的工具**:**jconsole**,**jvisualvm**等工具软件,还包含了java程序编写所需的**文档**和**demo例子程序**。 **如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK**。 **3、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?** “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。 Java中**static方法不能被覆盖**,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。 java中也**不可以覆盖private的方法**,因为**private修饰的变量和方法只能在当前类中使用**,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。 **4、是否可以在static环境中访问非static变量?** static变量在Java中是属于类的,它在所有的实例中的值是一样的。**当类被Java虚拟机载入的时候,会对static变量进行初始化。**如果你的代码尝试**不用实例来访问非static的变量,编译器会报错**,因为**这些变量还没有被创建出来,还没有跟任何实例关联**。 **5、Java支持的数据类型有哪些?什么是自动拆装箱?** Java语言支持的8种基本数据类型是: **byte,short,int,long,float,double,boolean,char** 自动装箱是Java编译器在**基本数据类型**和对应的**对象包装类型**之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。 Java支持的数据类型包括两种:一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;另一种是引用类型:如String等,其实是对象的引用,**JVM中虚拟栈中存的是对象的地址**,**创建的对象实质在堆中**,**通过地址来找到堆中的对象的过程,即为引用类型**。自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程 **6、Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?** 重载:**同一个类**、**不同方法**、**方法名相同**、**返回值类型或者参数不同** 重写:**子类和父类、方法名相同、返回值类型和参数相同** **7、Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?** 当**新对象被创建的时候**,构造方法会被调用。**每一个类都有构造方法**。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。 Java中构造方法重载和方法重载很相似。可以为**一个类创建多个构造方法**。每一个构造方法必须有它自己**唯一的参数列表**。 Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。 **8、Java支持多继承么?** Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。 **9、接口和抽象类的区别是什么?** Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于: **接口**中所有的方法隐含的都是**抽象**的。而**抽象类**则可以同时包含**抽象和非抽象**的方法。 类可以**实现很多个接口**,但是**只能继承一个抽象类** **类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。** 抽象类可以在**不提供接口方法实现**的情况下**实现接口**。 Java接口中声明的**变量**默认都是**final**的。抽象类可以**包含非final的变量**。 Java接口中的**成员函数**默认是**public**的。抽象类的成员函数可以是**private**,**protected**或者是**public**。 **接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。** 从设计层面来说,抽象是对类的抽象,是一种**模板设计**,接口是行为的抽象,是一种**行为的规范**。 **10、什么是值传递和引用传递?** **8大基本类型**都属于**值传递**,方法内对其进行修改是**不会改变实际参数**的。引用类型传递时则是传递的是一个**地址值**,这时就可以对该地址的值进行修改,**再次访问得到的是修改后的值**。 **而string是不可改变的**。 **11、进程和线程的区别是什么?** 进程是运行中的程序,线程是进程的内部的一个执行序列 进程是资源分配的单元,线程是执行行单元 进程间切换代价大,线程间切换代价小 进程拥有资源多,线程拥有资源少 多个线程共享进程的资源 **12、创建线程有几种不同的方式?你喜欢哪一种?为什么?** 继承Thread类,重写run方法; 实现Runnable接口,重写run方法,但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性; 实现callable接口,重写call方法,有返回值。 使用实现了Executor接口的ThreadPoolExecutor来创建线程池。 **13、概括的解释下线程的几种可用状态。** 1. **新建**( new ):新创建了一个线程对象。 2. **可运行**( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的** start ()**方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。 3. **运行**( running ):可运行状态( runnable )的线程获得了** cpu 时间片**( timeslice ) ,执行程序代码。 4. **阻塞**( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种: (一). **等待阻塞**:运行( running )的线程执行 **o . wait ()**方法, JVM 会把该线程放 入等待队列( waitting queue )中。 (二). **同步阻塞**:运行( running )的线程在获取对象的同步锁时,若该**同步锁 被别的线程占用**,则 JVM 会把该线程放入锁池( lock pool )中。 (三). **其他阻塞**: 运行( running )的线程执行** Thread . sleep ( long ms )**或 **t . join ()**方法,或者**发出了 I / O 请求**时,JVM 会把该线程置为阻塞状态。当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。 5. **死亡**( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。 ![format_png][] **14、同步方法和同步代码块的区别是什么?** 同步方法默认用this或者当前类class对象作为锁; 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法; 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object)\{代码内容\}进行修饰; **15、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?** 监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。 **16、什么是死锁(deadlock)?** **死锁** **:**是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种**互相等待**的现象,若无**外力**作用,它们都将无法推进下去 (1) 因为系统资源不足。 (2) 进程运行推进顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 (1) **互斥条件**:一个资源每次只能被一个进程使用。 (2) **请求与保持条件**:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) **不剥夺条件**:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) **循环等待条件**:若干进程之间形成一种头尾相接的循环等待资源关系。 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。 **死锁的解除与预防:** 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确 定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态 的情况下占用资源。因此,对资源的分配要给予合理的规划。 **17、如何确保N个线程可以访问N个资源同时又不导致死锁?** 使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。 **18、Java集合类框架的基本接口有哪些?** 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。 Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有: Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的Collection。 List:有顺序的collection,并且可以包含重复元素。 Map:可以把键(key)映射到值(value)的对象,键不能重复。 ![format_png 1][] **19、为什么集合类没有实现Cloneable和Serializable接口?** 克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。 **20、什么是迭代器(Iterator)?** 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。 (2) 使用next()获得序列中的下一个元素。 (3) 使用hasNext()检查序列中是否还有元素。 (4) 使用remove()将迭代器新返回的元素删除。 Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。 [format_png]: /images/20230521/e9fa87d738b44ec8a34fab60a228764b.png [format_png 1]: /images/20230521/c4d9c5087ab541a3bf7d383d050348f9.png
还没有评论,来说两句吧...