2024年2-2 Byte数组与缓冲区基础,java消息中间件面试

文章分享了互联网行业的流行技术学习大纲,包括性能调优、分布式实战、架构师基础知识、技术框架解析、面试技巧等内容,同时介绍了JavaNIO中的缓冲区概念,以及直接与非直接缓冲区的区别,附带了系统化的Java面试题和核心架构学习资源。
摘要由CSDN通过智能技术生成

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

数组合并

关于数组合并,我们还会经常用到,commons-lang3.jar包中的ArrayUtils类的addAll(),其功能是添加一个字节数组或者添加一个字节到原先的字节数组中。

public static byte[] addAll(byte[] array1, byte… array2) {

if (array1 == null) {

return clone(array2);

} else if (array2 == null) {

return clone(array1);

} else {

byte[] joinedArray = new byte[array1.length + array2.length];

System.arraycopy(array1, 0, joinedArray, 0, array1.length);

System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);

return joinedArray;

}

}

第二节 缓冲区基础

=======================================================================

在开始之前,我觉得有必要充分理解一下缓冲区的作用及使用方法。

一、缓冲区基础


在NIO技术的缓冲区中,存在4个核心技术点,分别是:

❑capacity(容量)

❑limit(限制)

❑position(位置)

❑mark(标记)

这4个技术点之间值的大小关系如下:0≤mark≤position≤limit≤capacity。

由于ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer是抽象类,wrap()就相当于创建这些缓冲区的工厂方法。最终对应的类型分别为java.io.HeapByteBufferjava.io.HeapCharBufferjava.io.HeapDoubleBuffe等。

limit

限制(limit)代表第一个不应该读取或写入元素的index,缓冲区的limit不能为负,并且limit不能大于其capacity。如果position大于新的limit,则将position设置为新的limit。如果mark已定义且大于新的limit,则丢弃该mark。

image-20210501144736092

public class BufferTest {

@Test

public void bufferLimitTest(){

char[] charArray = new char[]{‘a’,‘b’,‘c’,‘d’,‘e’};

CharBuffer buffer = CharBuffer.wrap(charArray);

System.out.println(“A capacity()=” + buffer.capacity() + “,limit=”+buffer.limit());

buffer.limit(3);

System.out.println(“B capacity()=” + buffer.capacity() + “,limit=”+buffer.limit());

buffer.put(0,‘o’);

buffer.put(1,‘p’);

buffer.put(2,‘q’);

buffer.put(3,‘r’);//index == 3,第一个不可读不可写的索引

buffer.put(4,‘s’);

buffer.put(5,‘t’);

buffer.put(6,‘u’);

}

}

position(位置)

什么是位置呢?它代表“下一个”要读取或写入元素的index(索引),缓冲区的position(位置)不能为负,并且position不能大于其limit。如果mark已定义且大于新的position,则丢弃该mark。

image-20210501151228104

@Test

public void bufferLimitTest(){

char[] charArray = new char[]{‘a’,‘b’,‘c’,‘d’,‘e’};

CharBuffer buffer = CharBuffer.wrap(charArray);

System.out.println(“A capacity()=” + buffer.capacity() + “,limit=”+buffer.limit()+ “,position=”+buffer.position());

buffer.limit(3);

System.out.println(“B capacity()=” + buffer.capacity() + “,limit=”+buffer.limit() + “,position=”+buffer.position());

buffer.put(0,‘o’);

buffer.put(1,‘p’);

buffer.put(2,‘q’);

buffer.put(3,‘r’);//index == 3,第一个不可读不可写的索引

buffer.put(4,‘s’);

buffer.put(5,‘t’);

buffer.put(6,‘u’);

}

运行结果如下:

A capacity()=5,limit=5,position=0

B capacity()=5,limit=5,position=2

a

b

Z

d

e

mark(标记)

标记有什么作用呢?缓冲区的标记是一个索引,在调用reset()方法时,会将缓冲区的position位置重置为该索引。标记(mark)并不是必需的。定义mark时,不能将其定义为负数,并且不能让它大于position。

  • 如果定义了mark,则在将position或limit调整为小于该mark的值时,该mark被丢弃,丢弃后mark的值是-1。

  • 如果未定义mark,那么调用reset()方法将导致抛出InvalidMarkException异常。

简而言之,buffer的reset()方法,可以根据mark()的位置,把位置重置为mark()调用时的位置。

其他的一些关系:

  • 如果position大于新的limit,则position的值就是新limit的值。

二、非直接缓冲区和直接缓冲区


非直接缓冲区

image-20210501153630472

通过ByteBuffer向硬盘存取数据时是需要将数据暂存在JVM的中间缓冲区,如果有频繁操作数据的情况发生,则在每次操作时都会将数据暂存在JVM的中间缓冲区,再交给ByteBuffer处理,这样做就大大降低软件对数据的吞吐量,提高内存占有率,造成软件运行效率降低,这就是非直接缓冲区保存数据的过程,所以非直接缓冲区的这个弊端就由直接缓冲区解决了。

直接缓冲区

Java核心架构进阶知识点

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Java核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、Spring相关、分布式、微服务、RPC、网络、设计模式、MQ、Redis、MySQL、设计模式、负载均衡、算法、数据结构、kafka、ZK、集群等。而这些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的

image

image

image

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[外链图片转存中…(img-49G2b9E4-1714958943935)]

[外链图片转存中…(img-s6EMi8O5-1714958943935)]

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值