精华内容
下载资源
问答
  • 3年以上经验Java开发面试题
    千次阅读
    2021-03-17 13:04:57

    一、Java基础

    1.1、基础知识

    1.1.1、int Integer区别

    1.1.2、wait sleep区别

    1.1.3、gbk转utf-8

    1.1.4、接口和抽象类区别

    1.2、并发编程

    1.2.1、volatile底层实现

    1.2.2、synchronized与lock底层实现,区别

    1.2.3、公平锁 非公平锁

    1.2.4、cas

    1.2.5、线程池

    1.2.6、juc并发包

    1.2.7、锁的升级

    1.2.8、ThreadLoacl如何实现的线程隔离

    1.2.9、ForkJoin如何实现的线程合并

    1.3、jdk源码

    1.3.1、HashMap&ConcurrentHashMap

    1.3.1.1、数据结构
    1.3.1.2、put流程
    1.3.1.3、两者区别有哪些
    1.3.1.4、1.7和1.8版本区别有哪些

    1.3.2、几种常见集合类的区别

    1.4、设计模式

    1.4.1、手写线程安全单例模式

    1.4.2、项目中用到的设计模式

    1.4.3、六种面向对象设计原则

    1.5、JVM

    1.5.1、垃圾回收

    1.5.1.1、可达性分析算法
    1.5.1.2、常见的垃圾回收算法
    1.5.1.3、垃圾收集器
    1.5.1.4、垃圾收集过程

    1.5.2、内存模型

    1.5.3、oom问题如何排查


    二、框架

    2.1、Spring

    2.1.1、IOC&AOP原理

    2.1.2、循环依赖问题

    2.1.3、普通对象和Bean的区别

    2.1.4、说说看过的相关源码

    2.2、Mybatis

    2.2.1、常用标签

    2.2.2、底层调用流程

    2.2.3、插件原理

    2.3、SpringMVC

    2.3.1、底层调用流程

    2.4、SpringBoot

    2.4.1、看过的源码

    2.4.2、和Spring的区别

    2.5、SpringCloud

    2.5.1、看过的源码

    2.5.2、sentinel和hystrix的区别

    2.6、Dubbo

    2.6.1、dubbo有几种降级策略

    2.6.2、dubbo都有哪些协议


    三、数据库

    3.1、MySQL

    3.1.1、索引结构及为什么要用这个结构

    3.1.2、索引失效

    3.1.3、sql优化

    3.1.4、索引类型

    3.1.5、分库分表策略如何优化能减少数据转移

    3.1.6、事务隔离级别及底层实现

    3.2、Redis

    3.2.1、数据类型

    3.2.2、项目中如何使用的

    3.2.3、持久化策略

    3.2.4、淘汰策略

    3.2.5、性能问题排查及优化

    3.2.6、redis做分布式锁

    3.2.7、如何保证原子操作

    3.2.8、底层数据结构

    3.2.9、哨兵模式和Cluster模式的区别


    四、分布式

    4.1、Raft协议

    4.1.1、选举流程

    4.1.2、数据同步流程

    4.1.3、项目中遇到的问题

    4.2、Nginx

    4.2.1、项目中的使用

    4.2.2、使用时配置文件中的关键字是什么

    4.3、分布式和集群的区别


    五、消息队列

    5.1、RabbitMQ&Kafka

    5.1.1、区别

    5.1.2、项目中的使用

    5.1.3、如何保证消息的可靠性(不丢失、不重复)


    六、搜索引擎

    6.1、Es和Solr区别


    七、容器化

    7.1、Docker

    7.1.1、项目中的使用

    7.2、K8s

    7.2.1、基本概念


    八、Linux

    8.1、常用的命令

    8.2、如何排查性能问题


    九、算法

    9.1、跳台阶

    9.2、求开方

    9.3、判断链表有环

    9.4、链表去重(空间O(n),时间O(1))

    9.5、数组取交集

    9.6、两个大文件取url交集,小内存机器

    9.7、斐波那契数列

    9.8、两个栈实现队列

    9.9、栈 取max 时间O(1)

    9.10、指定题目

    给出一个数组,数组的元素为整数,想对这个数组进行拆分,使拆分之后的数组元素之和接近N,如数组[19,17,16,1,2,1,2,3,4],使拆分之后的子数组之和接近或等于20,输出拆分之后的数据列表


    十、网络协议

    10.1、Http

    10.1.1、http是纯文本协议吗

    10.1.2、报文都有哪些内容

    10.1.3、后端怎么知道一个请求过来是ajax还是其他请求

    10.2、Https

    10.2.1、调用流程(详细)

    10.3、Tcp

    10.3.1、为什么要三次握手四次挥手

    10.3.2、如何保证传输过程的可靠性


    十一、其他

    11.1、领域驱动设计

    11.2、敏捷开发


    十二、总结

    以上是本人在2021年3月跳槽过程中遇到的真实面试题,能想起来的都整理在上面了,只是一个大纲,当然面试官会结合简历和项目来提问,每个问题具体问到多深,会延展到多广,就看你怎么聊了。

    这次跳槽面试最大的感觉就是各家公司对Java基础还是非常看重的,无论是几年经验,面的是大厂还是普通公司,基础这些东西还是要好好准备准备。当然这里说的Java基础,包括了常问的jdk源码、并发编程、JVM这些。而且大厂必考算法,我的算法比较弱,虽然也偶尔在leetcode上刷题,但毕竟算法这方面之前没太重视,还是吃了不少亏。

    另外简历中写的技术栈,不管项目中是否用过,一定至少是自己研究过再往简历上写,不然就是给自己挖坑。例如,简历中写了消息队列相关的技术栈,面试官一般会结合项目来问,首先看你有没有用过,具体是怎么用的,如果你在项目中没有用过,只是自己研究过,也一定要自己想个场景,并且给出思路来跟面试官聊,证明你虽然没有用过,但如果未来的工作中有需要,你是可以胜任的。

    对于某一项技术,会不会用只能表示你能不能用它干活,对于一个有经验的开发人员,快速入门一项技术是必备能力,这不是加分项。加分项是你有没有对某一个技术有过深入了解,能不能在面试的过程中,把你深入了解这项技术时掌握的学习能力给体现出来。如果面试官认为你的学习能力出众,并且有较强独立思考的能力,有什么难题你都有一套自己的方法论来解决,那你就有资格来谈薪了。

    平时多积累、多总结,总是没坏处的,我从去年年底开始写博客,虽然写的不多,质量也比较水,但每一篇博文对我自己来说都是一个归纳总结的过程,所以这次面试比较顺利。

    平时工作中注意通过解决问题来对一项技术积累深度,工作之余开阔视野来积累技术广度。当能够感觉自己进步的时候,是会对学习上瘾的。

    更多相关内容
  • 初级Java开发工程师面试题,不需要积分(免费下载),说明:上传文件中是资源的链接,大家直接访问。同时提供了PDF版本下载方式!
  • java开发面试题

    2018-12-19 10:43:49
    java基础和java高级全面知识整理,面试大全。
  • 2021年JAVA开发面试题.zip
  • 国能日新公司的java开发面试题,本人亲自经历面试的笔试题和面试整理的资料
  • 用于面试使用的JAVA面试题,包括JAVA学习的各个方面,从基础到框架
  • 2022年java开发面试题整理合集

    千次阅读 多人点赞 2022-01-12 14:17:32
    文章目录java基础知识面试题1. 面向对象的特征有哪些方面?2.什么是JDK,JDK 和 JRE 的区别是什么?3.== 和 equals()方法的区别?4.Java 有哪几种基本数据类型?5.访问修饰符 public,private,protected以及不写...

    java基础知识面试题

    1. 面向对象的特征有哪些方面?

    面向对象的特征有抽象、继承、封装和多态性。

    抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
    继承:继承是从现有类中得到继承信息来创建新类的过程,提供继承信息的类被称为父类,得到继承信息的类被称为子类。
    封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
    多态性:多态性允许不同子类型的对象对同一消息作出不同的响应,可分为编译时的多态性和运行时的多态性。

    2.什么是JDK,JDK 和 JRE 的区别是什么?

    JDK 是 Java Development ToolKit 的简称,也就是 Java 开发工具包。

    JRE是Java 运行时的环境和将要执行 Java 程序的虚拟机,同时包含了执行程序需要的浏览器插件。
    JDK是完整的 Java 软件开发工具包,包含了 JRE,可以让开发者开发、编译、执行 Java 应用程序。

    3.== 和 equals()方法的区别?

    ==的作用

    基本类型:比较的就是值是否相同
    引用类型:比较的就是地址值是否相同

    equals的作用

    引用类型:默认情况下,比较的是地址值。
    特:String、Integer、Date这些类库中equals被重写,比较的是内容而不是地址!

    ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较; equals():比较的是两个字符串的内容,属于内容比较。

    4.Java 有哪几种基本数据类型?

    整型有byte、short、int、long,浮点型有float、double,字符型有char、布尔型:boolean

    5.访问修饰符 public,private,protected以及不写(defualt)时的区别?

    Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问,支持 4 种不同的访问权限。

    1.private : 在同一类内可见,使用对象:变量、方法,不能修饰外部类
    2.default : 在同一包内可见,不使用任何修饰符,使用对象:类、接口、变量、方法。
    3.protected : 对同一包内的类和所有子类可见,使用对象:变量、方法,不能修饰外部类。
    4.public : 对所有类可见,使用对象:类、接口、变量、方法

    6.重载和重写的区别?

    重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

    重写: 发生在父子类中,方法名.参数列表必须相同,返回值范围小于等于父类,抛出的异 常范围小于等于父类, 访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

    7.this和super有什么区别?

    this:代表当前对象本身,super:代表当前对象的父类。

    8.String和StringBuffer、StringBuilder的区别?

    String 字符串常量
    StringBuffer 字符串变量(线程安全)
    StringBuilder 字符串变量(非线程安全)

    String 中的String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[] ,String对象是不可变的,也就可以理解为常量,线程安全。
    StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
    StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

    9.接口和抽象类的区别是什么?

    实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
    构造函数:抽象类可以有构造函数;接口不能有。
    main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
    实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
    访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符

    10.final、finally、finalize有什么区别?

    1.final可以修饰类、变量、方法,修饰类时表示该类不能被继承、修饰方法时表示该方法不能被重写、修饰变量时表示该变量是一个常量不能被重新赋值。
    2.finally一般作用在try-catch代码块中,在处理异常的时候,通常将一定要执行的代码放在finally代码块中。表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
    3.finalize是Object类的一个方法,它是用来实现垃圾回收的。在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。

    11.什么是单例模式?有几种?

    单例模式:某个类的实例在 多线程环境下只会被创建一次出来。

    单例模式有饿汉式单例模式、懒汉式单例模式和双检锁单例模式三种。

    饿汉式:线程安全,一开始就初始化。
    懒汉式:非线程安全,延迟初始化。
    双检锁:线程安全,延迟初始化。

    12.List 和 Map、Set 的区别

    List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合。

    List中存储的数据是有顺序的,并且值允许重复;
    Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
    Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

    13.List、Map、Set三个接口存取元素时,各有什么特点?

    List存取元素时有放入顺序,元素可以重复
    Map存取元素时按键值对存储,无放入顺序
    Set存取元素时元素无放入顺序,元素不可以重复

    14.说说常见的集合有哪些?

    1.Collection接口的子接口包括:Set 接口和List 接口;
    2.Map接口的实现类主要有:

    HashSet
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    依赖两个方法:hashCode()和equals()
    LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯一
    TreeSet
    底层数据结构是红黑树。(唯一,有序)
    1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

    3.Set接口的实现类主要有:

    HashSet
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    依赖两个方法:hashCode()和equals()
    LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯一
    TreeSet
    底层数据结构是红黑树。(唯一,有序)
    1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

    4.List接口的实现类主要有:

    ArrayList
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程不安全,效率高
    Vector
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程安全,效率低, 已给舍弃了
    LinkedList
    优点: 底层数据结构是链表,查询慢,增删快。
    缺点: 线程不安全,效率高

    15.BIO、NIO、AIO 有什么区别?

    BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
    NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
    AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

    16.Hashmap和hashtable ConcurrentHashMap区别?

    区别对比(HashMap 和 HashTable 区别)

    1、HashMap 是非线程安全的,HashTable 是线程安全的。
    2、HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。
    3、因为线程安全的问题,HashMap 效率比 HashTable 的要高。
    4、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线
    程环境,而 Hashtable 适合于多线程环境。一般现在不建议用 HashTable, ①
    是 HashTable 是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,
    现在也有同步的 ConcurrentHashMap 替代,没有必要因为是多线程而用
    HashTable。

    17.什么是线程池?为什么要用线程池?

    线程池:就是事先创建多个可执行的线程放入一个容器中,需要的时候从容器中获取而不用自行创建。线程使用完毕时不需要销毁线程而是放回容器中,从而减少创建和销毁线程对象的开销。

    使用线程池可以避免频繁地创建和销毁线程。
    使用线程池可以根据项目灵活地控制并发的数目。

    18.Java中sleep()方法和wait()方法有什么区别?

    sleep()方法和wait()方法都可以暂停线程的执行,区别在于:

    1.类的不同:sleep() 方法是Thread线程类的静态方法,wait()方法是Object类的方法。
    2.是否释放锁:sleep()方法不释放锁;wait()方法释放锁。
    3.用途不同:wait()方法通常用于线程之间的通信,sleep()方法通常用于暂停执行。
    4.用法不同:wait() 方法被调用后,超时之前线程不会自动苏醒,除非别的线程调用同一个对象上的 notify()方法或者notifyAll() 方法。sleep()方法执行完成后,线程会自动苏醒。

    19.ArrayList 和 LinkedList 有何区别?

    ArrayList支持随机访问而LinkedList不支持。
    ArrayList是通过数组来实现,插入和删除会受到元素位置的影响而会产生移位。
    LinkeList采用双向链表来存储数据,插入和删除不会受到元素位置的影响。
    ArrayLIst会预留一定的空间,数组实际空间小于存储的空间。
    linkedlist则不会预留空间,有元素添加才会去申请这个元素所对应的内存空间。
    ArrayList执行频繁的查找效率比LinkedList高。
    LinkedList执行频繁的插入和删除效率比Arraylist高

    20.Java常见异常有哪些?

    java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。

    java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.

    java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。

    java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。

    java.lang.ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。

    java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

    java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。

    java.lang.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

    java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。

    java.lang.InstantiationException:实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。

    java.lang.NoSuchFieldException:属性不存在异常。当访问某个类的不存在的属性时抛出该异常。

    java.lang.NoSuchMethodException:方法不存在异常。当访问某个类的不存在的方法时抛出该异常。

    ava.lang.NullPointerException:空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。

    ava.lang.NumberFormatException:数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

    java.lang.StringIndexOutOfBoundsException:字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。

    21.Java 中 IO 流分为几种?

    • 按照IO流的流向分,可以分为输入流和输出流
    • 按照IO流的操作单元划分,可以分为字节流和字符流
    • 按照IO流的实现功能划分,可以分为节点流和处理流

    22.Java中创建多线程有几种方法?

    • 继承Thread类并重写 run 方法创建线程,实现简单但不可以继承其他类
    • 实现Runnable接口并重写 run 方法。避免了单继承局限性,编程更加灵活,实现解耦。
    • 实现 Callable接口并重写 call 方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异
      常。
    • 使用线程池创建(使用java.util.concurrent.Executor接口)

    23. Runnable接口和Callable接口的区别?

    Runnable接口的run()方法无返回值,只能抛出运行时异常,且无法捕获处理。
    Callable接口的call()方法有返回值,允许抛出异常,可以获取异常信息。

    24.如何启动一个新线程、调用start和run方法的区别?

    线程对象调用run方法不开启线程。仅是对象调用方法。
    线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行

    调用start方法可以启动线程,并且使得线程进入就绪状态,而run方法只是thread的一个普通方法,还是在主线程中执行。

    25.线程有哪几种状态以及各种状态之间的转换?

    1. 第一是new->新建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
    2. 第二是Runnable->就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
    3. 第三是Running->运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
    4. 第四是阻塞状态。阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
      (1)等待 – 通过调用线程的wait() 方法,让线程等待某工作的完成。
      (2)超时等待 – 通过调用线程的sleep() 或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
      (3)同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
    5. 第五是dead->死亡状态: 线程执行完了或者因异常退出了run()方法,该线程结束生命周期
      在这里插入图片描述

    26。Java类加载器的流程

    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。

    7个阶段发生顺序如下图所示:
    在这里插入图片描述

    27.讲一下你对ioc容器的理解(Inverse of Control 控制反转)

    Spring提供了两种容器类型

    • BeanFactory
    • ApplicationContext

    BeanFactory

    基础类型IoC容器,提供完整的IoC服务支持,如果没有特殊指定,默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入。所以相对来说,容器启动初期速度较快(因为延迟初始化了),所需要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较适合的。但话说回来,Bean工厂对大多数应用来说往往太低级了,所以一般不使用

    ApplicationContext

    ApplicationContext是在BeanFactory的基础上构建的,是相对比较高级的容器实现,除了用于Bean工厂的所有支持,ApplicationContext还提供了其他高级用法,比如事件发布等

    ApplicationContext间接继承自BeanFactory

    28.Redis 的存储结构有哪些

    String,字符串,是 redis 的最基本的类型,一个 key 对应一个 value。是二进制安全的,最大能存储 512MB。

    Hash,散列,是一个键值(key=>value)对集合。string 类型的 field 和value 的映射表,特别适合用于存储对象。每个 hash 可以存储 232 -1 键值对(40 多亿)

    List,列表,是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列边或者尾部(右边)。最多可存储 232 - 1 元素(4294967295, 每个列表可存储 40 亿)

    Set,集合, 是 string 类型的无序集合,最大的成员数为 232 -1(4294967295, 每个集合可存储 40 多亿个成员)。

    Sorted set,有序集合,和 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数(score)却可以重复。

    29.SpirngBoot的好处

    (1)简化配置,不需要编写太多的xml配置文件
    (2)基于Spring构建,使开发者快速入门,门槛很低
    (3)SpringBoot可以创建独立运行的应用而不需要依赖于容器
    (4)内置tomcat服务器,不需要打包成war包,可以直接放到tomcat中运行
    (5)提供maven极简配置,以及可视化的相关监控功能,比如性能监控,应用的健康程度等
    (6)为微服务SpringCloud奠定了基础,使得微服务的构建变得简单
    (7)Spring可以整合很多各式各样的框架,并能很好的集成
    (8)活跃的社区与论坛,以及丰富的开发文档

    30.循环依赖碰到过吗?怎么解决

    什么是循环依赖

    当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖:
    ClassA -> ClassB -> ClassA

    ①构造器的循环依赖:这种依赖spring是处理不了的,直 接抛出BeanCurrentlylnCreationException异常。
    ②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖。
    ③非单例循环依赖:无法处理。

    展开全文
  • java中级面试题整理

    2018-06-15 11:27:59
    java中级面试题整理,自身经验遇到的问题整理,希望对您有帮助
  • 这是一个高级Java面试系列中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。1. 什么是可变参数?可变参数允许调用参数数量不同的方法。请看下面例子中的...

    这是一个高级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。

    1. 什么是可变参数?

    可变参数允许调用参数数量不同的方法。请看下面例子中的求和方法。此方法可以调用1个int参数,或2个int参数,或多个int参数。

    //int(type) followed ... (three dot's) is syntax of a variable argument.

    public int sum(int... numbers) {

    //inside the method a variable argument is similar to an array.

    //number can be treated as if it is declared as int[] numbers;

    int sum = 0;

    for (int number: numbers) {

    sum += number;

    }

    return sum;

    }

    public static void main(String[] args) {

    VariableArgumentExamples example = new VariableArgumentExamples();

    //3 Arguments

    System.out.println(example.sum(1, 4, 5));//10

    //4 Arguments

    System.out.println(example.sum(1, 4, 5, 20));//30

    //0 Arguments

    System.out.println(example.sum());//0

    }

    2. 断言的用途?

    断言是在Java 1.4中引入的。它能让你验证假设。如果断言失败(即返回false),就会抛出AssertionError(如果启用断言)。基本断言如下所示。

    private int computerSimpleInterest(int principal,float interest,int years){

    assert(principal>0);

    return 100;

    }

    3. 什么时候使用断言?

    断言不应该用于验证输入数据到一个public方法或命令行参数。IllegalArgumentException会是一个更好的选择。在public方法中,只用断言来检查它们根本不应该发生的情况。

    4. 什么是垃圾回收?

    垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。

    5. 用一个例子解释垃圾回收?

    比方说,下面这个方法就会从函数调用。

    void method(){

    Calendar calendar = new GregorianCalendar(2000,10,30);

    System.out.println(calendar);

    }

    通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。

    函数结束执行后,引用变量calendar不再有效。因此,在方法中没有创建引用到对象。

    JVM认识到这一点,会从堆中删除对象。这就是所谓的垃圾回收。

    6. 什么时候运行垃圾回收?

    垃圾回收在JVM突发奇想和心血来潮时运行(没有那么糟糕)。运行垃圾收集的可能情况是:

    堆可用内存不足

    CPU空闲

    7. 垃圾回收的最佳做法?

    用编程的方式,我们可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。

    当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。

    对象在被垃圾回收从堆上删除之前,会运行finalize()方法。我们建议不要用finalize()方法写任何代码。

    8. 什么是初始化数据块?

    初始化数据块——当创建对象或加载类时运行的代码。

    有两种类型的初始化数据块:

    静态初始化器:加载类时运行的的代码

    实例初始化器:创建新对象时运行的代码

    9. 什么是静态初始化器?

    请看下面的例子:static{ 和 }之间的代码被称为静态初始化器。它只有在第一次加载类时运行。只有静态变量才可以在静态初始化器中进行访问。虽然创建了三个实例,但静态初始化器只运行一次。

    /**

    * Java学习交流QQ群:589809992 我们一起学Java!

    */

    public class InitializerExamples {

    static int count;

    int i;

    static{

    //This is a static initializers. Run only when Class is first loaded.

    //Only static variables can be accessed

    System.out.println("Static Initializer");

    //i = 6;//COMPILER ERROR

    System.out.println("Count when Static Initializer is run is " + count);

    }

    public static void main(String[] args) {

    InitializerExamples example = new InitializerExamples();

    InitializerExamples example2 = new InitializerExamples();

    InitializerExamples example3 = new InitializerExamples();

    }

    }

    示例输出

    Static Initializer

    Count when Static Initializer is run is 0.

    10. 什么是实例初始化块?

    让我们来看一个例子:每次创建类的实例时,实例初始化器中的代码都会运行。

    /**

    * Java学习交流QQ群:589809992 我们一起学Java!

    */

    public class InitializerExamples {

    static int count;

    int i;

    {

    //This is an instance initializers. Run every time an object is created.

    //static and instance variables can be accessed

    System.out.println("Instance Initializer");

    i = 6;

    count = count + 1;

    System.out.println("Count when Instance Initializer is run is " + count);

    }

    public static void main(String[] args) {

    InitializerExamples example = new InitializerExamples();

    InitializerExamples example1 = new InitializerExamples();

    InitializerExamples example2 = new InitializerExamples();

    }

    }

    示例输出

    Instance Initializer

    Count when Instance Initializer is run is 1

    Instance Initializer

    Count when Instance Initializer is run is 2

    Instance Initializer

    Count when Instance Initializer is run is 3

    11. 什么是正则表达式?

    正则表达式能让解析、扫描和分割字符串变得非常容易。Java中常用的正则表达式——Patter,Matcher和Scanner类。

    12. 什么是令牌化?

    令牌化是指在分隔符的基础上将一个字符串分割为若干个子字符串。例如,分隔符;分割字符串ac;bd;def;e为四个子字符串ac,bd,def和e。

    分隔符自身也可以是一个常见正则表达式。

    String.split(regex)函数将regex作为参数。

    13. 给出令牌化的例子?

    private static void tokenize(String string,String regex) {

    String[] tokens = string.split(regex);

    System.out.println(Arrays.toString(tokens));

    }

    tokenize("ac;bd;def;e",";");//[ac, bd, def, e]

    14. 如何使用扫描器类(Scanner Class)令牌化?

    private static void tokenizeUsingScanner(String string,String regex) {

    Scanner scanner = new Scanner(string);

    scanner.useDelimiter(regex);

    List matches = new ArrayList();

    while(scanner.hasNext()){

    matches.add(scanner.next());

    }

    System.out.println(matches);

    }

    tokenizeUsingScanner("ac;bd;def;e",";");//[ac, bd, def, e]

    15. 如何添加小时(hour)到一个日期对象(Date Objects)?

    现在,让我们如何看看添加小时到一个date对象。所有在date上的日期操作都需要通过添加毫秒到date才能完成。例如,如果我们想增加6个小时,那么我们需要将6小时换算成毫秒。6小时= 6 * 60 * 60 * 1000毫秒。请看以下的例子。

    Date date = new Date();

    //Increase time by 6 hrs

    date.setTime(date.getTime() + 6 * 60 * 60 * 1000);

    System.out.println(date);

    //Decrease time by 6 hrs

    date = new Date();

    date.setTime(date.getTime() - 6 * 60 * 60 * 1000);

    System.out.println(date);

    16. 如何格式化日期对象?

    格式化日期需要使用DateFormat类完成。让我们看几个例子。

    //Formatting Dates

    System.out.println(DateFormat.getInstance().format(

    date));//10/16/12 5:18 AM

    带有区域设置的格式化日期如下所示:

    System.out.println(DateFormat.getDateInstance(

    DateFormat.FULL, new Locale("it", "IT"))

    .format(date));//marted“ 16 ottobre 2012

    System.out.println(DateFormat.getDateInstance(

    DateFormat.FULL, Locale.ITALIAN)

    .format(date));//marted“ 16 ottobre 2012

    //This uses default locale US

    System.out.println(DateFormat.getDateInstance(

    DateFormat.FULL).format(date));//Tuesday, October 16, 2012

    System.out.println(DateFormat.getDateInstance()

    .format(date));//Oct 16, 2012

    System.out.println(DateFormat.getDateInstance(

    DateFormat.SHORT).format(date));//10/16/12

    System.out.println(DateFormat.getDateInstance(

    DateFormat.MEDIUM).format(date));//Oct 16, 2012

    System.out.println(DateFormat.getDateInstance(

    DateFormat.LONG).format(date));//October 16, 2012

    17. Java中日历类(Calendar Class)的用途?

    Calendar类在Java中用于处理日期。Calendar类提供了增加和减少天数、月数和年数的简便方法。它还提供了很多与日期有关的细节(这一年的哪一天?哪一周?等等)

    18. 如何在Java中获取日历类(Calendar Class)的实例?

    Calendar类不能通过使用new Calendar创建。得到Calendar类实例的最好办法是在Calendar中使用getInstance() static方法。

    //Calendar calendar=new Calendar(); //COMPILER ERROR

    Calendar calendar = Calendar.getInstance();

    19. 解释一些日历类(Calendar Class)中的重要方法?

    在Calendar对象上设置日(day),月(month)或年(year)不难。对Day,Month或Year调用恰当Constant的set方法。下一个参数就是值。

    calendar.set(Calendar.DATE, 24);

    calendar.set(Calendar.MONTH, 8);//8 - September

    calendar.set(Calendar.YEAR, 2010);

    calendar get方法

    要获取一个特定日期的信息——2010年9月24日。我们可以使用calendar get方法。已被传递的参数表示我们希望从calendar中获得的值—— 天或月或年或……你可以从calendar获取的值举例如下:

    System.out.println(calendar.get(Calendar.YEAR));//2010

    System.out.println(calendar.get(Calendar.MONTH));//8

    System.out.println(calendar.get(Calendar.DATE));//24

    System.out.println(calendar.get(Calendar.WEEK_OF_MONTH));//4

    System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));//39

    System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//267

    System.out.println(calendar.getFirstDayOfWeek());//1 -> Calendar.SUNDAY

    20. 数字格式化类(Number Format Class)的用途?

    数字格式用于格式化数字到不同的区域和不同格式中。

    使用默认语言环境的数字格式

    System.out.println(NumberFormat.getInstance().format(321.24f));//321.24

    使用区域设置的数字格式

    使用荷兰语言环境格式化数字:

    System.out.println(NumberFormat.getInstance(new Locale("nl")).format(4032.3f));//4.032,3

    使用德国语言环境格式化数字:

    System.out.println(NumberFormat.getInstance(Locale.GERMANY).format(4032.3f));//4.032,3

    使用默认语言环境格式化货币

    System.out.println(NumberFormat.getCurrencyInstance().format(40324.31f));//$40,324.31

    使用区域设置格式化货币

    使用荷兰语言环境格式化货币:

    System.out.println(NumberFormat.getCurrencyInstance(new Locale("nl")).format(40324.31f));//? 40.324,31

    展开全文
  • 需要向java.sql.DriverManager请求并获得Connection对象 创建一个Statement对象 执行SQL语句 关闭JDBC对象 创建对象的四种方式? 1.使用new关键字创建对象 2.通过反射的方式 3.通过clone的方式 j4.通过反序列化的...

    1.连接数据库的配置和操作
    加载JDBC驱动程序
    提供JDBC连接的URL
    创建数据库的连接
    需要向java.sql.DriverManager请求并获得Connection对象
    创建一个Statement对象
    执行SQL语句
    关闭JDBC对象

    2.创建对象的四种方式?
    1.使用new关键字创建对象
    2.通过反射的方式
    3.通过clone的方式
    j4.通过反序列化的方式

    3.接口与抽象类的区别?
    一个类只能继承一个抽象类,但可以实现多个接口
    抽象类可以有构造器,但接口不能有构造器
    抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的
    抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的
    抽象类中的变量的访问类型可以任意,但接口中定义的变量只能是public static final类型

    4.==与equals的区别?
    基本数据类型:比较的值是否相等;
    引用数据类型:如String,==比较的是引用是否指向同一块内存;euqals被重写了,比较的是引用指向内存中的值是否相等

    5.String、StringBuffer和StringBuilder的区别?
    String 大小固定,不可变
    StringBuffer 大小可变,线程安全(有锁),同步,效率低,适用于多线程,低并发
    StringBuilder 大小可变,线程不安全(无锁),不同步,效率高,适用于单线程,高并发

    6.List问题汇总
    ArrayList 底层数组,在查找元素的时候效率高(每个元素都有对应的索引),线程非安全,不同步
    LinkedList 基于双向链表,在插入和删除元素的时候效率高(链表不需要内存移位)线程非安全,不同步
    Vector 线程安全,同步,操作与ArrayList类似

    7.HashMap和HashTable的区别?
    (1)hashMap同步,hashTable不同步,都非安全
    (2)hashTable的key和value都不允许null,hashMap允许
    (3)HashTable使用Enumeration进行遍历,HashMap使用Iterator进行遍历
    (4)HashTable直接使用对象的hashCode,hashmap重新计算hash值

    8.介绍泛型
    泛型:数据类型参数化
    泛型类:类名{}
    泛型接口:接口名{}
    泛型方法:访问修饰符 返回值类型 方法名称(){}

    <?>不确定的数据类型,是实参

    受限泛型<? extends E>,只能填写E或者E的子类,确定上限
    <? super E>,只能填写E或者E的父类,确定下限
    泛型擦拭:.java–>.class,泛型会被消除掉,这个过程叫做泛型擦拭。(JVM不认识泛型)
    泛型的作用:1.提高java程序的类型安全 2.消除强制类型转换 3.提高了代码的复用性

    9.Throw和Throws的区别?
    Throw 用来抛出一个具体的异常类型。
    Throws 用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用就抛给谁。

    10.进程和线程的区别?
    进程是系统进行资源分配和调度的最小单位
    线程是CPU调度和分派的基本单位
    一个进程包含一个或多个线程
    进程在执行过程中拥有独立的内存单元,而多个线程共享内存
    线程执行开销小,但不利于资源的管理和保护;进程则相反
    线程有6种状态:新建,运行(可运行),阻塞,等待,计时等待和终止。

    11.创建线程的四种方式?
    继承Thread类,重写run方法
    实现Runnable接口
    实现Callable接口

    12.Callable和Runnable的区别:
    Runnable接口不会返回结果和抛出异常,Callable接口可以返回结果和抛出异常。
    通过线程池来创建线程

    13.sleep和wait的区别?
    sleep()方法是Thread类的静态方法,而wait()方法是object类的方法
    调用sleep()方法并不会释放锁。而wait()方法会
    wait()方法必须放在同步方法和同步块中使用,sleep()方法则可以放在任何地方使用。
    sleep()方法必须捕获异常,而wait()不需要捕获异常

    14.synchronized 底层实现原理?
    方法和代码块被synchronized修饰后,同一时刻只有一个方法可以进入到临界区
    synchronized会阻止其它线程获取当前对象的监控锁,这样synchronized修饰的代码块就无法被其它线程访问,也就无法并发执行
    synchronized还会保证所有操作结果都会直接刷到主存中,从而保证了内存可见性

    15.volatile底层实现原理?
    volatile只能修饰变量,不能修饰方法和代码块
    volatile保证可见性
    使用volatile之后,变量在被修改后可以立即同步到主内存,变量每次在使用之前都从主内存拷贝。所以其他线程可以立马看到变量的更新

    volatile保证有序性。volatile可以禁止指令重排,CPU会严格按照代码顺序执行。
    volatile不能保证原子性

    原子性是指一个操作是不可中断的,要全部执行完成,要不就都不执行
    CPU有时间片的概念,当一个线程时间片耗尽之后,就会失去CPU使用权。所以在多线程场景下,由于时间片在线程间轮换,就会发生原子性问题。

    16.线性安全的
    Vector:只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性
    Hashtable:使用了synchronized关键字,所以相较于Hashmap是线程安全的。
    ConcurrentHashMap:使用锁分段技术确保线性安全,是一种高效但是线程安全的集合。
    Stack:栈,也是线程安全的,继承于Vector。

    17.线性不安全的
    Hashmap
    Arraylist
    LinkedList
    HashSet
    TreeSet
    TreeMap

    18.Synchronized和Lock的区别?
    Synchronized是关键字,Lock是接口。
    Synchronized会自动释放锁。Lock异常时不会自动释放锁,所以需要在finally中释放锁。
    Synchronized是非中断锁,必须等待线程执行完成释放锁,Lock是可中断锁。
    Synchronized在竞争不激烈的情况下性能更好。Lock功能更强大灵活,竞争激烈时性能较好

    19.实现线程同步的方式?
    1.使用Synchronized关键字修饰的同步方法方法或同步代码块实现线程同步
    2.使用volitile关键字修饰的特殊域变量实现线程同步
    3.使用重入锁实现线程同步
    4.使用局部变量实现线程同步

    20.Sql优化
    查询使用适当的索引
    避免空判断语句
    避免左侧模糊查询
    避免使用in 用exists代替
    避免使用or 和 不等于条件查询
    避免在 where 子句中对字段进行表达式操作和函数操作
    尽可能的使用 varchar 代替 char
    避免使用"*"返回所有,可以用具体的字段代替
    上述会导致数据库引擎放弃索引进行全表扫描

    21.什么是索引及其类型与种类?
    索引是表的目录,是数据库中专门用于帮助用户快速查询数据的一种数据结构(就像新华字典的目录一样)
    类型:BTREE、RTREE、HASH、FULLTEXT
    种类:普通索引、唯一索引、主键索引、全文索引、组合索引
    哪些情况适合使用索引?
    数据量较大的表、
    经常查询的字段、
    主键和做外键的字段、
    经常与其他表连接的表中连接字段、
    经常做排序的字段、
    经常用在where子句、order by、group by的字段

    22.哪些情况不适合使用索引?
    查询很少使用的情况不适合建立索引;
    经常增、删、改的字段不适合建立索引;
    当数据过少的时候不适合建立索引;
    定义为text, image和bit数据类型的列不适合建立索引

    23.聚集索引和非聚集索引的区别?
    聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
    聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续
    聚集索引物理存储按照索引排序,而非聚集索引物理存储不按照索引排序

    24.什么是事务及其属性?
    事务包含一个或多个操作,这些操作如果都成功就全部提交;如果有一条失败,则全部回滚
    事务的属性:
    原子性:事务开始后的所有操作要么全部执行,要么全部回滚
    一致性:事务开始前和结束后,数据库的完整性没有被破坏,数据处于一致状态
    隔离性:并发的不同事务之间不能互相干扰
    隔离级别:读未提交、读已提交、可重复读、串行化
    持久性:事务提交后,对数据库的改变是永久的

    25.事务的并发问题?
    脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
    不可重复读 :事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致
    幻读 :事务A将数据库分数改为等级,事务B在此期间插入一条分数数据,插入的这条数据没有改过来
    乐观锁和悲观锁
    悲观锁:在操作数据之前把数据锁住,然后再对数据读写,在释放锁之前其他不能对该数据进行操作
    乐观锁:在操作数据时不会对操作的数据进行加锁,只有到数据提交的时候才通过一种机制来验证数据是否存在冲突(一般实现方式是通过加版本号然后进行版本号的对比方式实现)

    26.TCP和UDP的区别?
    TCP是基于连接的可靠的传输协议,UDP是基于广播的不可靠的传输协议.
    TCP保证数据的正确性,同时保证数据的顺序,UDP有可能丢包,同时不保证数据的顺序
    TCP是面向字节流的,他把数据看成一串无结构的二进制数据,UDP是通过报文传递数据的
    TCP是点对点连接的,只能是一对一的,UDP可以是一对一的,一对多的,多对一的,多对多的

    27.GET提交和POST提交的区别?
    GET将表单数据追加在提交地址的后面进行提交,提交速度快,提交的数据有大小的限制
    POST将表单数据作为一个整体的数据块进行提交,提交速度慢,提交的数据大小没有限制

    28.重定向和转发的区别?
    重定向:重新发起一次新的请求/响应来完成页面的跳转,不能带数据,浏览器的URL会发生变化
    转发:使用现有的请求/响应来完成页面的跳转,可以带数据,浏览器的URL不会发生变化
    常用的选择器
    id选择器、元素选择器、类选择器、后代选择器、子元素选择器、兄弟选择器

    29.常见错误代码及含义?
    400 错误请求
    403 禁止访问
    404 无法找到文件
    408 请求超时
    500 服务器错误

    30.JSP九大内置对象、七大动作与三大指令?
    内置对象:request、response、session、application、out、page、pageContext、config和exception
    动作:jsp:include、jsp:useBean 、jsp:setProperty、jsp:getProperty、jsp:forward、jsp:plugin、jsp:param
    指令:Page指令、include指令、taglib指令
    排序算法

    n:数据规模;k:"桶"的个数;In-place:占用常数内存,不占用额外内存;Out-place:占用额外内存;
    1.冒泡排序

    2.选择排序

    3.插入排序

    4.希尔排序
    5.归并排序
    6.快速排序

    7.堆排序
    8.计数排序
    9.桶排序
    10.基数排序
    JVM GC回收机制

    HashMap的底层及扩容机制?
    31.Spring
    介绍及优点:
    Spring一个轻量级的Java 开发框架,Spring的核心是控制反转(IoC)和面向切面(AOP)

    1.方便解耦,简化开发 (高内聚低耦合)
    Spring就是一个大工厂(容器),可以将所有对象的创建和依赖关系,交给Spring容器管理
    2.支持AOP
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
    3.方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架

    32.IOC:
    Spring作为容器,负责生成bean的实例和对bean的依赖注入
    三种注入方法:
    构造方法注入、setter方法注入、注解注入

    33.AOP:
    Aop是面向切面编程,是通过动态代理的方式,
    在不改变原有代码的情况下对类的功能进行无限的增强
    主要的功能有:添加日志,事务,权限
    特点是:降低模块间的耦合度、提高可维护性

    34.SpringMVC
    介绍springMVC,说一下优点
    springmvc是一个基于MVC的轻量级Web框架,能够完成前后台的交互
    Model 业务层 = Service层 + Dao层
    View 显示层 表现层 前台的页面表现(jsp页面)
    Controller层 控制层 前台页面与后台代码之间的数据的交互(Servlet)

    优点:耦合性低、与Spring框架集成、简化JSP开发、支持Restful风格

    35.MyBatis
    介绍MyBatis
    ORM框架 DAO层
    对象关系映射框架,以面对对象的方式完成对数据库的操作
    类 --> 表
    属性 --> 字段
    实例 --> 记录
    MyBatis中#和KaTeX parse error: Expected 'EOF', got '#' at position 5: 区别? #̲{}是预编译处理,防止SQL注…{}是字符串替换。

    36.注解
    注解是说明程序的,给计算机看的。JDk 1.5之后的新特性,可以声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明、注释

    作用:安全性考虑 减少内存泄露 减少程序员工作量。

    展开全文
  • java中高级面试题十大总结 java中高级面试题十大总结 java中高级面试题十大总结 java中高级面试题十大总结
  • 交通银行Java专业面试题
  • 腾讯java开发面试题

    千次阅读 2019-05-15 21:27:59
    腾讯java开发面试题 1、抽象类和接口的区别(让说7个点) (关键字、方法的默认实现、方法的修饰、添加方法、构造器、继承实现、类加载、main方法) ...2、判断对象相等(equals、hashcode) 3、string\...
  • 3-5年经验Java开发面试题精选

    千次阅读 2021-01-12 19:00:54
    3-5年经验Java开发面试题精选
  • 最全华为java面试题(含答案详细讲解),面试套路,流程,技术点的宽度,广度都有基本的方向,但愿对各位有所帮助
  • java 架构、中高级10+份面试题和答案;精选;不断迭代增加;文档定期维护更新;附件为百度云盘下载链接.
  • 最常见的Java面试题及答案汇总(一)和Java高级面试题整理(附答案),值得拥有,真的值得拥有,真的值得拥有,真的值得拥有。
  • java面试题 IBM,交通银行等一些外包的面试题,(8K左右)
  • 1.线程的生命周期? 新建 ,就绪 ,运行 ,阻塞 ,死亡,当运行中的线程遇到其他因素,线程会进入阻塞状态,解除阻塞状态,线程进入到就绪状态,从新运行. 2.常见的 集合类型和特点 3.什么是mybatis:什么是ORM思想 ...
  • 2014java开发面试题

    2015-01-09 09:52:39
    2014年的java面试题,共两份,自己整理的
  • Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。 Java中级面试永远是程序员...
  • 面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
  • 史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有...
  • java相关面试题.zip

    2019-12-14 20:32:55
    115个Java面试题和答案——终极(上.pdf 115个Java面试题和答案——终极(下.pdf Android面试题大全.pdf Hibernate面试题分析.pdf JavaWeb面试题.pdf Java程序员的10道XML面试题.pdf java面试题.pdf Java面试...
  • Java后端面试题

    2017-06-11 20:55:33
    2017Java最新面试题
  • JAVA开发常见面试题

    千次阅读 2022-03-25 19:32:30
    JAVA后端常见面试题 一.Java语言 1.HashMap底层原理(源码必看!)扩展:jdk1.7和1.8有什么改进?为什么长度大于8转换成红黑树?这个8怎么来的? 2.ArrayList底层原理,ArrayList和Vector的区别,LinkedList和...
  • 牛客网精心整理的面试题,主要包括java基础,mysql,数据结构与算法,集合,多线程,spring,javaee
  • 分享面试的学习文档,pdf格式。包括list、set、hashSet、hashMap、引用、反射、cloneable、wait、sleep...等知识点。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 182,963
精华内容 73,185
关键字:

java开发面试题

java 订阅
友情链接: LightGame.rar