商户如何做h5商城网站是什么,wordpress手机显示图片,企业网络搭建毕业设计,山西省建设执业资格注册中心网站参考链接#xff1a; Java中的字符串类String 1
做一个积极的人 编码、改bug、提升自己 我有一个乐园#xff0c;面向编程#xff0c;春暖花开#xff01; 推荐阅读 第一季 0、Java的线程安全、单例模式、JVM内存结构等知识梳理 1、Java内存管理-程序运行过程#x…参考链接 Java中的字符串类String 1
做一个积极的人 编码、改bug、提升自己 我有一个乐园面向编程春暖花开 推荐阅读 第一季 0、Java的线程安全、单例模式、JVM内存结构等知识梳理 1、Java内存管理-程序运行过程一 2、Java内存管理-初始JVM和JVM启动流程二 3、Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结三 4、Java内存管理-掌握虚拟机类加载机制四 5、Java内存管理-掌握虚拟机类加载器五 6、Java内存管理-类加载器的核心源码和设计模式六 7、Java内存管理-掌握自定义类加载器的实现七 第一季总结由浅入深JAVA内存管理 Core Story 第二季 8、Java内存管理-愚人节new一个对象送给你八 【福利】JVM系列学习资源无套路赠送 9、Java内存管理-”一文掌握虚拟机创建对象的秘密”九 10、Java内存管理-你真的理解Java中的数据类型吗十 11、Java内存管理-Stackoverflow问答-Java是传值还是传引用十一 12、Java内存管理-探索Java中字符串String十二 实战 一文学会Java死锁和CPU 100% 问题的排查技巧 分享一位老师的人工智能教程。零基础通俗易懂风趣幽默 大家可以看看是否对自己有帮助点击这里查看【人工智能教程】。接下来进入正文。
勿在流沙筑高台出来混迟早要还的。
作为Java程序员Java 的数据类型这个是一定要知道的 但是不管是那种数据类型最终存储都要到内存中本文由浅入深对数据类型进行介绍和讲解相信读完本文你一定会有收获的会对Java数据类型有更深的了解和认识
本文地图 一、什么是位、字节、字符、字符集
位bit计算机内部存储数据的最小单位音译为比特每个二进制数字0或者1就是1个位
字节Byte:计算机**存储容量数据处理**的基本单位音译拜特8个位构成一个字节即1 byte (字节) 8 bit(位)。
一个字节能够存放的数字范围用二进制表示为00000000011111111也就是8个bit比特8个比特转换为无符号的10进制数字范围是0255转换为有符号数据一般为-128~127。 字节说明对于存储容量我们是比较熟悉的计算机存储容量大小以字节数来度量1024进位制
1024B1K千B 1024个字节等于 1KB
1024KB1M兆B
1024MB1G吉B
1024GB1T太B
还有PB、EB、ZB、YB 、NB、DB等 字符字符是一种符号同以上说的存储单位不是一回事。指计算机中使用的字母、数字、字和符号包括1、2、3、A、B、C、~·#%……—*——等等。字符一般在不同的编码字符集下面占用的字节数不同也即占用存储空间不同
编码编码就是一个编号(数字)到字符的一种映射关系集合常见的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。它们都可以被看作为字典它们规定了转化的规则按照这个规则就可以让计算机正确的表示我们的字符。
# 简单举例举例
在 ASCII 编码中一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK 编码中一个汉字字符存储需要2个字节。
在UTF-8编码中一个英文字母字符存储需要1个字节一个汉字字符储存需要3到4个字节。
在UTF-16编码中一个英文字母字符或一个汉字字符存储都需要2个字节Unicode扩展区的一些汉字存储需要4个字节。
在UTF-32编码中世界上任何字符的存储都需要4个字节。 tips:
ASCII码是最熟知字符编码编码范围为0255属于单字节编码。ASCII码编码范围太小了Java为了能够处理多字节语言编码比如中文、日文、韩文等编码范围0x0000000x10FFFF采用国际组织制定的Unicode编码集。
因为Unicode编码并非连续的所有将Unicode转换为具体的数值格式是又有多种不同的转换方式。称为Unicode Translation FormatUTF。
简单总结一下UTF-8、UTF-16、UTF-32三种转换方式都是采用字节作为编码的基本单位
转换方式特点优点缺点UTF-8变长编码1-4字节节省空间转换麻烦UTF-16固定编码2字节转换相对简单空间相对节省UTF-32固定编码4字节转换简单空间最浪费
目前使用UTF-8还是比较多节省空间还是很大的优势 在说明一点Java虚拟机内部使用的UTF-16转换方式固定使用两个字节所以java中字符char 占用 2个字节 编码这一块的内容其实挺多如需了解更多深入细节请自行查阅相关资料
二、基本数据类型和引用数据类型
有学过C语言的伙伴知道在C语言中可以声明指针类型的变量但是在Java语言中是看不到使用指针的那么Java中有没有指针呢准确的话是有的因为在Java底层有些类型是封装了指针的。在Java中根据底层是否封装了指针可以将Java的数据类型分为两类值类型和引用类型 2.1、值类型
值类型 也称为基本数据类型和基元数据类型。它的值就是一个数字一个字符或一个布尔值等。
没有封装指针的变量它们在Java中有8个包括byte、char、 short、int 、float 、long 、double、boolean。
这些基本类型首字母都是小写它们并不是类也没有属性和方法。声明值类型变量只会在栈中分配一块内存空间。 这里面还有一个知识点是: 自动类型转换和强制类型转换
自动类型转换
一般情况下Java中会将占用内存空间较低的类型转换为较高类型如 int型的变量和 long型的变量进行计算的时候会将int型转换为long型
如果两个变量占用内存空间一样但是一个是整型一个是浮点型则会将整型转换为浮点型。如int型变量与float型变量进行计算会将int型转换为float型。
强制类型转换
第一种情况提升变量的类型级别以获取精度更高的计算结果 比如 两个整型int变量进行除法运算为了精度更高强制转为long类型
第二种情况需要用占用空间较小的变量类型接受占用空间较大的变量类型。比如 int转为byte等但是要注意 转换过程中产生溢出截断的情况
上面图中内容中没有boolean类型变量进行说明因为boolean类型比较特殊。boolean类型变量只有两个值true或者false它不参与数学运算也不能与其他类型变量进行转换不管自动转换还是强制转换只是用来进行逻辑判断。
boolean类型变量的内存空间占用具有一定的不确定性理论上一个比特就可以保存boolean类型变量的值当因为内存使用的最小单位是字节那么变量不可能仅占用1/8个字节。实际中根据编译器的不同**Java会使用1~4字节来保存boolean变量。**字节内容均为0表示false。只要有字节为非0值表示true。
面试一定要注意 String 不是基本类型
2.2、引用类型
引用类型 就是底层封装指针的数据类型。这部分包含的比较多比如我们自定义或者系统的类、抽象类、接口以及数组。它们在内存中分配两块空间首先要在栈上给其引用句柄分配一块内存不存放具体数值然后对象的具体信息都存储在堆内存上如对象的属性值等最后由栈上面的引用指向堆中对象的地址。
2.3、简单示例
示例代码
public class PrettyGirl { /** * 姑娘姓字名谁 */ String name; /** * 芳龄几何 */ int age; public static void main(String[] args) { // PrettyGirl是自定义类是引用类型分配两块内存空间 PrettyGirl prettyGirl new PrettyGirl(); // String类是系统类也是引用类型分配两块内存空间 String name new String(Java ok); // int,float 是值类型只分配一块内存空间 int num 10; float price 110.10f; // 对象名.属性名访问对象的属性访问包括赋值和取值 prettyGirl.name Alice; prettyGirl.age 25; } } 通过类名 对象名 new 类名()创建对象, 在 PrettyGirl prettyGirl new PrettyGirl();这行代码在内存中就创建了两块内存空间第一块在栈中名字叫 prettyGirl它是一个引用地址并不放具体的数值第二块堆中的内存才存放具体的数值如nameage等信息。 其实数组内部也是封装引用指针即便是基本类型的数组也是如此 **数组也是引用类型**比如
int[] nums new int[]{1,4,7,3,9}; 说明 0x001 是我随便写的一个值真实的内存地址并不是这个这个值只是为了我画图方便
在多强调一点在引用类型中对于类来说要创建对象其实包括两步第一是声明对象第二是创建对象
public static void main(String[] args) { // 声明对象相当分配指针类型变量在栈中分配内存 PrettyGirl alice; // 创建对象创建具体内存空间在堆中分配内存 alice new PrettyGirl();
} 声明对象就相当于在栈中声明引用类型的变量它的内存不存放具体的数值而只存放另一块堆中内存的地址如
PrettyGirl alice; 创建对象一般使用new关键字如下代码
alice new PrettyGirl(); 上面这一行代码做了两件事情首先在堆中分配一块存放具体数值的内存然后将这个内存的首地址赋给上面声明的引用变量 其实很多时候对象的声明和创建是放在一行的如下
PrettyGirl mary new PrettyGirl(); 三、 八种基本类型的包装类和常量池
以下内容摘自参考资料1 中 8种基本类型的包装类和常量池部分内容
Java 基本类型的包装类的大部分都实现了常量池技术即Byte,Short,Integer,Long,Character,Boolean这5种包装类默认创建了数值[-128127]的相应类型的缓存数据但是超出此范围仍然会去创建新的对象。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
Integer i1 33;
Integer i2 33;
System.out.println(i1 i2);// 输出true
Integer i11 333;
Integer i22 333;
System.out.println(i11 i22);// 输出false
Double i3 1.2;
Double i4 1.2;
System.out.println(i3 i4);// 输出false 无缓存 Integer 缓存源代码
/**
*此方法将始终缓存-128到127包括端点范围内的值并可以缓存此范围之外的其他值。
*/
public static Integer valueOf(int i) { if (i IntegerCache.low i IntegerCache.high) return IntegerCache.cache[i (-IntegerCache.low)]; return new Integer(i);
} 对于Integer类型来说值在-128-127用比较是一致的超过这个区间就不行了。
应用场景
Integer i140Java 在编译的时候会直接将代码封装成Integer i1Integer.valueOf(40);从而使用常量池中的对象。Integer i1 new Integer(40);这种情况下会创建新的对象。
Integer i1 40;
Integer i2 new Integer(40);
System.out.println(i1i2);//输出false 最后在贴出阿里巴巴Java手册中对包装类使用的建议 四、本文总结
本文整体内容相对基础但是在java开发中还是非常重要注重细节和基础让写出的每一行代码都是最优的朝着这个方向努力 下一篇整理一下值传递和引用传递 敬请期待
备注 由于本人能力有限,文中若有错误之处,欢迎指正。
五、参考资料
1、可能是把Java内存区域讲的最清楚的一篇文章
2、Java语言中一个字符占几个字节 谢谢你的阅读如果您觉得这篇博文对你有帮助请点赞或者喜欢让更多的人看到祝你每天开心愉快 Java编程技术乐园一个分享编程知识的公众号。跟着老司机一起学习干货技术知识每天进步一点点让小的积累带来大的改变 扫描关注后台回复【资源】获取珍藏干货 99.9%的伙伴都很喜欢 © 每天都在变得更好的阿飞云