Java其他未分类知识点集合
-
Java中为什么一个char可以保存一个汉字字符?
- Java中一个char是2个字节,而中文如果用UTF8方式编码则会是可能占用三个字节
- Java编译器其实使用的是使用UTF16方式对汉字进行编码,而绝大多数的字符使用UTF16编码都只需要两个字节即可
- 扩展:
- Unicode编码将绝大多数字符使用0x000000~0x10FFFF映射
- UTF8占用字符根据Unicode码分别使用1、2、3、4字节,比特位为0的占1字节,1个1占1字节,2个1占2字节,3个1占3字节,4个1占4字节
- UTF16占用2个或4个字节;UTF32占用4个字节
- 在转换工具中,只有URL编码工具对汉字进行编码的时候,才会使用UTF8编码;其他的Unicode转换都是UTF32编码
-
Java如何计算汉字的hashCode?
- 因为汉字在Java编译器中转码成UTF-16编码格式,这样就可以直接再JVM中运行,所以汉字的hashCode就是汉字十进制的Unicode码值。
- 验证
// 虽然声明了一个String类型数据,但是内部其实是char类型的 '我' String a = "我"; // 这里转换的时候一定要转换成UTF-16字符集,否则会使用默认的ISO-8859-1,返回值是有问题的 byte[] arr = a.getBytes(StandardCharsets.UTF_16); // 打印字节值:[-2, -1, 98, 17] // 这里开头的-2和-1其实是字节序标志FE FF(这是16进制内存原码值),标志使用的编码格式是UTF-16BE(Java中只用Big Endian) Arrays.toString(arr); // 忽视开头的标识,98, 17的二进制是:01100010 00010001,组合起来就是十进制的25105 Integer.toBinaryString(a.hashCode()); // 而hash值是:25105 a.hashCode(); // 十六进制表示是:\u6211 System.out.printf("\\u%4x", (int) '我'); // \u6621的十进制值是:25105
-
Java中UTF-16的字节序标识
- 用处:编译器将UTF-8字符统一转换成UTF-16编码格式数据,因为UTF-16是定长的,方便内部随机访问,字节序标识用来标识UTF-16是编译成了哪种格式
- 分为两种:
- Big Endian(大端,简称BE),开头标识符是FE FF
- Little Endian(小端,简称LE),开头标识符为FF FE
- 简单理解是:字符串"ABC",对应十六进制内存值为41 42 43,不同的序标识为
- BE:FE FF 00 41 00 42 00 43
- LE:FF FE 41 00 42 00 43 00
-
JVM-变量在内存中的存放
- 成员变量:不管是基本数据类型还是引用数据类型,变量名和值都存放在"堆"中。
- 局部变量:调用方法的时候,会生成一个方法"栈";方法结束后,方法"栈"会被释放,同时内部的局部变量也会销毁。
- 基本类型:变量名和值存放在方法"栈"中。
- 引用类型:变量名放在方法"栈"中,指向的对象则是放在"堆"中。
-
JavaSE-变量的声明、初始化、分配内存和默认值
虽然这确实是SE阶段的最基本知识,但是目前无处可放
- 声明:指为变量指定它的数据类型,是基本数据类型还是引用数据类型。
- 初始化:给变量分配内存空间和初始值,在这里基本数据类型和引用数据类型是不同的。
- 分配内存:
- 基本数据类型:在声明的时候就已经完成了初始化为值分配了内存空间,并且设置了默认值(见下)。
- 引用数据类型:只声明的话,是只给变量在方法栈或堆中分配了内存空间,并没给值在堆中分配内存;当给引用类型变量赋null值时,会完成初始化给变量在堆中开辟一个空间大小为0的内存空间;只有给变量赋一个非null的对象的时候,才会指向定量的内存空间。
- 基本数据类型初始值(都是等价于各自类型中值为0的那个值)
类型 初始值(默认值) boolean false char /u0000(空格) byte 0 short 0 int 0 long 0L float 0.0f double 0.0d - 注:基本数据类型的默认值在变量为成员变量或者局部变量时并不一致,只有在成员变量时才会如上表所示;而在局部变量时,值则为随机值,但是不用担心,编译器不允许出现不赋初始值的局部变量。
-
未整理
- MySQL Oracle 优化补充
- druid
- SpringBoot引入本地jar包
- log4j2
- maven全整理
- ES6新特性
- Java反射
- jvm
- Mybatis 映射原理
- Session
- vim快捷键
- ElementUI
- parallelStream
- nohup.out
- SpringBoot配置日志
- springboot坑
- spring boot 配置redis 一个巨坑 报错 Unsatisfied dependency expressed through field ‘redisTemplate‘; - 还要匿名啊
- SpringBoot启动Tomcat报错LibraryNotFoundError,Can't load library:tcnative-1.dll - 苦行者的刀
- SpringBoot javax.management.InstanceNotFoundException - 罗罗诺亚F
- @MapperScan 注解和 mybatis.mapper-locations 配置两者缺一不可 - 西伯利亚虎
- MyBatis处理CLOB/BLOB类型数据,解决读取问题 - luckySnow-julyo
- git reset
- git .gitignore
- git 仓库迁移
- git clean
- git篇之clean(慎用) - 清宵寒夜
- git clean -fx -d
- spring容器对象和new对象
- Caffeine入门
- Java读取Resource
- RedisTemplate和序列化
- Java多线程
- java break out;结束双层for循环
- java多态补充
- 远程工具
- Minio
- Maven打包插件文件拷贝方法
- javap命令反编译
- java内置锁
- 倒数闩
- 中文技术文档写作规范
- Java中日志级别
- windows控制台无法编译含有中文的java程序:javac -encoding utf-8 test.java
- Java异常总结
- Oracle 执行计划