• java基础面试题


    第一部分(基础)

    一、JDK 和 JRE 有什么区别?

    1、JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。

    2、JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境

    具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

    二、 final 在 java 中有什么作用?

    1、final 修饰的类叫最终类,该类不能被继承。

    2、final 修饰的方法不能被重写。

    3、final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

    三、java 中的 Math.round(-1.5) 等于多少?

    等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

    四、String 属于基础的数据类型吗?

    String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

    五、 java 中操作字符串都有哪些类?它们之间有什么区别?

    操作字符串的类有:String、StringBuffer、StringBuilder。

    1、String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

    2、StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

     

    六、String str="i"与 String str=new String("i")一样吗?

    不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中

    七、如何将字符串反转?

    使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

    示例:

    八、String 类的常用方法都有那些?

    1、indexOf():返回指定字符的索引

    2、charAt():返回指定索引处的字符

    3、replace():字符串替换

    4、trim():去除字符串两端空白

    5、split():分割字符串,返回一个分割后的字符串数组。

    6、getBytes():返回字符串的 byte 类型数组

    7、length():返回字符串长度

    8、toLowerCase():将字符串转成小写字母

    9、toUpperCase():将字符串转成大写字符

    10、substring():截取字符串

    11、equals():字符串比较

    抽象类必须要有抽象方法吗?

    不需要,抽象类不一定非要有抽象方法

    示例:

    十、普通类和抽象类有哪些区别?

    1普通类不能包含抽象方法,抽象类可以包含抽象方法

    2抽象类不能直接实例化,普通类可以直接实例化

    十一、接口和抽象类有什么区别?

    1、实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口

    2、构造函数:抽象类可以有构造函数;接口不能有

    3main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main方法

    4、实现数量:类可以实现很多个接口;但是只能继承一个抽象类

    5、访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问 修饰符

    十二、 java 中 IO 流分为几种?

    按功能来分:输入流(input)、输出流(output

    按类型来分:字节流和字符流。

    十三、 BIO、NIO、AIO 有什么区别?

    1、BIOBlock IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低

    2、NIONew IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用

    3、AIOAsynchronous IO NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制

    十四、 Files的常用方法都有哪些?

    1、Files.exists():检测文件路径是否存在

    2、Files.createFile():创建文件

    3、Files.createDirectory():创建文件夹

    4、Files.delete():删除一个文件或目录

    5、Files.copy():复制文件

    6、Files.move():移动文件

    7、Files.size():查看文件个数

    8、Files.read():读取文件

    9、Files.write():写入文件

    10、

    第二部分(容器)

     

    十五、 java 容器都有哪些?

    常用容器的图录:

    十六、Collection 和 Collections 有什么区别?

    1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有ListSet

    2、Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作

    十七、List、Set、Map 之间的区别是什么?

    十八、HashMap 和 Hashtable 有什么区别

    1、hashMap去掉了HashTable contains方法,但是加上了containsValue()和containsKey()方法

    2、hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高

    3、hashMap允许空键值,而hashTable不允许

    十九、说一下 HashMap 的实现原理?

    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体

    当我们往Hashmapput元素时,首先根据keyhashcode重新计算hash,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上

    需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)O(logn)

    二十、说一下 HashSet 的实现原理?

    1、HashSet底层由HashMap实现

    2、HashSet的值存放于HashMapkey

    3、HashMapvalue统一为PRESENT

    二十一、如何实现数组和 List 之间的转换

    1、List转换成为数组:调用ArrayListtoArray方法

    2、数组转换成为List:调用ArraysasList方法

    二十二、Array 和 ArrayList 有何区别?

    1、Array可以容纳基本类型和对象,而ArrayList只能容纳对象

    2、Array是指定大小的,而ArrayList大小是固定的

    3、Array没有提供ArrayList那么多功能,比如addAllremoveAlliterator

    二十三、在 Queue 中 poll()和 remove()有什么区别?

    poll() remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常

    二十四、哪些集合类是线程安全的?

    1vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

    2statck:堆栈类,先进后出。

    3hashtable:就比hashmap多了个线程安全。

    4enumeration:枚举,相当于迭代器。

    二十五、迭代器 Iterator 是什么?

    迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小

    第三部分(多线程)

    十六、并行和并发有什么区别?

    1、并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

    2、并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

    3、在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

    所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能

    二十七、 线程和进程的区别?

    简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行

    二十八、 守护线程是什么?

    守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程

    二十九、线程有哪些状态?

    1创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

    2就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

    3运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

    4阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspendwait等方法都可以导致线程阻塞。

    5死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪   

    三十、在 java 程序中怎么保证多线程的运行安全?

    线程安全在三个方面体现:

    1原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);

    2可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);

    3有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)

    第四部分(Java Web

    三十一、jsp 和 servlet 有什么区别?

    1jsp经编译后就变成了Servlet.JSP的本质就是ServletJVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

    2jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

    3Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

    4JspServlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

    三十二、jsp 有哪些内置对象作用分别是什么?

    JSP9个内置对象:

    request:封装客户端的请求,其中包含来自GETPOST请求的参数;

    response:封装服务器对客户端的响应;

    pageContext:通过该对象可以获取其他对象;

    session:封装用户会话的对象;

    application:封装服务器运行环境的对象;

    out:输出服务器响应的输出流对象;

    configWeb应用的配置对象;

    pageJSP页面本身(相当于Java程序中的this);

    exception:封装页面抛出异常的对象。

    三十三、说一下 jsp 的 4 种作用域?

    JSP中的四种作用域包括pagerequestsessionapplication,具体来说:

              page代表与一个页面相关的对象和属性。

    request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。

    session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。

    application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

    三十四、说一下 session 的工作原理?

    其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了

    第五部分(异常)

    三十五、常见的异常类有哪些?

    NullPointerException:当应用程序试图访问空对象时,则抛出该异常。

    SQLException:提供关于数据库访问错误或其他错误信息的异常。

    IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 

    NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

    FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。

    IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。

    ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。

    ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。

    IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。

    ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。 

    NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。

    NoSuchMethodException:无法找到某一特定方法时,抛出该异常。

    SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。

    UnsupportedOperationException:当不支持请求的操作时,抛出该异常。

    RuntimeExceptionRuntimeException:是那些可能在Java虚拟机正常运行期间抛出的异常的超类

    第六部分(网络)

    三十六、OSI 的七层模型都有哪些?

    1应用层:网络服务与最终用户的一个接口。

    2表示层:数据的表示、安全、压缩。

    3会话层:建立、管理、终止会话。

    4传输层:定义传输数据的协议端口号,以及流控和差错校验。

    5网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。

    6数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。

    7物理层:建立、维护、断开物理连接

    三十七、get 和 post 请求有哪些区别?

    1GET在浏览器回退时是无害的,而POST会再次提交请求。

    2GET产生的URL地址可以被Bookmark,而POST不可以。

    3GET请求会被浏览器主动cache,而POST不会,除非手动设置。

    4GET请求只能进行url编码,而POST支持多种编码方式。

    5GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

    6GET请求在URL中传送的参数是有长度限制的,而POST么有。

    7对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

    8GETPOST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

    9GET参数通过URL传递,POST放在Request body

    三十八、java的八大数据基本类型
    整型:byte, short, int, long

    字符型:char

    浮点型:float, double

    布尔型:boolean

    三十九、HTTP请求方式中8种请求方法(简单介绍)

    1options

    返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性

    2head

    向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。

    3GET

    向特定的资源发出请求。注意:GET方法不应当被用于产生副作用的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_linkweb_url

    4POST

    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form

    5PUT

    向指定资源位置上传其最新内容

    6DELETE

    请求服务器删除Request-URL所标识的资源

    7TRACE

    回显服务器收到的请求,主要用于测试或诊断

    8connect

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

    四十、java线程池threadpoolexecute支持的队列类型

    SynchronousQueue,

    LinkedBlockingDeque,

    ArrayBlockingQueue

    四十一、AOP的五种通知方式:

    前置通知:在我们执行目标方法之前运行(@Before

    后置通知:在我们目标方法运行结束之后,不管有没有异常(@After

    返回通知:在我们的目标方法正常返回值后运行(@AfterReturning

    异常通知:在我们的目标方法出现异常后运行(@AfterThrowing

    环绕通知:目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法的代码 。环绕通知可以控制返回对象(@Around)

    四十二、Spring中的bean的作用域有哪些?

    1singleton:唯一bean实例,Spring中的bean默认都是单例的。

    2prototype:每次请求都会创建一个新的bean实例。

    3request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTPrequest内有效。

    4session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTPsession内有效。

    5global-session:全局session作用域,仅仅在基于portletweb应用中才有意义,Spring5已经没有了

  • 相关阅读:
    leetcode 1. Two Sum
    leetcode 168. Excel Sheet Column Title
    [LeetCode] Water and Jug Problem 水罐问题
    leetcode 80 Remove Duplicates from Sorted Array II
    leetcode 239. Sliding Window Maximum
    文件处理
    python网络编程 之 twisted
    ICMP & ping & traceroute
    Java String 转整形
    Java 字符数字得到整数
  • 原文地址:https://www.cnblogs.com/guoweijie/p/13638470.html
Copyright © 2020-2023  润新知