Java 基本类型、封装类型、常量池、基本运算

基本数据类型:

byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0

int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0

long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

封装类型:Byte、Short、Integer、Long、Float、Double、Character、Boolean

1.基本类型定义出来是普通变量,在栈中开辟内存,值是多少栈中就是多少。

2.除了单个基本数据类型,其他都是引用类型,数组(包括基本类型数组)、类等。

定义的时候,执行到“=”号都是在栈中;new之后就在堆中,栈里的内容类似指针但不是地址,指向堆,堆中的内容才是数值,堆自己也有一个地址。

常量池:在堆中,可以理解成缓存数据,以后有需要的时候直接拿,不需要重新开内存。有缓存池的类是String,全开的。基本类型的封装类中,除了Double、Long、Float没有实现这个技术,其他都有缓存池,但是缓存池容纳的数据只有一个字节,即-128 - 127,超过这个范围就需要创建对象。

整型:为了避免多次创建对象,我们事先就创建好一个大小为256的Integer数组SMALL_VALUES,所以如果值在这个范围内,就可以直接返回我们事先创建好的对象就可以了。

浮点型:因为在范围内有很多小数,所以没有常量池。

装箱就是自动将基本数据类型转换为封装类型;拆箱就是自动将封装类型转换为基本数据类型。

基本运算

1.一条表达式混有多种类型,最后取最高的级别的类型

2.char类型的数据转换为高级类型(int,long等),会转换为其对应的ASCII码

3.使用+=时,不会产生类型转换

        char x=‘A‘;
        int p=3,z=x;
        System.out.println(x+" "+p+" "+z);//A 3 65
        x+=p;
        System.out.println(x+" "+p+" "+z);//D 3 65

char和+=

4.强制转化,高精度变为低精度,会损失精度

5.“==”比较的是内存地址,“equals”比较的内容,两个内容相同的对象用“==”比较是不同的,因为内存地址不同;用“equals”比较则是相同的。对于封装类型,还要考虑是否有常量池数据,如果内容在常量池有,则没有创建新的对象,如果有new则明确创建了新的对象。

6.如果基本类型和封装类型进行+、-、×、÷、==的基本运算,是自动拆箱,对基础数据类型进行运算。

7.如果基本类型和封装类型用equals比较,是自动装箱,比较值。

String是实现常量池技术的类,用“==”测试比较

package my_acm;

import java.util.ArrayList;

public class MyTest6 {
    public static void main(String []args) {
        String s0="ab";
        String s1="ab";
        String s2="cd";
        String s3="a"+"b";
        String s4=new String("ab");
        String s5=new String("cd");
        String s6="abcd";
        String s7=s1+s2;
        String s8=s4+s5;
        String s9=s6.intern();
        //这个方法首先在常量池中查找是否存在一份equal相等的字符串如果有的话就返回该字符串的引用,没有的话就将它加入到字符串常量池中
        String s10=new String("abcd");
        System.out.println("s0 "+s0.hashCode()+" "+System.identityHashCode(s0));//3015    366712642
        System.out.println("s1 "+s1.hashCode()+" "+System.identityHashCode(s1));//3105    366712642
        System.out.println("s2 "+s2.hashCode()+" "+System.identityHashCode(s2));//3169    1829164700
        System.out.println("s3 "+s3.hashCode()+" "+System.identityHashCode(s3));//3105    366712642
        System.out.println("s4 "+s4.hashCode()+" "+System.identityHashCode(s4));//3105    2018699554
        System.out.println("s5 "+s5.hashCode()+" "+System.identityHashCode(s5));//3169    1311053135
        System.out.println("s6 "+s6.hashCode()+" "+System.identityHashCode(s6));//2987074 118352462
        System.out.println("s7 "+s7.hashCode()+" "+System.identityHashCode(s7));//2987074 1550089733
        System.out.println("s8 "+s8.hashCode()+" "+System.identityHashCode(s8));//2987074 865113938
        System.out.println("s9 "+s9.hashCode()+" "+System.identityHashCode(s9));//2987074 118352462
        System.out.println("s10 "+s10.hashCode()+" "+System.identityHashCode(s10));//2987074 1442407170
        //理解成:System.identityHashCode(s0)方法返回的是内存地址,用于下面的==比较
        System.out.println(s0 == s1);//t
        System.out.println(s1 == s3);//t  常量池里自动拼接,相当于常量池里有ab、cd、abcd这3个常量
        System.out.println(s1 == s4);//f
        System.out.println(s6 == s7);//f
        //在JAVA9中,因为用的是动态调用,所以返回的是一个新的String对象。所以s6和s7,s8,s10 不是同一块堆内存
        System.out.println(s6 == s10);//f
        System.out.println(s7 == s8);//f
        System.out.println(s6 == s9);//t intern()方法使得s9的引用和s6一样
        System.out.println(s8 == s10);//f
    }
}

原文地址:https://www.cnblogs.com/shoulinniao/p/11562061.html

时间: 2024-10-11 11:46:50

Java 基本类型、封装类型、常量池、基本运算的相关文章

Java堆、栈和常量池以及相关String的详细讲解(转)

一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动

Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)

博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的

Java堆、栈和常量池以及相关String的详细讲解

一:在JAVA中,有六个不同的地方可以存储数据:   1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈(stack).位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移

Java中的String与常量池

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个类类型. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”k

Java堆、栈和常量池以及相关String的讲解

一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 堆栈(stack).位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动

Java中的String与常量池[转帖]

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null: 3. String st

基本类型包装类的常量池技术

Java的基本类型包装类中有6中实现了常量池技术: Byte , Short,Integer,Long ,Characher ,Boolean.另外两种浮点数类型Double和Float没有实现该技术. 六种实现常量池技术的包装类中Byte,Short,Integer,Long,Character这5种整型的包装类也只是在[-128,127)之间才可使用常量池,不负责创建和管理[-128,127)之外的类的对象. 首先需要了解"=="的作用: 1)若==左右两侧都是基本类型,比较的是值

java中的String类常量池详解

test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[] args){ String a = "a1"; String b = "a"+ 1; System.out.println(a==b); }//true } test2: package StringTest; public class test2 { /** *

关于Java堆、栈和常量池的详解

在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制). 2. 堆栈(stack). 位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动,则释放那些

Java内存的堆栈与常量池

1.名词解释 栈:由JVM分配区域,用于保存线程执行的动作和数据引用.栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应. 堆:由JVM分配的,用于存储对象等数据的区域. 常量池:在编译的阶段,在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池. 2.看这个例子,用JDK5+junit4.5写的例子,完全通过测试 import static org.