类型

类型

基本数据类型

总览

类型后面的数字代表占用的字节数。

  1. 整数类型:byte1 short2 int4 long8

  2. 浮点数类型:float4 double8

  3. 字符类型:char2

  4. 布尔类型:boolean //注意:虽然布尔类型理论上只需要1字节,一般JVM会将boolean表示为4个字节的整数

整型

  • byte占用1个字节,即8个二进制位,所以表示的范围为-128~127

  • short 2 16 -32768~32767

  • int 4 32 -2147483648~2147483647

  • long 8 64 -9223372036854775808 ~ 9223372036854775807

浮点型

  • float 最大表示3.4*10^38

  • double 1.79*10^308

字符类型

  • 字符类型char 一个字符类型的变量只能保存一个Unicode字符
  • 如果要显示某个字符的Unicode编码,只需要将char变量直接赋值给int即可。
  • 可以使用\u + Unicode编码表示一个字符【例:char c = '\u0041'表示字符A】

数据类型小技巧

  • 当输入一个比较长的数字,可以加下划线便于读位,2_000_000_000

  • 0x代表16进制

  • 0b代表二进制

  • long l = 9000000000000000000L;//long型变量的结尾需要加L

  • float f1 = 3.14f;//float型变量的结尾需要加上f后缀

  • char类型使用单引号

  • 字符串类型才使用双引号【注:字符串类型不是基本数据类型,而是引用类型】

基本类型的强制转换

  • 手动强制转换

    正数和负数都是将小数部分直接略去,如下:

    a = (int) -12.7;
    System.out.println(a);
    

    返回结果为

    -12
    

    而不是13。

  • 强制转换超范围:

    如果某数太大,超过了某需要强制转换的类型的最大值,那么就返回该强制类型的最大值。

  • 利用强制转换实现四舍五入:

    如果需要进行四舍五入,在原数基础上统一加上0.5后强制转换为int。

基本类型的自动转换

  • 简单运算 & 复杂运算

    简单运算可以自动转换,但是复杂的四则运算不会出现自动提升的情况

    double = 1.2 + 24 / 5;
    

    运算结果为

    5.2
    

    是因为24/5计算为4,如果需要精确结果,需要将24/5变成24.0/5

引用类型

字符串类型String:

  • 使用格式:

    String s = "..." 
    
  • 转义:"\"

  • 字符串的连接:

    • JVM13之前:

      一般采用+ 进行连接。对于多行字符串的连接,只使用“+”,会不方便,例如

      String s = "first line\n" + "second line\n" + "end";
      
      • 字符串变量可以合并之后再打印,
        String a,b,c;
        c = a + " " + b;
        System.out.println(c);
        
    • Java13之后:

      采用三对双引号"""..."""

      String s = """
                  first line
                  second line
                  end
                  """
      //代码占位4行,因为结尾的"""没跟end写在同一行,那么就相当于在end后面加了个\n。
      

      像这种java13的新特性,在编译的时候,需要给编译器加上参数:

      java --source 13 --enable-preview Main.java
      
  • 基本类型自动转换成字符串类型:

    如果字符串和其他类型的变量进行连接,其他类型的变量会自动转为字符串。

  • 内存地址问题:

    字符串定义后,就固定在了内存地址中的某个地方。再给String类型的s变量赋值时,可以赋值成功,但是只是将s这个指针指到别的内存地址中去了,原字符串的数据还在原来的内存地址中。

    数组类型和字符串类型都是引用类型,其本身不会发生变化,动的只是指针,如果将ns[1]修改了值,不是原地址的值发生了改变,而是ns[1]指向了个新的地址。

  • 空值 & 空字符串

    完全不同,空值null表示不存在,没有分配内存地址。空字符串,已经分配了内存地址,只是内部存储的数据是空的。

  • 小技巧:

    1. 想让字符连接成字符串,需要在打印的语句中,包含”“空字符串,然后就能将所有的字符变量升级成为字符串变量。用到了上面提到了基本类型自动转换。

数组类型

  • 默认值:

    数组变量未初始化时,

    • 整型(byte, short, int, long)默认为0

    • 浮点型(float, double)默认为0.0

    • 布尔型默认为false

  • 创建方法:

    创建数组变量的时候,需要new一个数组变量

    int[] ns = new int[5];
    
  • 索引:

    创建好了之后,可以根据索引,改变数组中元素的值,索引从0开始。

  • 常用方法:

    获取数组元素的个数采用方法.length

    int[] ns = new int[5];
    ns.length;
    
  • 初始化数组有三种方法

    1.  int[] ns = new int[];
       ns = {1,3,5,7,9};
      
    2. int[] ns = new int[] {1,3,5,7,9};
      
    3.  int[] ns = {1,3,5,7,9};
      
      
  • 小技巧:

    1. new数组的时候,不必手动写出数组的大小,而可以在new后边写一个集合,由编译器自动推算数组元素个数。

数组详解

  • 一维数组:

    遍历打印数组有一个好的方法

    import java.util.Arrays;
    public class Main{
        public static void main(String[] args){
            int[] ns = {1, 1, 2, 3, 5, 8};
            System.out.println(Arrays.toString(ns));
        }
    }
    

    打印数组,利用Array包中的.toString方法。

  • 一维数组排序:

    可以手动写算法,也可以用JDK提供的Arrays.sort()方法进行排序。

    import java.util.Arrays;
    public class Main{
        public static void main(String[] args){
            int[] ns = {28,12,89,73,65,18,96,50,8,36};
            Arrays.sort(ns);//先排序(该方法是升序排列)
            System.out.println(Arrays.toString(ns));//后打印
        }
    }
    

    【注】:对数组排序,数组本身就发生了变化(某地址中存储的值发生了交换),对字符串进行排序,只是指针的指向发生了改变。

  • 多维数组:
    .length方法时,多维数组显示的是高维数组的的个数,不是所有元素的个数。

    例如:

    int[][] = {
        {1,2,3,4},
        {5,6},
        {7,8,9}
    };
    

    输出多维数组可以使用双层for循环,然后进行打印,也可以用Arrays方法中的.deepToString()方法进行打印。

判断引用类型变量是否相等:

  1. ==

    ==”可以判断值类型的变量是否相等,但是用在引用类型身上,却只能判断其是否指向同一个对象。

  2. equals()

    如果要判断引用类型变量的是否相等,就需要使用equals()方法。

    if (s1.equals(s2))
        System.out.println("xxx");
    

包装类型

包装类型的引入

  • 引用类型可以赋值为null,但是基本类型不可以。

  • 有时候想将基本类型变成引用类型,从而生成实例,但基本类型是没办法生成实例的。为了解决这个问题,java提供了一种包装类,可以将基本类型包装成引用类型。如下代码创建了一个int类型的包装类:

    public class Integer{
        private int value;
        public Integer(int value){
            this.value = value;
        }
        public int intValue(){
            return this.value;
        }
    }
    

    Integer就叫做基本类型int的包装类。

包装类型的种类

  • Java核心库为每种基本类型都提供了对应的包装类型:

    • boolean & java.lang.Boolean

    • byte & java.lang.Byte

    • short & java.lang.Short

    • int & java.lang.Integer

    • long & java.lang.Long

    • float & java.lang.Float

    • double & java.lang.Double

    • char & java.lang.Character

    可以直接使用,不用自行定义。

自动装箱与拆箱

  • 基本类型自动变成包装类型,称为自动装箱Auto Boxing.将Integer自动变成int,称为自动拆箱Auto Unboxing。自动装箱与自动拆箱会影响代码的执行效率。如果将包装类赋值为null,再拆箱为基本类型,会报NullPointerException.

包装类型的特点

  • 不变类:所有的包装类型都是不变类(不可继承,不可重新赋值),Integer的源码中,其核心代码为

    public final class Integer{ //不可继承
        private final int value; //不可重新赋值
    }
    
  • 注:对Integer等引用类型的实例进行比较,不可使用“==”,而要使用.equal()

包装类Integer中的常用方法

  • Integer 类本身提供了大量方法,最常用的静态方法
    1. parseInt() 可以把字符串解析为一个整数。里面是可变参数,一个字符串,一个进制数。

    2. toString()还可以将整数格式化为指定进制的字符串。还有

      1. toHexString()
      2. toOctalString()
      3. toBinaryString()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容