轻松高薪之---java基础(一)

2023-10-27

轻松高薪系列将分为五期为大家呈现:java基础、WEB、数据库、框架、技术点五大部分。由于每一个内容比较多,每一部分将分为若干小结进行分享,欢迎持续跟踪!

一 Java 基础

## 1.Java 基础 知识

1.1 面向对象的特征(了解)
面向对象的特征:封装、继承、多态、抽象。
**封装:**就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对
象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的
公开,别人只能用我提供的功能实现需求,而不知道是如何实现的。增加安全性。
继承:子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提
高了代码的复用性。
**多态:**指允许不同的对象对同一消息做出相应。即同一消息可以根据发送对象的不
同而采用多种不同的行为方式(发送消息就是函数调用)。封装和继承几乎都是为多态而准
备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其相应的方法。
抽象表示对问题领域进行分析、设计中得出的抽象的概念,是对一系列看上去不同,
但是本质上相同的具体概念的抽象。在 Java 中抽象用 abstract 关键字来修饰,用 abstract
修饰类时,此类就不能被实例化,从这里可以看出,抽象类(接口)就是为了继承而存在的。
1.2 Java 的基本数据类型有哪些(了解)
在这里插入图片描基本数据类型述

1.3JDK JRE JVM 的区别 (必会)
在这里插入图片描述

JDK(Java Development Kit)是整个 Java 的核心,是 java 开发工具包,包括
了 Java 运行环境 JRE、Java 工具和 Java 基础类库。
JRE(Java Runtime Environment)是运行 JAVA 程序所必须的环境的集合,包
含 java 虚拟机和 java 程序的一些核心类库。
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,是整个 java 实现跨平台
的最核心的部分,能够运行以 Java 语言写作的软件程序。
1.4 重载和重写的区别(必会)
重载: 发生在同一个类中,方法名必须相同,参数类型不同.个数不同.顺序不同,
方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名.参数列表必须相同,返回值范围小于等于父类,
抛出的异常范围小于等于父类,
访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能
重写该方法。
1.5 Java 中==和 equals 的区别(必会)
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
引用类型:默认情况下,比较的是地址值。
特:String、Integer、Date 这些类库中 equals 被重写,比较的是内容而不是地址!
面试题:请解释字符串比较之中 “ == ” 和 equals() 的区别?
答: ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
equals():比较的是两个字符串的内容,属于内容比较。
1.6 String、StringBuffer、StringBuilder 三者之间的区别(必会)
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
String 中的 String 类中使用 final 关键字修饰字符数组来保存字符串,private
final char value[] ,String 对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了
一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全
的。
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
小结:
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder。
1.7 接口和抽象类的区别是什么?(必会)
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接
口。
构造函数:抽象类可以有构造函数;接口不能有。
main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方
法。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访
问修饰符。
1.8 string 常用的方法有哪些?(了解)
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
1.9 什么是单例模式?有几种?(必会)
单例模式:某个类的实例在 多线程环境下只会被创建一次出来。
单例模式有饿汉式单例模式、懒汉式单例模式和双检锁单例模式三种。
饿汉式:线程安全,一开始就初始化。
在这里插入图片描述

懒汉式:非线程安全,延迟初始化。
在这里插入图片描述

双检锁:线程安全,延迟初始化。
在这里插入图片描述

1.10 反射(了解)
在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有

属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获
取信息
以及动态调用对象方法的功能成为 Java 语言的反射机制。
获取 Class 对象的 3 种方法 :
调用某个对象的 getClass()方法
Person p=new Person();
Class clazz=p.getClass();
调用某个类的 class 属性来获取该类对应的 Class 对象
Class clazz=Person.class;
使用 Class 类中的 forName()静态方法(最安全/性能最好)
Class clazz=Class.forName(“类的全路径”); (最常用)
1.11 jdk1.8 的新特性(高薪常问)
1、 Lambda 表达式
Lambda 允许把函数作为一个方法的参数。
在这里插入图片描述

2 、方法引用
方法引用允许直接引用已有 Java 类或对象的方法或构造方法。
在这里插入图片描述

上例中我们将 System.out::println 方法作为静态方法来引用。
3 、函数式接口
有且仅有一个抽象方法的接口叫做函数式接口,函数式接口可以被隐式转换为Lambda 表达式。通常函数式接口上会添加@FunctionalInterface 注解。
4 、接口允许定义默认方法和静态方法
从 JDK8 开始,允许接口中存在一个或多个默认非抽象方法和静态方法。
5 、Stream API
新添加的 Stream API(java.util.stream)把真正的函数式编程风格引入到 Java中。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。
在这里插入图片描述

6、 日期/时间类改进
之前的 JDK 自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比commons-lang包等。不过 JDK8 出现之后这个改观了很多,比如日期时间的创建、比较、调整、
格式化、时间间隔等。这些类都在 java.time 包下,LocalDate/LocalTime/LocalDateTime。
7 、Optional 类
Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent()方法会返回 true,调用 get()方法会返回该对象。
在这里插入图片描述

8 、Java8 Base64 实现
Java 8 内置了 Base64 编码的编码器和解码器。
1.12 Java 的异常(必会)
在这里插入图片描述

Throwable 是所有 Java 程序中错误处理的父类,有两种资类:Error 和Exception。
**Error:**表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
**Exception:**表示可恢复的例外,这是可捕捉到的。
**1.运行时异常:**都是 RuntimeException 类及其子类异常,如
NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序
逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是
Java 编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用 try-catch
语句捕获它,也没有用 throws 子句声明抛出它,也会编译通过。
**2.非运行时异常(编译异常):**是 RuntimeException 以外的异常,类型上都属于 Exception
类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如 IOException、SQLException 等以及用户自定义的 Exception 异常,一般情况下不自定
义检查异常。
常见的 RunTime 异常几种如下:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
1.13 BIO、NIO、AIO 有什么区别?(高薪常问)
**BIO:**Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简
单使用方便,并发处理能力低。
**NIO:**New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过
Channel(通道)通讯,实现了多路复用。
**AIO:**Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,
异步 IO 的操作基于事件和回调机制。
1.14 Threadloal 的原理(高薪常问)
**ThreadLocal:**为共享变量在每个线程中创建一个副本,每个线程都可以访问自己
内部的副本变量。通过 threadlocal 保证线程的安全性。
其实在 ThreadLocal 类中有一个静态内部类 ThreadLocalMap(其类似于 Map),
用键值对的形式存储每一个线程的变量副本,ThreadLocalMap 中元素的 key 为当前
ThreadLocal 对象,而 value 对应线程的变量副本。
ThreadLocal 本身并不存储值,它只是作为一个 key 保存到 ThreadLocalMap
中,但是这里要注意的是它作为一个 key 用的是弱引用,因为没有强引用链,弱引用在 GC
的时候可能会被回收。这样就会在 ThreadLocalMap 中存在一些 key 为 null 的键值对
(Entry)。因为 key 变成 null 了,我们是没法访问这些 Entry 的,但是这些 Entry 本身是
不会被清除的。如果没有手动删除对应 key 就会导致这块内存即不会回收也无法访问,也
就是内存泄漏。
使用完 ThreadLocal 之后,记得调用 remove 方法。 在不使用线程池的前提下,
即使不调用 remove 方法,线程的"变量副本"也会被 gc 回收,即不会造成内存泄漏的情况。
1.16 同步锁、死锁、乐观锁、悲观锁 (高薪常问)
同步锁:
当多个线程同时访问同一个数据时,很容易出现问题。为了避免这种情况出现,我们要
保证线程同步互斥,就是指并发执行的多个线程,在同一时间内只允许一个线程访问共享数
据。Java 中可以使用 synchronized 关键字来取得一个对象的同步锁。
死锁:
何为死锁,就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。
乐观锁:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是
在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和
CAS 算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类
似于 write_conditio 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic
包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。
悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时
候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使
用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了
很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java 中
synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现。
1.17 说一下 synchronized 底层实现原理?(高薪常问)
synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进
入到临界区,同时它还可以保证共享变量的内存可见性。
Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:
普通同步方法,锁是当前实例对象
静态同步方法,锁是当前类的 class 对象
同步方法块,锁是括号里面的对象
1.18 synchronized 和 volatile 的区别是什么?(高薪常问)
volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从
主存中读取; synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线
程被阻塞住。
volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。
volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证
变量的修改可见性和原子性。
volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。
volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。
1.19synchronized 和 Lock 有什么区别? (高薪常问)
首先 synchronized 是 java 内置关键字,在 jvm 层面,Lock 是个 java 类;
synchronized 无法判断是否获取锁的状态,Lock 可以判断是否获取到锁;
synchronized 会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发
生异常会释放锁),Lock 需在 finally 中手工释放锁(unlock()方法释放锁),否则容易造成
线程死锁;
用 synchronized 关键字的两个线程 1 和线程 2,如果当前线程 1 获得锁,线程 2 线程
等待。如果线程 1 阻塞,线程 2 则会一直等待下去,而 Lock 锁就不一定会等待下去,如果
尝试获取不到锁,线程可以不用一直等待就结束了;
synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入、可判断、可公平
(两者皆可);
Lock 锁适合大量同步的代码的同步问题,synchronized 锁适合代码少量的同步问题。
1.20 手写冒泡排序?(必会)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

轻松高薪之---java基础(一) 的相关文章

随机推荐

  • 大数据模型交易平台---学生校园消费行为分析模型

    业务问题 大部分高校均基于校园一卡通系统进行 智慧校园 的相关建设 当前 学生作为一个特殊的群体 其饮食消费内容在社会大背景影响下日益多样化 而且在没有其他任何收入来源的时候 对消费的正确认识就显得尤为重要 校园一卡通就是体现学生消费行为的
  • Play With Docker

    文章目录 Play with Docker PWD 1 Getting Started The command you just ran What is a container What is a container image 2 Our
  • Windows 和 Linux 上安装 TTF 字体的方法

    前言 在之前的文章中 我们是通过引入字体文件的方法解决了平台字体兼容性的问题 有同学提出了一个问题 为什么要通文件引入的方式解决问题 难道不考虑带宽问题吗 其实 我们一开始考虑的方案是将字体文件安装在运行项目的每台客户机上 但是 因为使用项
  • 第四天 Java 数组与排序

    数组与排序 一 数组 1 数组的常见概念 二 一维数组 1 1 一维数组的声明方式 1 2 一维数组的初始化 1 动态初始化 2 静态初始化 1 3 一维数组内存解析 1 4 随机数的产生 三 多维数组的使用 1 二维数组 数组中的数组 2
  • 基于模型预测控制(MPC)的悬架系统仿真分析

    目录 前言 1 悬架系统 2 基于MPC的悬架系统仿真分析 2 1 simulink模型 2 2仿真结果
  • 1.深度学习入门:感知机是什么和感知机的实现(详细讲解)

    1 深度学习入门 感知机是什么和感知机的实现 感知机 感知机是什么 简单逻辑电路 感知机的实现 简单的实现 导入权重和偏置 使用权重和偏置的实现 感知机 感知机是什么 感知机 Perceptron 是一种二元线性分类模型 由美国学者Fran
  • ovirt 安装

    第一步 通过oVirt node iso安装host 从本站 安装包下载 页面或其它渠道获取到oVirt4 4版本的node iso 本次部署使用的是ovirt node ng installer 4 4 1 2020080418 el8
  • vim编辑器使用教程

    文章目录 前言 一 vim 的三种工作模式 二 vim 基本操作 1 编辑 2 复制粘贴 3 撤销 4 跳转 5 查找和替换 6 自动缩进 7 分屏 8 其他 三 vim 配置文件 前言 vim 是 Linux 系统内置的 文本编辑器 用于
  • docker系列:1、docker概述和学习资料

    docker系列 1 docker概述和学习资料 文章目录 docker系列 1 docker概述和学习资料 1 前言 2 docker概述和学习资料 3 最后 1 前言 之前总结完了GoFrame框架 我接下来是想将我的个人网站做下升级
  • MapReduce工作流程

    1 MapReduce工作流程图 2 流程详解 上面的流程是整个MapReduce最全工作流程 但是Shuffle过程只是从第7步开始到第16步结束 具体Shuffle过程详解 如下 1 MapTask收集我们的map 方法输出的kv对 放
  • ucint核心边缘分析_【5G研报】边缘计算及重点个股

    这是一篇清明前发过的文章 由于微信后台两天不回复网友留言则无法私信各位 故重新发布 对5G感兴趣的朋友老规矩 点击关注 后台留言或发消息 边缘计算 搞研究 选个股 我们是专业的 一篇关于边缘计算的万字研报 感兴趣的点个关注 更多资讯尽在神光
  • 2651. 计算列车到站时间

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 数学 知识回忆 除法运算 写在最后 Tag 数学 题目来源 2651 计算列车到站时间 题目解读 给你一个列车预计到达时间点和一个列车延误的时间 请返回列车实际的到达时间 解题思路 方
  • springboot和springcloud的联系与区别

    什么是springboot Spring Boot是一个用于简化Spring应用程序开发的框架 它提供了一种约定优于配置的方式 通过自动配置和快速开发能力 可以快速搭建独立运行 生产级别的Spring应用程序 在传统的Spring应用程序开
  • 程序员应该避开的20个低级不良用户体验

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 前2天碰到一件事 只因职业信息没登记汉口银行的系统居然禁止我使用银行卡账号 这样的神操作一看十有八九是程序员干的 由此联想到平时开发中遇到的一
  • Core Java(十三)

    Java API5 0新特性 优化的功能 对编译器进行的优化 静态引入 什么是静态引入 将类的静态成员预先引用进来 直接使用就可以了 例如 System out 直接写成out printl 就可以了 语法 import static 包名
  • H5页面判断来源是 微信小程序、百度小程序、微信浏览器、其他环境

    小程序打开H5页面有一些链接需要隐藏掉 不让用户随意跳转 在页面中引入微信 第一个 百度小程序 第二个 外部 js 在页面的js中判断即可
  • vlan接口类型和划分

    vlan接口类型 access 一般不带标签发送 负责标签压入与剥离 trunk 一般带标签发送 每个trunk接口都有一个pvid hybrid 发的时候可以带多个pvid 控制数据带标签或不带标签发送 access端口收到没有没有带ta
  • .NET MAUI 多平台应用 UI 应用

    NET 多平台应用 UI 使用文档 NET 多平台应用 UI NET MAUI 允许你使用面向 Android iOS macOS Windows 和 Tizen 上的移动和桌面外形规格的 NET 跨平台 UI 工具包生成本机应用 本教程介
  • chrome扩展开发中文教程

    chrome扩展开发中文教程 文档地址 http chrome cenchy com index html 既然是中文文档 可能存在翻译的过程 就会出现翻译更新不及时的情况 如果看最新最准确的文档 请移步到官方文档
  • 轻松高薪之---java基础(一)

    轻松高薪系列将分为五期为大家呈现 java基础 WEB 数据库 框架 技术点五大部分 由于每一个内容比较多 每一部分将分为若干小结进行分享 欢迎持续跟踪 一 Java 基础 1 Java 基础 知识 1 1 面向对象的特征 了解 面向对象的