龙空技术网

Java高级工程师必会知识之JavaSE(上)

安淘今 173

前言:

眼前小伙伴们对“javaseapi”可能比较关注,咱们都需要了解一些“javaseapi”的相关资讯。那么小编也在网摘上收集了一些有关“javaseapi””的相关知识,希望你们能喜欢,小伙伴们快快来学习一下吧!

Java高级工程师必会知识之JavaSE(上)Java高级工程师必会知识之JavaSE(中)Java高级工程师必会知识之JavaSE(下)Java高级工程师必会知识之JavaWEBJava高级工程师必会知识之MySQL一、课程简介

对JavaSE、JavaWEB、MySQL阶段中可能出现的面试题进行重点讲解,包含:技能点要求、哪里会出现面试题,以什么样的形式出现等;

注意:面试题多来源于求职者的真实面试题,部分知识属于课程之外的内容,不要求所有同学都会,建议想拿高薪的同学去学习。

二、JavaSE

求职技能要求:熟练掌握JavaSE语法,熟练使用JavaSE的常用API。

在面试中一般不会考核JavaSE语法和常用API的用法(除非面试官招聘的是实习生),但是会问到一些偏理论的知识,比如:常见集合的内部数据结构,以及部分API的底层原理等,主要是考核应聘者的Java功底是否扎实。

Tips:面试的时候,大致有这样的规律,越是大型的互联网公司越容易问到底层原理和数据结构,未来如果我们想跳槽到大厂,那么一定要在底层原理和数据结构上下功夫。

(一)Java的基础概念1. 面向对象的特征

技能要求:深入理解Java的面向对象思想。

封装 继承 多态 (抽象)。

2. Java的基本数据类型有哪些

面试频次:中,属于基础必须知识,在中小企业面试时比较常见。

byte(2) short(2) int(4) long(8) char(2) boolean float(4) double(8)

Tips:boolean类型代表了1个字节的信息(true或者false),但是没有给出精准的字节数。《Java虚拟机规范》给出了boolean类型占4个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

3. Java中==和equals的区别

面试频次:中,在中小企业面试时比较常见。

== : 它的作用是判断两个对象的地址是不是相等。即:判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。

equals : 它的作用也是判断两个对象是否相等,但它一般有两种使用情况,如下:

情况1:类没有覆写equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

情况2:类覆写了equals() 方法。若它们的内容相等,则返回 true (即,认为这两个对象相等)。

4. String、StringBuffer、StringBuilder三者之间的区别

面试频次:中,基础必备知识。

可变性:

String类中使用final关键字字符数组保存字符串,private final char value[],所以String对象是不可变的,而StringBuilder与 StringBuffer是可变的。

线程安全性:

String中的对象是不可变的,因此是线程安全的。StringBuffer对方法加了同步锁是线程安全的,StringBuilder是非线程安全的。

性能:

每次对String类型进行改变的时候,都会生成一个新的String对象,因此性能最低。而StringBuffer和StringBuilder的修改则是对本身进行操作,而不是生成新的对象,因此性能较高。

StringBuilder相比StringBuffer能获得 10%~15% 左右的性能提升,但线程不安全。

对于三者使用的总结:

1. 操作少量的数据 => 使用String

2. 单线程操作字符串缓冲区下操作大量数据 => 使用StringBuilder

3. 多线程操作字符串缓冲区下操作大量数据 => 使用StringBuffer

5. JDK8的新特性

面试频次:中。

Java8发布于2014年3月18号,新增了非常多的特性,要求面试时能说出如下几点即可:

① Lambda表达式

Lambda允许把函数作为一个方法的参数。

1.   new Thread(()-> System.out.println("abc")).start();

② 方法引用

方法引用允许直接引用已有Java类或对象的方法或构造方法。

1.  ArrayList<String> list = new ArrayList<>();2.         list.add("a");3.         list.add("b");4.         list.add("c");5.         list.forEach(System.out::println);

上例中我们将System.out::println方法作为静态方法来引用。

③ 函数式接口

有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为Lambda表达式。通常函数式接口上会添加@FunctionalInterface注解。

④ 接口允许定义默认方法和静态方法

从JDK8开始,允许接口中存在一个或多个默认非抽象方法和静态方法。

⑤ Stream API

新添加的Stream API(java.util.stream)把真正的函数式编程风格引入到Java中。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。

1.  List<String> list = Arrays.asList("abc", "", "abc", "bc", "efg", "abcd", "def", "jkl");2. 3.         list.stream()//获取集合的流对象4.                 .filter(string -> !string.isEmpty())//对数据进行过滤操作,过滤掉空字符串5.                 .distinct()//去重6.                 .forEach(a -> System.out.println(a));

⑥ 日期/时间类改进

之前的JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commons-lang包等。不过JDK8出现之后这个改观了很多,比如日期时间的创建、比较、调整、格式化、时间间隔等。

这些类都在java.time包下,LocalDate/LocalTime/LocalDateTime。

⑦ Optional 类

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

1.  String string = "abc";2. 3.         Optional<String> optional = Optional.of(string);4.         boolean present = optional.isPresent();5.         String value = optional.get();6.         System.out.println(present+"/"+value);

⑧ Java8 Base64实现

Java 8 内置了 Base64 编码的编码器和解码器。

(二)Java的异常体系1. Java的异常体系

技能要求:熟练掌握Java的异常体系。

面试频次:中。(翻译成大白话:能够知道Java中异常的分类以及相互之间的关系,能够使用try-cath-finally进行异常的捕获操作。)

复习建议:通过源码去查看Java中异常的继承关系,同时需要理解并记忆下面一段话。

Java中异常体系的顶级父类是Throwable,它有两个子类,Error和Exception,其中Error是严重的错误(一般是底层或内存等方面的错误),该类错误不需要在方法上throws更不需要catch,这种错误是不应该出现的异常,常见的有StackOverflowError和OutOfMemoryError。另外一个Exception是我们开发时需要处理的异常,子类众多,可以分为运行时异常(RuntimeException)和编译时异常(CheckedException)。

运行时异常指编译器编译时不进行强制检查的异常,但是在运行时可能发生的异常,比如:NullPointerException、IndexOutOfBoundsException、ClassNotFoundException。

编译时异常是指编译器在编译时就会强制检查,必须在方法上throws或者方法中catch的异常。

Tips:为了代码的健壮性,不管是运行时异常还是编译时异常,在写代码时都需要避免或进行异常处理。

Java异常体系结构图

Throwable类的两个子类

Error类注解

Exception类注解

RuntimeException类注解

2. throws和throw的区别

throws用在方法的签名上,代表了当前方法可能会抛出哪些异常,调用该方法时需要进行异常处理,throw用在方法之内,代表对外抛出一个具体的异常对象。

(三)Java的集合体系1. 整体介绍Java的集合体系

技能要求:熟练掌握Java的集合体系。

面试出现频次:高。

集合分为单列集合和双列集合,单列集合的顶级接口是Collection(虽然Collection继承了Iterator),它有两个常见的子接口Set和List。Set子类中最常见的是HashSet、LinkedHashSet、TreeSet。List子类中最常见的是ArrayList、LinkedList、Vector(很少用)。

双列集合的顶级接口是Map,它有三个常见的实现类,HashMap、LinkedHashMap、TreeMap。

集合体系框架图

2. ArrayList、Vector、LinkedList的区别

面试出现频次:高。

ArrayList底层是数组结构,数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就将已有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动,代价比较高。因此,它适合查找和遍历,不适合插入和删除。

Vector和ArrayList一样,也是通过数组实现的,不同的是它是线程安全的,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。当集合中元素的数目大于当前集合数组的长度时,Vector增长率为当前数组长度的100%,而Arraylist增长率为当前数组长度的50%。

LinkedList是用链表结构存储数据的,很适合做数据的插入和删除操作,但是访问和遍历比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

3. HashMap的底层数据结构

面试出现频次:非常高。

HashMap底层包含了很多知识点,很考验程序员的基本功,被问到的概率很高,强烈建议大家对其源码进行更多的了解。

Tips:

1. 看HashMap的源码时不要将整个类从头到尾依次去看,而是从构造函数和主要方法(put、get)进入查看。

2. 或者,可以先看一些关于HashMap源码的文章,然后再查源码对别人文章中的核心观点进行验证。

3. 看源码时不需要将每一行代码都读懂,主要是看关键代码的实现即可。

HashMap底层数据结构

参考话术:

HashMap的底层数据结构为数组+链表或红黑树结构,当链表长度大于8时会升级为红黑树,当红黑树节点小于6时又会退化为链表。

当调用HashMap的空参构造函数的时候,HashMap仅仅将默认的加载因子常量DEFAULT_LOAD_FACTOR=0.75赋值给了loadFactory成员变量。

当第一次调用put(k,v)方法的时候,HashMap会创建一个默认容量为DEFAULT_INITIAL_CAPACITY=16的数组,类型为Node<k,v>,Node本身是链表结构,且是单向链表。然后HashMap会根据k,通过自有的hash函数计算出hash值,然后取hash值的低四位,这样就得到一个介于0-15之间的数值作为要把数据放到数组的角标,但是当k为null的时候,HashMap会把数据放到数组的第一个位置。

如果继续put数据,出现k的hash值和已有数据相同的情况,则把该节点作为当前数组位置上节点的后一个节点即可,这就构成了单向链表结构。如果这个链表长度大于等于8,则把该链表通过treeifyBin函数转化为红黑树结构。(因为红黑树的查询效果比链表要高)。

当put的数据超过DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR = 16*0.75 = 12时,HashMap会进行第一次扩容,每次扩容是按照2倍递增进行的。扩容后,会重新将节点的位置进行打散存放。

HashMap扩容时链表或树的重新分布

4. HashMap、Hashtable、ConcurrentHashMap的区别

① HashMap是线程不安全的,Hashtable和ConcurentHashMap是线程安全的。

② ConcurrentHashMap在JDK7中采用Segment分段锁技术来保证线程安全,在JDK8中ConcurrentHashMap取消了Segment分段锁,采用粒度更小的CAS和synchronized机制来保证并发安全,性能比较高,而Hashtable则使用Synchronized关键字来实现线程安全的,性能比较低,因此该类已经被替代。

③ HashMap的键和值都允许有null值存在,而其他两个类则不行。

(四)BIO、NIO、AIO的区别

Tips:如果应聘的岗位对高并发有较高要求,则被问到的概率就很高,面试前就需要对该块知识进行“恶补”。

参见博客:

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

常见类:InputStream、OutputStream、Reader、Writer。

NIO:New IO,同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。 常见类:Channels、Buffers、Selectors。

AIO:Asynchronous IO是NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO,异步IO的操作基于事件和回调机制。常见类:AsynchronousChannel。

Java高级工程师必会知识之JavaSE(上)Java高级工程师必会知识之JavaSE(中)Java高级工程师必会知识之JavaSE(下)Java高级工程师必会知识之JavaWEBJava高级工程师必会知识之MySQL

标签: #javaseapi