美文网首页
【javase06~常用类】

【javase06~常用类】

作者: 昵称该起什么好呢 | 来源:发表于2019-01-17 03:25 被阅读0次

    【部分内容来自网络,侵删】

    常用类

    Object

    object类是所有类的根类。

    toString

    返回方法的字符串形式

    equals

    判断两个对象是否相等
    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
    equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    String

    字符串常量池:

    1. class文件常量池
      在Class文件中除了有类的版本【高版本可以加载低版本】、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table)【此时没有加载进内存,也就是在文件中】,用于存放编译期生成的各种字面量和符号引用。
      下面对字面量和符号引用进行说明
      字面量
      字面量类似与我们平常说的常量,主要包括:
      (1)文本字符串:就是我们在代码中能够看到的字符串,例如String a = “aa”。其中”aa”就是字面量。
      (2)被final修饰的变量。
      符号引用
      主要包括以下常量:
      (1)类和接口和全限定名:例如对于String这个类,它的全限定名就是java/lang/String。
      (2)字段的名称和描述符:所谓字段就是类或者接口中声明的变量,包括类级别变量(static)和实例级的变量。
      方法的名称和描述符。所谓描述符就相当于方法的参数类型+返回值类型。
    2. 运行时常量池
      我们知道类加载器会加载对应的Class文件,而上面的class文件中的常量池,会在类加载后进入方法区中的运行时常量池【此时存在在内存中】。并且需要的注意的是,运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的字符串在运行时常量池只会存在一份。
      注意运行时常量池存在于方法区中。
    3. 字符串常量池
      看名字我们就可以知道字符串常量池会用来存放字符串,也就是说常量池中的文本字符串会在类加载时进入字符串常量池。
      那字符串常量池和运行时常量池是什么关系呢?上面我们说常量池中的字面量会在类加载后进入运行时常量池,其中字面量中有包括文本字符串,显然从这段文字我们可以知道字符串常量池存在于运行时常量池中。也就存在于方法区中。
      不过在周志明那本深入java虚拟机中有说到,到了JDK1.7时,字符串常量池就被移出了方法区,转移到了堆里了。
      那么我们可以推断,到了JDK1.7以及之后的版本中,运行时常量池并没有包含字符串常量池,运行时常量池存在于方法区中,而字符串常量池存在于堆中。
           String str1 = new String("1");
           解析:首先此行代码创建了两个对象,在执行前会在常量池中创建一个"1"的对象,然后执行该行代码时new一个"1"的对象存放在堆区中;然后str1指向堆区中的对象;
    
           str1.intern();
           解析:该行代码首先查看"1"字符串有没有存在在常量池中,此时存在则直接返回该常量,这里返回后没有引用接受他,【假如不存在的话在 jdk1.6中会在常量池中建立该常量,在jdk1.7以后会把堆中该对象的引用放在常量池中】
    
           String str2 = "1";
           解析:此时"1"已经存在在常量池中,str2指向常量池中的对象;
    
    
           System.out.println(str1 == str2);  //结果是 false or true?
           解析:str1指向堆区的对象,str2指向常量池中的对象,两个引用指向的地址不同,输入false;
    
           String str3 = new String("2") + new String("2");
           解析:此行代码执行的底层执行过程是 首先使用StringBuffer的append方法将"2"和"2"拼接在一块,然后调用toString方法new出“22”;所以此时的“22”字符串是创建在堆区的;
    
           str3.intern();
           解析:此行代码执行时字符串常量池中没有"22",所以此时在jdk1.6中会在字符串常量池中创建"22",而在jdk1.7以后会把堆中该对象的引用放在常量池中;
           String str4 = "22";
           解析:此时的str4在jdk1.6中会指向方法区,而在jdk1,7中会指向堆区;
           System.out.println(str3 == str4); //结果是 false or true?
           解析:很明显了 jdk1.6中为false 在jdk1.7中为true;
    
           String str1 = "aaa";
           解析:str1指向方法区;
    
           String str2 = "bbb";
           解析: str2 指向方法区
    
           String str3 = "aaabbb";
           解析:str3指向方法区
    
           String str4 = str1 + str2;
           解析:此行代码上边已经说过原理。str4指向堆区
    
           String str5 = "aaa" + "bbb";
           解析:该行代码重点说明一下,jvm对其有优化处理,也就是在编译阶段就会将这两个字符串常量进行拼接,也就是"aaabbb";所以他是在方法区中的;’
    
           System.out.println(str3 == str4); // false or true
           解析:很明显 为false, 一个指向堆 一个指向方法区
    
           System.out.println(str3 == str4.intern()); // true or false
           解析:jdk1.6中str4.intern会把“aaabbb”放在方法区,1.7后在堆区,所以在1.6中会是true 但是在1.7中是false
    
           System.out.println(str3 == str5);// true or false
           解析:都指向字符串常量区,字符串长常量区在方法区,相同的字符串只存在一份,其实这个地方在扩展一下,因为方法区的字符串常量是共享的,在两个线程同时共享这个字符串时,如果一个线程改变他会是怎么样的呢,其实这种场景下是线程安全的,jvm会将改变后的字符串常量在
           字符串常量池中重新创建一个处理,可以保证线程安全
    
           String t1 = new String("2");
           解析:创建了两个对象,t1指向堆区
           String t2 = "2";
           解析:t2指向字符串常量池
           t1.intern();
           解析:字符串常量池已经存在该字符串,直接返回;
           System.out.println(t1 == t2); //false or true
           解析:很明显 false
           String t3 = new String("2") + new String("2");
           解析:过程同问题1 t3指向堆区
           String t4 = "22";
           解析:t4 在1.6 和 1.7中指向不同
           t3.intern();
           解析: 字符串常量池中已经存在该字符串 直接返回
           System.out.println(t3 == t4); //false or true
           解析: 很明显为 false 指向不同的内存区
    
    intern

    intern函数的作用是将对应的符号常量进入特殊处理,在1.6以前 和 1.7以后有不同的处理;
      先看1.6:
          在1.6中,intern的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是在字符串常量区建立该常量;
      在1.7中:
          在1.7中,intern的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用,实际存在堆中;

    length

    返回字符串中字符的个数

    substring

    返回字符串的子字符串

    contains

    判断字符串中是否包含另一个字符串

    startsWith/endsWith

    判断字符串是否以某字符串开头/结尾

    indexOf/lastIndexOf

    返回字符串第一次/最后一次出现在字符串中的索引

    charAt

    获取对应位置的字符

    toCharArray

    将字符串转化为一个字符数组

    toUpperCase/toLowerCase

    将字符串转化为对应的大写/小写

    valueOf

    将基本数据类型转化为字符串

    StringBuffer

    可变字符串序列,同时是线程安全的

    append

    追加字符串,注意返回的是一个StringBuffer对象

    insert

    在字符串中插入字符串,返回的仍是一个StringBuffer对象

    delete

    删除字符串的子字符串,返回的仍是一个StringBuffer对象

    replace

    对字符串进行替换,返回的仍是一个StringBuffer对象

    reverese

    对字符串做反转

    StringBuilder

    可变字符串序列,但是是线程不安全的

    包装类

    基本类型 包装类型
    byte Byte
    int Integer
    short Short
    long Long
    float Float
    double Double
    boolean Boolean
    char Character
    parseXXX()

    将字符串转化为基本数据类型

    Date

    描述日期的类

    after

    测试此日期是否在指定日期之后。

    before

    测试此日期是否在指定日期之前。

    compareTo

    比较两个日期的顺序。

    getTime

    返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

    setTime

    设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。

    toString

    把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

    DateFormat

    对日期进行格式化,这是一个抽象类,使用时一般使用SimpleDateFormat类。

    getInstance

    获取实例对象

    format

    将一个日期格式化为一个字符串

    parse

    从给定字符串的开始解析文本,以生成一个日期。

    edd.png

    Calendar

    getInstance

    获取Calendar实例对象

    get

    获取字段值

    set

    设置字段值

    常量 描述
    Calendar.YEAR 年份
    Calendar.MONTH 月份
    Calendar.DATE 日期
    Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
    Calendar.HOUR 12小时制的小时
    Calendar.HOUR_OF_DAY 24小时制的小时
    Calendar.MINUTE 分钟
    Calendar.SECOND
    Calendar.DAY_OF_WEEK 星期几

    Arrays

    用于操作数组的工具类

    sort

    对数组进行排序

    toString

    打印数组

    equals

    比较两个数组是否否相等

    copyOf

    对数组进行copy

    binarySearch

    对有序数组进行二分法查找

    asList

    将数组转化为list类型的对象

    Math

    数学计算的类库

    abs

    求取绝对值

    ceil

    向下取整

    floor

    向上取整

    round

    四舍五入

    BigInteger

    任意精度的整数的类

    add

    加法运算

    subtract

    减法运算

    multiply

    乘法运算

    divide

    除法运算

    BigDecimal

    任意精度的小数类型

    add

    加法运算

    subtract

    减法运算

    multiply

    乘法运算

    divide

    除法运算

    相关文章

      网友评论

          本文标题:【javase06~常用类】

          本文链接:https://www.haomeiwen.com/subject/rcadrqtx.html