Java 基础重点知识-(泛型、反射、注解、IO)

文章目录

  • 什么是泛型? 泛型有什么用?
    • 泛型原理是什么?
  • Java 反射
    • 什么是反射? 反射作用是什么?
    • 动态代理有几种实现方式? 有什么特点?
  • Java 注解
    • 什么是注解, 作用是什么?
  • Java I/O
    • 什么是序列化?
    • Java 是怎么实现系列化的?
    • 常见的序列化协议有哪些?
    • BIO/NIO/AIO 有什么区别?
    • IO 多路复用是什么?
    • select 和 epoll 有什么区别?

什么是泛型? 泛型有什么用?

要理解泛型, 就要从没有泛型的时候说起, 泛型是在 JDK 1.5 开始引入的, 在之前的版本中, 并不支持泛型, 只能使用 Object 类进行通用编程, 这样在处理 集合 这些数据结构的时候, 就需要显示类型转换, 为了解决这个问题, 就引入了泛型, 用大白话讲就是适用很多类型, 它把类型进行参数化, 在编译的时候可以进行类型检查, 并且减少了类型转换的代码.

  • 目的是增强类型安全性和代码的可读性, 并减少运行时类型转换的错误.通过使用泛型, 可以在编译的时候捕获类型错误, 提供了更好的代码组织和抽象.
    没哟使用泛型时:
// 没有使用泛型的例子
public class WithoutGenericsExample {private Object data;public WithoutGenericsExample(Object data) {this.data = data;}public Object getData() {return data;}public static void main(String[] args) {WithoutGenericsExample example = new WithoutGenericsExample("Hello");String str = (String) example.getData(); // 需要强制类型转换System.out.println(str);}
}

使用泛型后:

// 使用泛型的例子
public class WithGenericsExample<T> {private T data;public WithGenericsExample(T data) {this.data = data;}public T getData() {return data;}public static void main(String[] args) {WithGenericsExample<String> example = new WithGenericsExample<>("Hello");String str = example.getData(); // 不需要类型转换System.out.println(str);}
}

泛型原理是什么?

Java 泛型是使用类型擦除来实现的, 在Java中, 泛型的参数类型在编译后, 被擦除的机制, 比如 new ArrayList< Integer >() 变为 new ArrayList< >() , 这就是类型擦除.

类型擦除的好处有直接兼容兼容之前的代码, 节约了内存空间, 以及 jvm 层面实现简单.

Java 反射

什么是反射? 反射作用是什么?

反射是值程序在运行时, 动态的获取和操作类的一种能力.
通过反射机制, 可以在运行时动态的创建对象, 调用方法, 访问和修改属性, 获取类的信息等.
深入理解 Java 反射和动态代理

动态代理有几种实现方式? 有什么特点?

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP).

  • JDK 动态代理(基于接口的动态代理), JDK 动态代理只能代理实现了接口的类或者直接代理接口
    代理类与委托类实现同一接口,主要是通过代理类实现 InvocationHandler 并重写 invoke 方法来进行动态代理的,在 invoke 方法中将对方法进行处理。
  • CGLIB 代理(基于类的动态代理), CGLIB 可以代理未实现任何接口的类, 另外, CGLIB 动态代理是通过生成一个被代理的子类来拦截被代理类的方法调用.

Java 注解

什么是注解, 作用是什么?

注解是 JDK 5 引入的新特性, 可以看作是一种特殊的注释, 主要用于修饰类, 方法, 变量, 提供某些信息供程序在编译或运行的时候使用.
注解详解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 定义一个自定义的注解
@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可见
@Target(ElementType.METHOD) // 该注解可以应用于方法
public @interface MyAnnotation {// 定义注解的成员变量String value(); // 使用value作为成员变量名int priority() default 1; // 定义一个默认值为1的成员变量
}

Java I/O

什么是序列化?

  • 序列化就是将对象转换为二进制数据.
  • 反序列化就是将二进制数据转换为对象.

在这里插入图片描述

Java 是怎么实现系列化的?

JDK 中内置了一种序列化方式.

ObjectInputStream 和 ObjectOutputStream

Java 通过对象输入输出流来实现序列化和反序列化:

  • java.io.ObjectOutputStream 类的 writeObject() 方法可以实现序列化,
  • java.io.ObjectInputStream 类的 readObject() 方法用于实现反序列化.

常见的序列化协议有哪些?

常见的序列化协议包括:

  1. Java 序列化(Java Serialization):Java 自带的一种序列化协议,通过实现 java.io.Serializable 接口来实现对象的序列化和反序列化。虽然易于使用,但它具有一些局限性,例如不跨语言、不具备灵活性等。

  2. JSON(JavaScript Object Notation):一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。由于其简洁性和广泛的支持,被广泛应用于网络传输和配置文件等领域。

  3. XML(eXtensible Markup Language):一种标记语言,具有与 JSON 类似的跨平台、跨语言特性。XML 格式的数据可以通过各种方式解析和处理,但相对于 JSON 而言,XML 的语法较为繁琐,文件体积相对较大。

  4. Protocol Buffers(Protobuf):由 Google 开发的一种高效的序列化协议。Protobuf 使用二进制格式编码数据,相对于 JSON 和 XML,它的体积更小、解析速度更快。Protobuf 支持多种编程语言,并且生成的代码具有良好的可读性。

  5. Apache Avro:另一种由 Apache 开发的序列化协议,类似于 Protobuf。Avro 使用 JSON 格式定义数据结构,并支持动态生成代码。它具有较好的跨语言支持和数据压缩能力。

  6. MessagePack:一种高效的二进制序列化协议,数据格式紧凑且可读性良好。MessagePack 支持多种数据类型,并且在多种编程语言中都有相应的实现。

BIO/NIO/AIO 有什么区别?

简单来说, BIO就是传统的 IO 包, 它诞生的最早, 它是同步的, 阻塞的, NIO 是对 BIO 的改进, 提供了多路复用的同步非阻塞IO, 而 AIO 是NIO 的升级, 提供了 异步非阻塞IO.

  • BIO (同步阻塞IO): 现成发起请求后, 一直阻塞 IO, 知道缓冲区数据就绪后, 再进入下一步操作, 针对网络通信是一问答一响应的方式, 虽然简化了上层的应用开发, 但是在性能可可靠性上又巨大瓶颈, 在高并发场景下, 资源很快就会被耗尽.

  • NIO (同步非阻塞IO): 为了解决 BIO 性能, 引入了 NIO, NIO 提供了 channel , Select , Buffer 等新的抽象, 可以构建多路复用, 可以通过单线程或少量线程处理多个通道的事件.

  • AIO (异步非阻塞IO): 是 NIO 的升级版本, 基于事件和回调函数实现, 也就是在引用操作之后会直接返回, 不会阻塞在那里, 当后台处理完成, 操作系统会通知相应的线程进行后续的操作.

IO 多路复用是什么?

I/O 多路复用是一种高效的 I/O 编程模式,用于同时监视多个 I/O 流的状态,并在有数据可读、可写或者有异常时立即对其进行处理,而不需要为每个 I/O 流创建一个对应的线程。
在传统的阻塞 I/O 模型中,每个 I/O 操作都需要一个独立的线程来处理,当有大量的并发连接时,会导致大量的线程创建和上下文切换,降低系统性能。

而在多路复用模型中,通过使用特定的系统调用(如 select、poll、epoll 等),可以同时监听多个 I/O 流的状态。一旦有 I/O 事件发生,操作系统会通知应用程序,应用程序就可以根据事件类型来进行相应的处理,而无需阻塞等待。这样就可以用较少的线程来处理大量的并发连接,提高系统的并发能力和性能。

select 和 epoll 有什么区别?

  • select 每次调用都需要将文件描述符集合从用户态拷贝到内核态,而且随着文件描述符数量的增加,这个拷贝的开销会变得非常大。
    每次调用都需要线性扫描整个文件描述符集合,效率较低。

  • epoll 使用一个文件描述符来管理多个文件描述符,减少了拷贝文件描述符集合的开销。
    通过红黑树和双链表来管理文件描述符,实现了 O(1) 时间复杂度的事件注册和删除,提高了效率。
    支持水平触发(LT,Level Triggered)和边缘触发(ET,Edge Triggered)两种模式,更灵活。

select()函数基于数组,fd个数限制1024,poll()函数也是基于数组但是fd数目无限制。都会负责所有的fd,
epll()基于红黑数实现,fd无大小限制,平衡二叉数插入删除效率高.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后&#xff0c;查找时间过长的问题&#xff0c;将链表存储变为红黑树存储。 put方法的实现&#xff08;5⭐&#xff09; 相关属性&#xff1a; 1. 容量&#xff1a;初始容量为2^4。 2. 加载因子&#xff1a;初始值为0.75 上面两个属性的…

【面试经典 150 | 回溯】单词搜索

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Cloudflare高级防御规则 看看我的网站如何用防御的

网站已趋于稳定&#xff0c;并且经过nginx调优。我想先分享一下Cloudflare的WAF规则&#xff0c;因为这是最有效的防御之一&#xff0c;可以抵御大量恶意攻击流量&#xff0c;我已经验证了数月。 对于海外独立站电商网站&#xff0c;Cloudflare的CDN服务是首选&#xff0c;它强…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry&#xff08;LC-MS/MS &#xff0c;液相色谱-质谱串联&#xff09;可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言&#xff08;Extension Mark-up Language&#xff09;&#xff0c;学到这里大家对 xml 语言一定不陌生&#xff0c;但是它在 Android 中的运用其实只是冰山一角。抛开 Android&#xff0c;XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

HashMap的底层存储介绍

HashMap底层实现采用了哈希表&#xff0c;这是一种非常重要的数据结构。对于我们一行理解很多技术都非常有帮助。 数据结构中由数组和链表来实现对数据的存储&#xff0c;他们各有特点。 &#xff08;1&#xff09;数组&#xff1a;占用空间连续。寻址容易&#xff0c;查询速…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

Windows 10 使用 Vagrant 快速创建虚拟机

一、下载 VirtualBox 官网地址&#xff1a;Oracle VM VirtualBox 阿里云盘&#xff1a;阿里云盘分享 二、安装 VirtualBox 安装软件前请先确认 CPU 是否开启了虚拟化&#xff0c;要求开启 2.1、双击运行可执行文件后点击下一步 2.2、选择安装路径&#xff0c;为了避免中文乱码…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具&#xff0c;Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验&#xff0c;以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置&#xff0c;OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求&#xff0c; 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步&#xff1a; 加依赖改yml 具体操作请往…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口&#xff0c;但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言&#xff0c;类似J…

platformd device、driver注册过程

本文以smsc911x驱动为例 platform_device注册过程 该设备被定义在dts里面了 参考文章设备树节点转换为设备节点device_node、和平台设备资源platform_device_设备树节点转换成平台设备-CSDN博客 dts里面的节点会被转换为device_node和platform_device(并不是所有节点都会被转…

vi编辑器使用

说明&#xff1a;本文介绍vi编辑器使用&#xff1b; 介绍&基础使用 vi编辑器是linux操作系统中最常用的编辑器&#xff0c;使用vi或vim命令启动。vim是vi编辑器的增强版&#xff0c;大多数情况使用vi命令也会打开vim编辑器&#xff0c;为了方便介绍&#xff0c;以下均称v…

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…

从阿里云崩溃看IT系统非功能能力验证

昨天下午6点左右学员群里有人说阿里云又出问题了&#xff0c;并且还挺长时间没有恢复了。 我也登录了一下&#xff0c;结果登录直接不停地302。如下所示&#xff1a; 做为阿里云重要的基础设施&#xff0c;这一故障影响了。如官方通告的处理时间线&#xff1a; 17:44起&#…

【JavaEE初阶系列】——理解tomcat 带你实现最简单的Servlet的hello world程序(七大步骤)

目录 &#x1f6a9;认识Tomcat &#x1f6a9;运用Tomcat &#x1f6a9;Servlet &#x1f393;完成简单的Servlet的hello world程序 &#x1f388;创建项目Maven &#x1f388;引入依赖 &#x1f388;创建目录 &#x1f388;编写代码 &#x1f388;打包程序 &#x1…

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

求矩阵对角线元素之和(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int sum 0;int a[3][3] { 0 };//获取数组a的值&#xff1b;printf(&qu…

『大模型笔记』Code Example: Function Calling with ChatGPT

Code Example: Function Calling with ChatGPT 文章目录 一. Code Example: Function Calling with ChatGPT二. 参考文献一. Code Example: Function Calling with ChatGPT from openai import OpenAI from dotenv import load_dotenv import json# --------------------------…