后端常问面经之Java基础

基本数据类型

Java中有8种基本数据类型:

6种数字类型:

4种整数型:byte、short、int、long

2种浮点型:float、double

1种字符类型:char

1种布尔类型:boolean

数据类型的默认值以及所占空间如下:

注意:

  • Java里使用long类型的数据一定要在数值后面加上L,否则作为整数解析。

讲一下Java面向对象的特点

封装、继承、多态是Java面向对象编程的三大特点。

  • 封装(Encapsulation):封装是面向对象编程的基本特点之一,它将数据和方法封装在对象内部,隐藏对象的内部实现细节,只暴露必要的接口供外部访问。通过封装,可以实现信息的隐藏和保护,提高代码的安全性和可靠性。

  • 继承(Inheritance):继承是面向对象编程的重要特点,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并可以通过扩展和重写来增加新的功能或修改现有功能。继承提高了代码的复用性和可维护性,同时也体现了类与类之间的关系。

  • 多态(Polymorphism):多态是面向对象编程的核心概念之一,多态是指同一个方法名可以在不同的类中有不同的实现,不同的子类可以重写父类的方法,通过父类引用指向子类对象时,根据实际对象的类型来确定调用哪个方法。多态性提高了代码的灵活性和扩展性,使得程序更易于理解和维护。

用过“多态”吗?举一个具体例子

一个具体的例子是,假设有一个动物类(Animal)和它的两个子类:狗类(Dog)和猫类(Cat)。它们都有一个名为“makeSound”的方法,但是每种动物发出的声音是不同的。

class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}
​
class Dog extends Animal {
    public void makeSound() {
        System.out.println("Woof");
    }
}
​
class Cat extends Animal {
    public void makeSound() {
        System.out.println("Meow");
    }
}
​
public class PolymorphismExample {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        
        dog.makeSound(); // 输出:Woof
        cat.makeSound(); // 输出:Meow
    }
}

通过多态性,可以创建一个Animal类型的引用指向一个具体的Dog或Cat对象。当调用这个引用的“makeSound”方法时,根据实际指向的对象类型,会执行相应子类的方法,从而实现不同动物发出不同声音的效果。这样就体现了多态的特性,同一个方法调用可以产生不同的行为,提高了代码的灵活性和可扩展性。

多态和重载有什么关系?

重载是一种编译时多态,而多态是一种运行时多态。两者都是实现多态性的方式,但发生的时间点和机制不同。

  • 重载是指在同一个类中,方法名相同但参数列表不同的情况,通过参数个数、类型或顺序的不同来区分不同的方法。重载是静态绑定的概念,编译器在编译期间根据方法的参数列表来确定调用哪个方法。

  • 多态是指同一个方法名可以在不同的类中有不同的实现,不同的子类可以重写父类的方法,通过父类引用指向子类对象时,根据实际对象的类型来确定调用哪个方法。多态是动态绑定的概念,运行时根据对象的实际类型来确定调用哪个方法。

Java中的异常

当程序出现异常时,Java会抛出一个异常对象。Java中的异常可以分为三类:

  1. Checked Exception(受检异常):这种异常在编译时就可以被检测出来,必须要在代码中进行处理或者声明抛出,否则编译不通过。这类异常主要是由程序的外部环境引起的,例如文件不存在、网络连接失败等。常见的Checked Exception包括IOException、SQLException等。

  2. Unchecked Exception(非受检异常):这种异常通常是由程序内部错误引起的,例如NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException等。这类异常不需要在代码中声明抛出,也可以不进行处理,但是如果不进行处理,程序会崩溃。

  3. Error:这种异常通常是由JVM或者硬件引起的,例如OutOfMemoryError、StackOverflowError等。这类异常也不需要在代码中声明抛出,也可以不进行处理,但是如果不进行处理,程序也会崩溃。

在Java中,异常处理通常包括try-catch语句和throw语句。try-catch语句可以捕获异常并进行处理,而throw语句可以手动抛出异常。

String,StringBuilder, StringBuffer区别?单线程大量操作字符串用哪个?

回答:单线程大量操作字符串时应该使用StringBuilder,而在多线程环境下应该使用StringBuffer

补充:

String、StringBuilder和StringBuffer都是Java中用于操作字符串的类。

String是不可变的字符序列,每次对String进行修改时都会创建一个新的String对象,因此在大量操作字符串时,使用String会频繁地创建对象,导致性能较低。

StringBuilder和StringBuffer都是可变的字符序列,可以对其进行多次修改而不创建新的对象。两者的区别在于线程安全性,StringBuffer是线程安全的,而StringBuilder是非线程安全的。因为StringBuffer的所有共有方法都是同步的,所以在多线程环境下使用StringBuffer可以保证线程安全,但是会降低性能。而StringBuilder没有同步方法,所以在单线程环境下使用StringBuilder性能更高。

因此,在单线程环境下进行大量的字符串操作时,应该使用StringBuilder,可以获得更好的性能。在多线程环境下,使用StringBuffer可以保证线程安全,但是会牺牲一定的性能。

综上所述,单线程大量操作字符串时应该使用StringBuilder,而在多线程环境下应该使用StringBuffer。

NIO核心组件

NIO 主要包括以下三个核心组件:

  • Buffer(缓冲区):在传统的 BIO 中,数据的读写是面向流的, 分为字节流和字符流。

    在 Java 1.4 的 NIO 库中,所有数据都是用缓冲区处理的,这是新库和之前的 BIO 的一个重要区别,有点类似于 BIO 中的缓冲流。NIO 在读取数据时,它是直接读到缓冲区中的。在写入数据时,写入到缓冲区中。 使用 NIO 在读写数据时,都是通过缓冲区进行操作。

  • Channel(通道):Channel 是一个通道,它建立了与数据源(如文件、网络套接字等)之间的连接。我们可以利用它来读取和写入数据,就像打开了一条自来水管,让数据在 Channel 中自由流动。

    BIO 中的流是单向的,分为各种 InputStream(输入流)和 OutputStream(输出流),数据只是在一个方向上传输。通道与流的不同之处在于通道是双向的,它可以用于读、写或者同时用于读写。

    Channel 与前面介绍的 Buffer 打交道,读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。

  • Selector(选择器):是 NIO 中的一个关键组件,它允许一个线程处理多个 Channel。Selector 是基于事件驱动的 I/O 多路复用模型,主要运作原理是:通过 Selector 注册通道的事件,Selector 会不断地轮询注册在其上的 Channel。当事件发生时,比如:某个 Channel 上面有新的 TCP 连接接入、读和写事件,这个 Channel 就处于就绪状态,会被 Selector 轮询出来。Selector 会将相关的 Channel 加入到就绪集合中。通过 SelectionKey 可以获取就绪 Channel 的集合,然后对这些就绪的 Channel 进行响应的 I/O 操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/488759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机图形学】Command-driven Articulated Object Understanding and Manipulation

对Command-driven Articulated Object Understanding and Manipulation的简单理解 文章目录 1. 以往工作问题和本文提出的工作内容2. 任务定义3. 方法2.1 Seg-Net3.2 Art-Net3.3 推理 1. 以往工作问题和本文提出的工作内容 该工作提出了一个新的方法,面向人类指令…

Flutter 旋转动画 线性变化的旋转动画

直接上代码 图片自己添加一张就好了 import dart:math;import package:flutter/material.dart;import package:flutter/animation.dart;void main() > runApp(MyApp()); //旋转动画 class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {re…

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

如何启动极狐GitLab 静态网站Pages功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

MySQL进阶45讲【35】什么时候会使用内部临时表?

1 前言 在MySQL进阶45讲【15】“order by“是怎么工作的?和MySQL进阶45讲【32】到底可不可以使用join?文章中,分别介绍了sort buffer、内存临时表和join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语…

BSV区块链的应用开发前景——通过标准化来促进创新

​​发表时间:2024年3月5日 近年来区块链领域的发展日新月异,各种全新的技术和方法论正在迅猛涌现。在这个瞬息万变的环境之中,标准化不仅仅会为开发者们带来便利,同时也促进了应用之间的互操作性,并且推动着生态系统的…

天地图-坐标拾取

在网页使用高德,百度地图这些时,会因为没有购买他们的使用版权,从而出现以下水印,因此需要换一个地图-天地图 天地图官方文档:http://lbs.tianditu.gov.cn/ 然而天地图并不像其他地图一样这么方便,比如没有…

MyBatis题库详解

1、介绍下MyBatis中的工作原理 介绍MyBatis的基本情况:ORM,对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术 MyBatis框架的…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现: 城市交通问题直接影响市民的生活和工作。在地形平坦的城市,公共自行车出行系统是一种很好的辅助手段。一般来说,公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

openlayers 入门教程(五):sources 篇

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

Memcached分布式内存对象数据库

一 Memcached 概念 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。 二 在架构中的位置 Memcached 处于前端或中间件后…

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一:jq 的ajax(在 vue 中不推荐同时使用)方案二:js 原始官方 fetch方法方案三:axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

UE4 根据任意多个点,生成最近的线条

1.计算所有线条的组合 2.Clear0宏:清除掉数组Distance0的值。注意这里是设置成最大值,而不是使用Clear! 3.清除掉数组中的最小值,避免重复生成相同长度的线条。注意这里是设置成最大值,而不是使用Clear! …

python爬虫基础-----运算符(第三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

GitHub加速访问最简单的方法

Github是全球最大的代码开源平台,对于编程的小伙伴来说,这是一个巨大的宝库,也是编程学习的圣地。很对小伙伴在使用GitHub时会经常出现无法访问Github的情况。 一、解决方法——>修改hosts文件 通过 IP查询工具来获取当前Github网站的真实…

全民采矿石赚钱小程序源码,附带详细搭建教程

安装教程 1、环境用宝塔Nginxphp7.0或者以下版本 2、可以更换各种模板,懂代码和标签的可以改模板,不懂的可以直接上站 3、上站前记得添加关键词和内容库 4、伪静态在绑定完百度站长之后再添加 目录说明: data/keyword 放关键词 标签&#xff…

【扩散模型】论文精读:Denoising Diffusion Probabilistic Models(DDPM)

文章目录 前言Abstract1 Introduction2 Background3 Diffusion models and denoising autoencoders3.1 Forward process and LT3.2 Reverse process and L1:T −13.3 Data scaling, reverse process decoder, and L03.4 Simplified training objective 4 Experiments4.1 Sample…

C语言: 指针讲解

为什么需要指针? (1)指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能…

Linux-进程控制(进程创建、进程终止、进程等待)

一、进程创建 1.1 fork函数介绍 在命令行下我们可以通过 ./ exe文件 来创建一个进程,通过fork函数,我们可以通过代码的形式从一个进程中创建一个进程,新进程为子进程,原进程为父进程,子进程在创建时,会与…

软件项目-详细设计说明书范文参考(46页Word原件)

一、 关于本文档 (一) 编写目的 (二) 预期读者 二、 项目概要 (一) 建设背景 (二) 建设目标 (三) 建设内容 三、 总体设计 (一&#xff0…