Java高级工程师必会知识之JavaSE(上)
lipiwang 2024-11-16 23:20 8 浏览 0 评论
- Java高级工程师必会知识之JavaSE(上)
- Java高级工程师必会知识之JavaSE(中)
- Java高级工程师必会知识之JavaSE(下)
- Java高级工程师必会知识之JavaWEB
- 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。
- Java高级工程师必会知识之JavaSE(上)
- Java高级工程师必会知识之JavaSE(中)
- Java高级工程师必会知识之JavaSE(下)
- Java高级工程师必会知识之JavaWEB
- Java高级工程师必会知识之MySQL
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)