zoukankan      html  css  js  c++  java
  • java基础 数据类型,String,运算

    1.1数据类型

    1.1.1基本类型

      byte/8

      char/16

      short/16

      int/32

      float/32

      double/64

      long/64

      boolen/..

    boolean类型只有两个值truefalse,可以使用1bit来存储,但是具体大小没有明确规定

    Jvm会在编译 时期将boolean类型转换成int,使用1来表示true,使用0来表示false.

    Jvm支持boolean数组,但是是通过读写byte数组来实现的.

    1.1.2包装类型

    基本类型都有相对应的包装类型,基本类型与其对应的包装类之间的赋值使用自动装箱与拆箱完成.

    Integer x = 2;//装箱,调用了Integer.valuOf(2)int y = x;//拆箱调用了x.intValue()

    装箱:就是将基本类型装换为包装器类型;

    拆箱:就是将包装器类型转换为基本类型;

    好,问题来来,怎么装箱呢,怎么拆箱呢?

    (举例int,integer)

    装箱:调用包装器的valuesOf()方法实现的,(具体如何实现,后续添加),使用方法: integer a =10;//装箱

    拆箱:调用包装器的intValues()方法,使用方法 int a=10;

    1.1.3缓存池

    new Integer(123)Integer.valuOf(123)的区别在于:

     new Integer(123)每次都会新建一个对象

     Integer.valueOf(123)会使用缓存池中的对象,多次调用同一个对象

    Integer x = new Integer(123);Integer y = new Integer(123);

    System.out.println(x==y); //false

    Integer z =integer.valuesOf(123); integer c  = integer.valuesOf(123)

    System.out.println(z==c) // true

    valueOf()方法的实现比较简单,就是先判断是否在缓存池中,如果在的话,就直接返回缓存池的内容

    Java8,integer的缓存池大小默认为-128--127.

    编译器会在自动装箱过程调用valueOF()方法,因此多个值相同且值在缓存值范围内的Integer实例使用自动装箱来创建,那么就会引用相同的对象.

    Integer m= 123;Integer n=123;System.out.println(m==n);//true

    基本类型对应的缓存池如下:

    Boolean values true and flase

    All bytes values

    Short values between -128 and 127

    Int values betwee -128 and 127

    Char values between u0000 and u007F

    使用这些基本类型对应的包装类型是,如果该数值方位在缓冲池范围内,就可以直接使用缓存池中的对象

    1.2String

    1.2.1概览

    String被声明为final,因此他不可被继承(Integer等包装类也不能被继承)

    Java 8 ,String内部使用char数组储存数据

    Java9之后,String类的是实现改用bytes数组储存字符串,同时使用coder来标识使用了那种编码.

    1.2.2不可变的好处

    1可以缓存hash(什么是hash?是通过对文件内容进行加密运算得到的一组二进制值,主要用于文件校验或者签名)

    2String pool

    如果一个String对象已经被创建过了,那么就会从String Pool中取得引用,只有String是不可变的,才可能使用String pool.

    3安全性

    经常作为参数,String不可变性可以保证参数不可变,例如在作为网络连接参数的情况下如果String是可变的,那么在网络连接过程中,String被修改,改变Sting的哪一方以为现在连接的是其他主机,

    4线程安全

    String的不可变性,使他在多个线程中可以安全使用

    1.2.3String StringBuffer StringBuilder

    1可变性

     String不可变

    StringBufferStringBuilder是可变的

    2线程安全

    String是不可变,因此是线程安全的

    StringBuffer不是线程安全的

    StringBuilder是线程安全的,内部使用synchronized进行同步

    1.2.4String Pool

    字符串常量池(String Pool)保存着所有所有字符串字面量(literal Strings).这些字面量在编译时期就确定,不仅如此,还可以使用Stringintern()方法在运行过程将字符串添加到String pool.

    当一个字符串调用intern()方法是,如果String pool中已经存在一个字符串和该字符串值相等(方法内部使用equals()进行确定),那么就会返回String Pool中字符串的引用;否则就会在String pool中添加一个新的字符串,并返回这个新字符串的引用.

    String s1 = new String(“aaa”);

    String s2 = new String(“aaa”);

    System.out.println(s1==s2);//false;

    String s3=s1.intern();

    String s4=s1.intern();

    System.out.println(s3==s4);//true

    使用new String()创建了两个不同的字符串,s3s4是通过S1.intern()方法取得同一个字符串引用,intern()首先把S1引用的字符串放入到String Pool,然后返回指这个字符串引用,因此s3s4引用的是同一个字符串

    如果是采用”bbb”这种字面量的形式创建字符串,会自动地将字符串放入String pool

    String s5 =”bbb”;

    String s6 =”bbb”;

    System.out.println(s5==s6);//true

    1.2.5new String(“abc”)

    使用这种方式一共会创建两个字符串对象(当然前提是String pool 中还没有”abc”字符串对象)

    “abc”属于字符串字面量,因此在编译时期会在String pool中创建一个字符串对象,指向这个”abc”字符串字面量;

    而使用new的方式会在堆中创建一个符串对象.

  • 相关阅读:
    前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)
    steps 步骤条、时间轴
    碰撞检测经典解决方案
    延迟渲染(Deferred Shading)技术详解
    配备透明触摸屏 看3D全息投影概念手机
    预渲染技术
    APK改之理(APK IDE)修改APK简单的入门教程
    如何获取显卡的GPU占用率和显存占用情况
    图像编辑之对比度调整 亮度对比度的算法公式
    别被你的双眼所欺骗 100张神奇的视觉欺骗图
  • 原文地址:https://www.cnblogs.com/p-t-m/p/13359939.html
Copyright © 2011-2022 走看看