2024年Java基础复习DayOne:数据类型,细讲char类型与编码关系,java消息队列面试题

最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

如何准备面试?

1、前期铺垫(技术沉积)

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

  • Java程序员必看《Java开发核心笔记(华山版)》

  • Redis学习笔记

  • Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

  • Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

  • 大厂面试必问——数据结构与算法汇集笔记

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

②BAT大厂面试总结(部分内容截图)

③面试总结

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

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

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

这个API的功能是针对Unsigned的int类型除法的

在这里插入图片描述

在这里插入图片描述

可以看到,他的处理与Byte一样,都是转化成更高位的类型,这里转化成long,然后通过与运算舍弃后面多出来的位数(其实是改为0)

Integer.remainderUnsigned

这个是用来求余数的

在这里插入图片描述

可以看到同样也是转化成更高位去处理

Long.divideUnsigned

现在Long没有更高位了怎么办呢?

下面是源码

public static long divideUnsigned(long dividend, long divisor) {

//divisor是除数

//而divident是被除数

//首先判断除数是否为Unsigned(<0就代表为unsigned,只不过将符号位看成1,变为负数)

if (divisor < 0L) { // signed comparison

// Answer must be 0 or 1 depending on relative magnitude

// of dividend and divisor.

//可以看到这里的返回值只有0和1

//这是因为除数为unsigned,根据整形的向下取整规则

//得到的结果只能为1和0(dividend大于divisor就为1,小于就为0)

//dividend不可能为divisor的两倍(因为位数不过)

return (compareUnsigned(dividend, divisor)) < 0 ? 0L :1L;

}

//如果除数不是Unsigned,那么就判断被除数

if (dividend > 0) // Both inputs non-negative

//如果被除数不是Unsigned,就直接除就好

return dividend/divisor;

else {

/*

  • For simple code, leveraging BigInteger. Longer and faster

  • code written directly in terms of operations on longs is

  • possible; see “Hacker’s Delight” for divide and remainder

  • algorithms.

*/

//如果是,那么就将除数和被除数换成更高位的BigInt型,去进行

return toUnsignedBigInteger(dividend).

divide(toUnsignedBigInteger(divisor)).longValue();

}

}

下面我们就来看看compareUnsigned方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

MIN_VALUE是代表长整形可以取的最小值,也就是 − 2 63 -2^{63} −263

可以看到,具体的过程就是让两个数减去最小值,然后进行比较

原理是,即使是Unsigned,只要减去了最小值,就不会超过有符号位的范围,然后通过比较减去后的大小,就可以判断除数和被除数谁大谁小,然后就返回0和1。

浮点型


浮点型有两种类型,一种为float,一种为double。

这里,我们认识一下精度损失

在两种浮点型,小数都是使用二进制表示的,比如 2 − 1 或 者 2 − 2 2{-1}或者2{-2} 2−1或者2−2,也就是0.5,0.125这些,也就是说,有一些小数是无法使用二进制表示的,只能通过后面的位数进行无限逼近,所以就会产生精度损失。

那什么是双精度和单精度呢?

这是根据double和float的位数来区分的,double为8字节,而float为4字节,所以double可以使用更多位数进行逼近,所以double会更加精确。

这里要注意的是,所有的浮点数计算都遵循IEEE754规范

对于表示溢出和出错情况,使用了三个特殊的浮点数值去表示

  • 正无穷大

  • 负无穷大

  • NaN(不是一个数字)

在这里插入图片描述

字符型


char类型本来用来表示单个字符,但如今有些Unicode字符可以用一个char表示,也就是两个字节,但有时一些Unicode字符需要用多个字节表示,也就是使用多个char表示

char类型的值可以表示为十六进制值,从\u0000~\uffff。这里是\u充当了一个转义序列的功能,同时\u转义序列是可以出现在字符常量或字符串,所以使用注释和参数的时候,要注意一下

在Java中,char类型描述了UTF-16编码中的一个代码单元

Unicode

在认识UTF-16前,我们需要认识Unicode

Unicode其实相当于一本很厚的字典,里面储存了世界上所有语言的字符,使用Unicode码点唯一地对应一个字符。

Unicode是没有规定字符对应的二进制码占用的空间是多少,那么问题来了,以“汉”字为例,它的Unicode码点为0x6c49,对应的二进制为110110001001001,也就是15位二进制,也就说明了,这个字需要用2个字节去存储这个字,那么,对于其他字体,很有可能出现3个字节,或者更多的字节去存储,对于计算机来说,计算机怎么知道这两个字节表示的是一个字符,而不是与后面的字节形成一个字符?

所以,为了解决Unicode的这个问题,新的编码方式UTF-8、UTF-16和UTF-32就出现了

UTF-8

UTF其实是Unicode Transformation Format的缩写,即统一Unicode编码转换格式

UTF-8的特点就是可变长,即对于不同长度字节的字符有很好的兼容性

编码规则如下

  • 对于单个字节的字符(也就是基本字符),也就是8位,会将第一位设为0,后面的七位会对应这个字符的Unicode码点,因此对于0~ 2 7 2^7 27号字符是完全可以的,甚至与ASCII(另一种编码方式,只不过不支持中文只有英文和符号)完全相同(这时候可能会有人说那么对于 2 8 至 2 7 28至27 28至27里面的字符呢?其实这一段被分在了使用2个字节表示)

  • 对于需要使用N个字节来表示的字符(N>1),第一个字节的前N位都设为1,第N+1位设为0(用来记录这个字符是用多少个字节来存储的,让计算机可以识别出),剩余后面的N-1个字节的前两位都要设置为10,剩下的二进制位则使用这个字符的Unicode码点来进行补充

| Unicode十六进制码点范围 | UTF-8二进制 |

| — | — |

| 0000 0000 ~ 0000 007F(注意这里只有7位) | 0xxxxxxx(对应表示码点的七位) |

| 0000 0080 ~ 0000 07FF(注意这里为11位) | 110xxxxx 10xxxxxx (对应码点11位) |

| 0000 0800 ~ 0000 FFFF(注意这里位16位) | 1110xxxx 10xxxxxx 10xxxxxx(对应码点16位) |

| 0001 0000 ~ 0010 FFFF(这里为18位) | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(虽然超过码点位数,但不影响表示) |

通过表格,可以看到UTF-8d的编码其实很简单,下面还是以"汉"为例,具体说一下如何进行UTF-8的编码和解码的

Kafka进阶篇知识点

image

Kafka高级篇知识点

image

44个Kafka知识点(基础+进阶+高级)解析如下

image

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

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

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

44个Kafka知识点(基础+进阶+高级)解析如下

[外链图片转存中…(img-uklS7Zd5-1714843546565)]

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值