百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-08-08 00:14 9 浏览 0 评论

  1. Java高级工程师必会知识之JavaSE(上)
  2. Java高级工程师必会知识之JavaSE(中)
  3. Java高级工程师必会知识之JavaSE(下)
  4. Java高级工程师必会知识之JavaWEB
  5. Java高级工程师必会知识之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:为了代码的健壮性,不管是运行时异常还是编译时异常,在写代码时都需要避免或进行异常处理。

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的底层数据结构为数组+链表或红黑树结构,当链表长度大于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倍递增进行的。扩容后,会重新将节点的位置进行打散存放。

4. HashMap、Hashtable、ConcurrentHashMap的区别

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

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

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

(四)BIO、NIO、AIO的区别

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

参见博客:

https://www.imooc.com/article/265871

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。


  1. Java高级工程师必会知识之JavaSE(上)
  2. Java高级工程师必会知识之JavaSE(中)
  3. Java高级工程师必会知识之JavaSE(下)
  4. Java高级工程师必会知识之JavaWEB
  5. Java高级工程师必会知识之MySQL

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码