类型

类型

基本数据类型

总览

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

  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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355