当前位置 : 主页 > 编程语言 > 其它开发 >

Java面试宝典学习笔记【2020】

来源:互联网 收集:自由互联 发布时间:2022-05-30
Java面试题总结 一、Java基础1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。Java保留了这个关键字但是没有使用。

Java面试题总结


一、Java基础 1)Java有没有goto?

goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。Java保留了这个关键字但是没有使用。

2)&和&&的区别?

&和&&都表示逻辑与的关系,同真则真,有假则假。

&&具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式。if(x == 33 & ++y>0) y 会增长,if(x ==33 && ++y>0) 不会增长

& 是按位与运算符。当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作。

3)静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间, 静态变量就可以被使用了。

4)是否可以从一个 static 方法内部发出对非 static 方法的调用?

不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个 static 方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那个非 static 方法是关联到哪个对象上的呢?

5)Math类的三个取整方法

Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3) 的结果为 12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是地板,该方法就表示向下取整, Math.ceil(11.6)的结果为 11,Math.ceil(-11.6)的结果是-12;最难掌握的是round 方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5 后再向下取整,所以,Math.round(11.5)的结果为 12,Math.round(-11.5)的结果为-11。

6)请说出作用域 public,private,protected,以及不写时的区别(不写是friendly)

7)Overload 和 Override 的区别。
  1. 重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
  2. 在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int))
  3. 被覆盖和被重载的方法都不能是private。
8)构造器 Constructor 是否可被 override?

构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

9)面向对象的特征有哪些方面?

面向对象的编程语言有封装、继承 、抽象、多态等 4 个主要的特征。

  1. 封装:实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。私有的属性,公有的方法。

    例子:面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。

  2. 抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。

  3. 继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系, 提高了软件的可重用性和可扩展性。

  4. 多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

10)Java中实现多态的机制是什么?

父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。


11)abstract class 和 interface 有什么区别?
  • 含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必全是抽象的(也就是说可以有一个抽象类,里面没有抽象方法),但是不可以是private的。abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法(但是可以有普通静态方法和普通构造方法)。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。

  • 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

  • 简言之,抽象类本质是是类,可以有普通类有的一些东西,但是接口比抽象类还要抽象,接口中只能有公开的未实现的方法。

    一个类可以实现多个接口但是只能继承一个抽象类。接口不可以有普通成员变量,但是可以有静态成员变量,接口不可以有静态方法。接口不可以有构造方法。

  • 总结:接口主要是给出一些方法,如果某个类实现了这个接口,这些功能就会加到这个类上。

    ​ 抽象类本质上还是类,只不过这个类不清楚自己到底干了什么没干什么,因为他自身存在没有实现完的东西需要留给继承它的子类去做。

12)什么是native方法?

简单地讲,一个Native Method就是一个java调用非java代码的接口。

  • Java程序中声明native修饰的方法,类似于abstract修饰的方法,只有方法签名,没有方法实现。编译该java文件,会产生一个.class文件。
  • 使用javah编译上一步产生的class文件,会产生一个.h文件。
  • 写一个.cpp文件实现上一步中.h文件中的方法。
  • 将上一步的.cpp文件编译成动态链接库文件.dll。
  • 最后就可以使用System或是Runtime中的loadLibrary()方法加载上一步的产生的动态连接库文件了。
13)谈一谈对String的理解?

基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。
java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类

14)数组有没有 length()这个方法? String 有没有 length()这个方法?

数组没有 length()这个方法,有 length 的属性。String 有有 length()这个方法。

15)这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
String s1 = "a"; 
String s2 = s1 + "b"; 
String s3 = "a" + "b";
System.out.println(s2 == "ab"); 
System.out.println(s3 == "ab");

第一条语句打印的结果为 false,第二条语句打印的结果为 true,这说明 javac 编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以, 上面的代码应该只创建了一个 String 对象。写如下两行代码,
String s = "a" + "b" + "c" + "d"; System.out.println(s == "abcd");
最终打印的结果应该为 true。

16)try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
package com.test;

public class Test1 {
    public static void main(String[] args) {
        try {
            System.out.println(new Test1().testname());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public String testname() throws Exception {
        String t = "";

        try {
            t = "try";
            System.out.println("try");
            return t;
        } catch (Exception e) {
            // result = "catch";
            t = "catch";
            return t;
        } finally {

            System.out.println("finally");
            // return t = "finally";
        }
    }
}
打印结果如下:
try
finally
try
将finally中的注释放开,打印结果如下:
try
finally
finally

参考:https://www.cnblogs.com/xh_Blog/p/6518620.html

结论:finally中的代码肯定会执行,但是会先执行try中的代码,如果try中有return,那么return的东西会先放到函数栈中,然后再执行finally中的代码,

①、如果finally中也有return,则会直接返回并终止程序,函数栈中的return不会被完成!;

②、如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中的try中的return的内容返回并终止程序;

catch同try;

17)error 和 exception 有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。error不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

18)Java 中的异常处理机制的简单原理和应用。
  • 异常是指 java 程序运行时(非编译)所发生的非正常情况或错误。

Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和 ExceptionError 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下(系统异常)还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常(程序不应该死掉)是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

  • java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try..catch 处理或用 throws 声明继续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用 try..catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常
19)请写出你最常见到的 5 个 runtime exception。

​ 参考:https://blog.csdn.net/qq_20417499/article/details/80222820

  1. ClassNotFoundException找不到类异常
    当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
  2. ArrayIndexOutOfBoundsException数组下标越界异常
    当使用的数组下标超出数组允许范围时,抛出该异常。
  3. NullPointerException空指针异常类
    String s=null;
    int size=s.size();
    当应用程序试图在需要对象的地方使用 null 时,抛出异常。
  4. ArithmeticException算术异常类
    int a=5/0;
    一个整数“除以零”时,抛出异常。
  5. ClassCastException类型强制转换异常
    Object x = new Integer(0);
    System.out.println((String)x);
    当试图将对象强制转换为不是实例的子类时,抛出该异常。

20)什么是线程安全?

含义:当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类时线程安全的。
如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的。

21)ArrayList 和 Vector 的区别?

共同点:这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的。

区别:

  1. 同步性:Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线程序不安全的,它的方法之间是线程不同步的。
  2. 数据增长:当存储进它们里面的元素的个数超过了容量时,Vector 增长原来的一倍,ArrayList 增加原来的 0.5 倍。
22)HashMap 和 HashTable 的区别?

HashMap 是 HashTable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下, 效率要高于 HashTable。

  1. HashMap 不是线程安全的 HashTable 实现了线程同步
  2. HashMap 允许出现null的key或者value但是HashTable 不允许
23)Collection 简述?

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java 所有的集合类都位于 java.util 包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。

集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。其实你在添加list.add(1)的时候 基本数据类型的1被自动装箱成为了Integer类型。

Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。图 1 和图 2 分别为 Collection 和 Map 的子接口及其实现类。

24)Collection 和 Collections 的区别?

Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

类比Object和Objects

25)== 和 equals 的区别是什么?

一、对象类型不同

1、equals():是超类Object中的方法。

2、==:是操作符。

二、比较的对象不同

1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。

2、==:用于比较引用和比较基本数据类型时具有不同的功能,具体如下:

(1)、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。

(2)、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

三、运行速度不同

1、equals():没有 == 运行速度快。

2、== 运行速度比equals()快,因为 == 只是比较引用。

总结:equals方法比较的是对象的值是否相等,而 == 比较的是引用是否相等,也就是说,如果当两个对象的值一样但是引用地址不一样的时候,用equals比较是true但是用 == 就是false。

补充:Java有 5种引用类型(对象类型):类 接口 数组 枚举 标注

26)你所知道的集合类都有哪些?主要方法?

Set,大概的方法是 add,remove, contains;

对于 map,大概的方法就是put,remove,contains 等,List 类会有 get(int index)这样的方法,因为它可以按顺序取元素,而 Set 类中没有 get(int index)这样的方法。

List 和 Set 都可以迭代出所有元素,迭代时先要得到一个iterator 对象,所以,Set 和 list 类都有一个 iterator 方法,用于返回那个 iterator 对象。

map 可以返回三个集合,一个是返回所有的 key 的集合,另外一个返回的是所有 value 的集合,再一个返回的 key 和 value 组合成的 EntrySet 对象的集合,map 也有 get 方法,参数是 key,返回值是 key 对应的 value。

27)列举几个你常用的类、接口和包
  1. Java常用的类:BufferedReader BufferedWriter ,FileReader FileWirter ,Date, Class, 、String
  2. java常用的接口:List ,Map ,Set,HttpServletRequest ,HttpServletResponse ,Servlet
  3. java常用的包:java.lang ,java.io ,java.util ,java.sql ,javax.servlet
  • java.lang:该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。
  • java.util:该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
  • java.io:该包通过文件系统、数据流和序列化提供系统的输入与输出。
  • java.sql:该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。
  • javax.servlet: 包含了一定数量的类和接口,这些类和接口描述和定义了一个servlet程序和运行时环境的合同。这运行时环境提供给遵循 servlet容器的类的实例。

28)Java 栈和堆的区别

1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。

3 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

二、JavaWeb 29)解释一下什么是 servlet

servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。

30)描述一下 servlet 生命周期

Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其 destroy 方法。

31)servlet基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}
}
32)SERVLET API 中 forward() 与 redirect()的区别?

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;

后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

33)jsp 有哪些动作?作用分别是什么?
  1. jsp:include:在页面被请求的时候引入一个文件。

  2. jsp:useBean:寻找或者实例化一个 JavaBean。

  3. jsp:setProperty:设置 JavaBean 的属性。

  4. jsp:getProperty:输出某个 JavaBean 的属性。

  5. jsp:forward:把请求转到一个新的页面。

  6. jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记


三、数据库 34)JdbcUtils (mysql)
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
    /**
     *  创建一个jdbc的工具类,简化创建连接和释放资源的操作
     */
    private static String url;
    private static String user;
    private static String password;

    //创建静态代码块,在类加载的时候执行一次,用来读取配文件
    static {
        try {
            //创建properties集合类
            Properties properties = new Properties();
            //注意,用类加载器来动态获取src下的配置文件路径
            ClassLoader classLoader = JdbcUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String path1 = resource.getPath();
            //用urlDecoder来解决中文jdbc中文路径乱码的问题
            String path = URLDecoder.decode(path1, "utf-8");
            System.out.println(path);
            //加载配置文件
           // properties.load(new FileReader("src/jdbc.properties"));
            //用path来动态的获取路径
            properties.load(new FileReader(path));
            //获取信息
             url = properties.getProperty("url");
             user = properties.getProperty("user");
             password = properties.getProperty("password");
            String driver = properties.getProperty("driver");

            //注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    //1.定义创建连接的方法
    public  static Connection getConnection(){
        try  {
            System.out.println("url"+url);
            Connection connection = DriverManager.getConnection(url, user, password) ;
            return connection;
        }catch (Exception e){
            return null;
        }

    }
    //2.定义释放资源的方法

    public static void close(Statement statement ,Connection connection){
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
    //3.释放资源方法重载
    public static void close(ResultSet rs ,Statement statement ,Connection connection){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}
35)Jdbc 连接 oracle
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class dbUtil {
  public static Connection getConnection(){
	  Connection conn=null;
	  
	  try {
		String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		  String user="scott";
		  String password="tiger";
		  
		  Class.forName("oracle.jdbc.driver.OracleDriver");//加载数据驱动
		  conn = DriverManager.getConnection(url, user, password);// 连接数据库
		  
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		System.out.println("加载数据库驱动失败");
	}catch(Exception e){
		e.printStackTrace();
		System.out.println("连接数据库失败");
	}
	  return conn;
  }
  public static void close(Connection conn, PreparedStatement ps, ResultSet rs){
	  try {
		if(rs!=null){
			  rs.close();
		  }
	} catch (SQLException e) {
		e.printStackTrace();
	}
	  
	  try {
			if(ps!=null){
				  ps.close();
			  }
		} catch (SQLException e) {
			e.printStackTrace();
		}
	  
	  try {
			if(conn!=null){
				  conn.close();
			  }
		} catch (SQLException e) {
			e.printStackTrace();
		} 
  }
}
36)大数据量下的分页解决方法
"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
37)ORM是什么,有什么作用?
  • 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

  • ORM是面向对象程序设计语言和关系数据库发展不同步时的中间解决方案。采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(创建、修改、删除等),而ORM框架则将这些面向对象的操作转换成底层的SQL操作。

    ===

    【文章原创作者:香港云服务器 http://www.558idc.com/ne.html 复制请保留原URL】

网友评论