Java基础2:基本数据类型与常量池

Java基础2:基本数据类型与常量池

基本数据类型的大小

int 32位 4字节  short 16位float 32位double 64位long 64位char 16位byte 8位boolean 1位//自动拆箱和装箱的意思就是,计算数值时,integer会自动转为int进行计算。//而当int传入类型为integer的引用时,int数值又会被包装为integer。

自动拆箱和装箱

//基本数据类型的常量池是-128到127之间。// 在这个范围中的基本数据类的包装类可以自动拆箱,比较时直接比较数值大小。public static void main(String[] args) {    //int的自动拆箱和装箱只在-128到127范围中进行,超过该范围的两个integer的 == 判断是会返回false的。    Integer a1 = 128;    Integer a2 = -128;    Integer a3 = -128;    Integer a4 = 128;    System.out.println(a1 == a4);    System.out.println(a2 == a3);Byte b1 = 127;Byte b2 = 127;Byte b3 = -128;Byte b4 = -128;//byte都是相等的,因为范围就在-128到127之间System.out.println(b1 == b2);System.out.println(b3 == b4);?//Long c1 = 128L;Long c2 = 128L;Long c3 = -128L;Long c4 = -128L;System.out.println(c1 == c2);System.out.println(c3 == c4);?//char没有负值//发现char也是在0到127之间自动拆箱Character d1 = 128;Character d2 = 128;Character d3 = 127;Character d4 = 127;System.out.println(d1 == d2);System.out.println(d3 == d4);Integer i = 10;Byte b = 10;//比较Byte和Integer.两个对象无法直接比较,报错//System.out.println(i == b);System.out.println("i == b " + i.equals(b));//答案是false,因为包装类的比较时先比较是否是同一个类,不是的话直接返回false.int ii = 128;short ss = 128;long ll = 128;char cc = 128;System.out.println("ii == bb " + (ii == ss)); System.out.println("ii == ll " + (ii == ll));System.out.println("ii == cc " + (ii == cc));//这时候都是true,因为基本数据类型直接比较值,值一样就可以。

总结:注意基本数据类型的拆箱装箱,以及对常量池的理解。

基本数据类型的存储方式 上面自动拆箱和装箱的原理其实与常量池有关。 3.1存在栈中: public void(int a) { int i = 1; int j = 1; } 方法中的i 存在虚拟机栈的局部变量表里,i是一个引用,j也是一个引用,它们都指向局部变量表里的整型值 1. int a是传值引用,所以a也会存在局部变量表。

3.2存在堆里: class A{ int i = 1; A a = new A(); } i是类的成员变量。类实例化的对象存在堆中,所以成员变量也存在堆中,引用a存的是对象的地址,引用i存的是值,这个值1也会存在堆中。可以理解为引用i指向了这个值1。也可以理解为i就是1.

3.3包装类对象怎么存 其实我们说的常量池也可以叫对象池。 比如String a= new String("a").intern()时会先在常量池找是否有“a"对象如果有的话直接返回“a"对象在常量池的地址,即让引用a指向常量”a"对象的内存地址。 public native String intern(); Integer也是同理。

下图是Integer类型在常量池中查找同值对象的方法。

public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}private static class IntegerCache {    static final int low = -128;    static final int high;    static final Integer cache[];static {    // high value may be configured by property    int h = 127;    String integerCacheHighPropValue =        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");    if (integerCacheHighPropValue != null) {        try {            int i = parseInt(integerCacheHighPropValue);            i = Math.max(i, 127);            // Maximum array size is Integer.MAX_VALUE            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);        } catch( NumberFormatException nfe) {            // If the property cannot be parsed into an int, ignore it.        }    }    high = h;?    cache = new Integer[(high - low) + 1];    int j = low;    for(int k = 0; k < cache.length; k++)        cache[k] = new Integer(j++);?    // range [-128, 127] must be interned (JLS7 5.1.7)    assert IntegerCache.high >= 127;}?private IntegerCache() {}

所以基本数据类型的包装类型可以在常量池查找对应值的对象,找不到就会自动在常量池创建该值的对象。

而String类型可以通过intern来完成这个操作。

JDK1.7后,常量池被放入到堆空间中,这导致intern()函数的功能不同,具体怎么个不同法,且看看下面代码,这个例子是网上流传较广的一个例子,分析图也是直接粘贴过来的,这里我会用自己的理解去解释这个例子:

// java view plain copyString s = new String("1");  s.intern();  String s2 = "1";  System.out.println(s == s2);  ?String s3 = new String("1") + new String("1");  s3.intern();  String s4 = "11";  System.out.println(s3 == s4);  输出结果为:?[java] view plain copy//JDK1.6以及以下:false false  //JDK1.7以及以上:false true

JDK1.6查找到常量池存在相同值的对象时会直接返回该对象的地址。

JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别,区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引用。

那么其他字符串在常量池找值时就会返回另一个堆中对象的地址。

原文地址:https://www.cnblogs.com/itxiaok/p/10356491.html

时间: 2024-10-12 14:53:49

Java基础2:基本数据类型与常量池的相关文章

JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中,用户可以通过指定数据类型和标识符来声明变量,其基本语法为: DataType identifier; 或 DataType identifier = value; 其中,DataType是变量类型,如int/string/char/double/boolean等:identifier是变量名称,即标识符:value就是声明变量的值. 注: a.标识符由数字0-9.大小写字母.下划线.美元符号.人民币符号以及所有

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

java 基础笔记 基本数据类型对象包装类

基本数据类型对象包装类: 为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作. 用于描述该对象的类就称为基本数据类型对象包装类. 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char   Character boolean Boolean 该包装对象主要用于基本类型和字符串之间的转换. 基本类型-->字符串 1.基本类型数据+"&quo

Java基础 (2) - 基本数据类型及包装类

关键字位数.常量池.包装类(自动装拆箱) 8种基本数据类型整数类型:byte,short,int,long浮点数类型:float,double字符类型:char布尔类型:boolean 位数1.JVM规范中,boolean作为int处理,占4字节 ,boolean数组当做byte数组,占1个字节.2.byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256. 包装类能解决1.基本类型并不具备对象的特性: 没有成员变量,方法可以调用.2.不支持面向对

Java核心知识点-JVM结构之常量池

触摸java常量池 java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转指令,这个太高深,小菜不懂. 本地方法栈是jvm调用操作系统方法所使用的栈. 虚拟机栈是jvm执行java代码所使用的栈. 方法区存放了一些常量.静态变量.类信息等,可以理解成class文件在内存中的存放位置. 虚拟机堆是jvm执行java代码所使用的堆. Java中的

基本数据类型的常量池与String类型常量池解析

抛出样例: Integer a1  = new Integer(123);        Integer a2  = new Integer(123);        System.out.println(a1 == a2);   //false  因为只要遇到new关键词,肯定会在堆里面重新分配空间给实例对象,所以两个地址肯定不同                a1  = 123;        a2  = 123;        System.out.println(a1 == a2); 

Java中堆、栈、常量池等概念解析

程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹. (2) 栈(stack) 存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)

Java虚拟机OOM之运行时常量池溢出(5)

如果要向运行时常量池中添加内容,最简单的做法就是使用 String.intern()这个 Native 方法.该方法的作用是:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的String 对象:否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize 和-XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量代码运行时常量池导致的内存溢出异

2 Java基础语法(keyword,标识符,凝视,常量,进制转换,变量,数据类型,数据类型转换)

1:keyword(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 所有小写. (3)注意事项: A:goto和const作为保留字存在. B:类似于Notepad++这种高级记事本会对keyword有特殊颜色标记 2:标识符(掌握) (1)就是给类,接口.方法,变量等起名字的字符序列 (2)组成规则: A:英文大写和小写字母 B:数字 C:$和_ (3)注意事项: A:不能以数字开头 B:不能是java中的keyword C:区分大写和小写 (4)常见的命名规则(见名知意) A: