JAVA 数据类型

 https://zhuanlan.zhihu.com/p/91798456

 基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,而包装类型属于对象类型,我们知道对象实例都存在于堆中。相比于对象类型, 基本数据类型占用的空间非常小

8位:Byte(字节型)

16位:short(短整型)、char(字符型)

32位:int(整型)、float(单精度型/浮点型)

64位:long(长整型)、double(双精度型)

最后一个:boolean(布尔类型)

 

 java浮点型默认为double型,所以要声明一个变量为float型时,需要在数字后面加F或者f:

整数字面量默认都是int类型,所以在定义的long类型后面要加上L或l。小于32位的变量都是按照int结果去计算的。

 

String 转其他类型

全用 valueOf()

        String s = "133";
        int n = Integer.valueOf(s);
        System.out.println(n + 10);
        String p = String.valueOf(n);
        System.out.println(p + 23);
        String ss = "133.056";
        double nn = Double.valueOf(ss);
        System.out.println(nn + 1.1);
        String pu = String.valueOf(nn);
        System.out.println(pu + "rgr");

143
13323
134.156
133.056rgr

包装类型的常量池技术

Java 基本类型的包装类的大部分都实现了常量池技术。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False 

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

 

import java.util.*;
class Main {
    public static void main(String[] args) {
        //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
      List<Integer>list = new ArrayList<>();
    //   list.add(128);
    //   list.add(128);
    //   System.out.println(list.get(0)==list.get(1));// 堆中创建对象 地址不同 false
    //   System.out.println(list.get(0).getClass());
        list.add(127);
      list.add(127);
      System.out.println(list.get(0)==list.get(1));//都在常量池中 ==即可比较
      System.out.println(list.get(0).getClass());
        //  System.out.println(list.get(0).equals(list.get(1)));
    }
}

 

两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

 

 

 类型转换

 

自动类型转换

把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。

 

 

public class Demo3 {
    public static void main(String[] args) {
        double num=10;
        System.out.println(num);
    }
}

10.0

强制类型转换

强制类型转换是大范围的数据类型转为小范围的数据类型时进行强制类型转换,需要自己去操作,这时系统就不会帮助我们去完成这个操作了。

目标数据类型 变量名 = (目标数据类型)值或者变量;

long n  =1L; 不加L默认int

int x  =(int)n;

 

        int n = Integer.MAX_VALUE;
        long x = n * (n - 1);
        System.out.println(x);
        System.out.println(n * (long) (n - 1));

-2147483646
4611686011984936962

获取数据类型

  private static String getType(Object a) {
        return a.getClass().toString();
    }
        int num1 = 56;
        System.out.println(getType(num1));
        double num2 = 23.06;
        System.out.println(getType(num2));
        boolean f = true;
        System.out.println(getType(f));
        class java.lang.Integer
        class java.lang.Double
        class java.lang.Boolean

 

什么是自动拆装箱?

  • 装箱:将基本类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本数据类型;

 原理

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue();

为什么要设计出包装类?

第一:如果你想在方法体内更新primitive类型的值,必须要使用primitive对应的object,因为前者使用的值传递,后者使用的是引用传递。

第二:java.util内操作的都是对象,如果没有PWC,会让程序员在使用这些工具类操作primitive类型时编写额外的代码。

第三:Java提供的集合框架中的数据结构,比如ArrayList和Vector,也是只能操作对象,理由跟第二点相似。

第四:多线程中也必须使用对象来完成各种同步操作。

第五:从设计理念上,在Java中,万物皆对象,为primitive类型设计出与之匹配的对象类型,更能让编程体验与设计理念融为一体!

基本数据类型 和引用数据类型区别
基本:
指向具体数值
存在 java虚拟机栈的局部变量表
值传递 不影响
占用空间小
==!=相等
引用:
指向地址
存在堆
指向同一地址 对形参修改会影响实参
equals 判断

 

 

坑点

        int a = 95527;
        System.out.println(a * a);//535473137  错的
        long b = 95527l;
        System.out.println(b * b);//9125407729  对的

 不要随意设置 

Integer.MAX_VALUE
 System.out.println(Integer.MAX_VALUE + 1); 
-2147483648

 

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
2147483647
-2147483648
int a = 2147483647l;

        int b = -2147483647l;
        System.out.println(a - b);
        System.out.println(b - a);

-2
2

显然是错的 

  class compa implements Comparator<Node> {
        public int  compare(Node x, Node y) {
            return x.val - y.val;
        }
    }
 
上面的就可能排序出错
class compa implements Comparator<Node> {
        public int compare(Node x, Node y) {
             return (x.val < y.val) ? -1 : ((x.val == y.val) ? 0 : 1); 
        }
    }
改为比较大小
long a = 2147483647l;

        long b = -2147483647l;
        System.out.println(a - b);
        System.out.println(b - a);

4294967294
-4294967294

对的

 

posted on 2022-01-06 09:39  cltt  阅读(38)  评论(0编辑  收藏  举报

导航