zoukankan      html  css  js  c++  java
  • 疯狂Java学习笔记(014)常用包类、包装类

     接下来,将介绍常用类和包装类。

    包括以下:

    1.String类;

    2.StringBuffer类;

    3.StringBuilder类;

    4.Object类

    5.包装类

    6.System类

    7.SimpleDateFormat类

    8.Date类

    9.Array类

    ---------------------------------------------------------------------------------------------------------

    一、String类的常用方法:

    1.概念:字符串是一个比较特殊的对象,可以用new,也可以不用来创建对象。

      区别:一个在堆中,一个在常量池中。

      常量池:方法区的一部分,字符串在常量池里面保存一份。

    2.字符串是不可变量,一旦初始化就不可以改变

      面试题:String str1 = new String("abc");

      答案:一个或者两个,如果之前常量池里有“abc”了,就在堆中创建一个对象;

        如果常量池里没有“abc”对象,则先在常量池中把“abc”创建出来,然后再到堆空间中创建对象。

    3.String类的常用构造方法

    • char[] toCharArray();    将字符串转换成字符数组
    • int indexOf(String str);返回指定字符串在当前对象中出现的第一次索引值,如果不存在,返回-1
    • boolean startsWith(String str);是否以指定字符串开头
    • boolean endsWith(String str);是否以指定字符串结尾
    • String trim();删除首尾空白字符,返回新的字符串.
    • String[] split(String reg);用指定的字符串切割字符串对象,返回被切割后的字符串组成的数组!
    • String substring(int beginIndex);从指定位置开始,一直到字符串末尾截取子串

    eclipse中快速跟踪源码:

    在源码中,类名,方法名,成员变量等等,都可以使用ctrl键,外加鼠标点击来跟踪源码.

    以String类的equals方法为例:

       public boolean equals(Object anObject) {

            if (this == anObject) {

                return true;

            }

            if (anObject instanceof String) {

                String anotherString = (String)anObject;

                int n = value.length;

                if (n == anotherString.value.length) {

                    char v1[] = value;

                    char v2[] = anotherString.value;

                    int i = 0;

                    while (n-- != 0) {

                        if (v1[i] != v2[i])

                            return false;

                        i++;

                    }

                    return true;

                }

            }

            return false;

        }

    以后凡是遇到字符串比较的地方,都是使用equals方法,基本不会使用==.

    startswith和substring使用的案例:

    求子串在长串中出现的次数:

    优化:发现子串开头后,截取字符串直接把子串长度的字符去掉!否则还是截掉首字母!

    StringBuffer:可变的字符串缓冲区:

    内部保存数据的依然是一个字符数组!!

    只不过数组不是final修饰的,可以随时指向其它的字符数组!!!

    在外界看来,就是这个StringBuffer对象可以发生变化!

    一旦StringBuffer不想再发生变化了,就可以使用toString方法,得到一个对应的Sring对象:

    toString();转换成不可变的字符串!

    特殊方法:

    append(int x);在末尾追加内容

    insert(int index,String str);在指定位置插入内容

    delete(int start,int end);删除指定范围的内容

    String和StringBuffer的区别:

    String对象一旦发生变化,由于其内部的字符数组是final修饰的,所以是形成了一个新的对象!

    StringBuffer对象发生变化,其内部的字符数组就可以发生变化!

    StringBuilder类:

    jdk1.5出现的,非线程安全的,效率高.

    StringBuffer是线程安全的,效率低.

    线程安全:同一时刻是否只有一个线程访问资源!

    StringBuilder和StringBuffer的方法基本都一致!!区别只是是否安全而已!

    StringBuffer使用案例:

    将一个字符串中出现的单词进行反转!!!

    两种实现方式:

    1.普通的字符数组反转

    2.使用StringBuffer类特有的reverse方法进行反转!

    StringBuffer面试题:

    重点:在方法中,x表示的对象是一个内容可以改变的对象,所以,使用x调用它的方法的话,会真正的改变s1和x指向的内存地址的内容的变化!

    y是一个局部变量,这个引用变量本身的值发生的变化,不会影响到方法外!

    Object类的结构:

    Object是Java中所有类的直接父类或者是间接父类:

    其中定义的方法,在所有的类中都可以使用!jdk中提供的类,绝大多数都重写了其中的方法.

    目前使用到的方法:

    String toString():返回一个对象的字符串表示形式!一般子类都需要重写此方法!

    当一个对象被放到打印语句中,或者和字符串拼接的时候,就会调用对象的toString方法.

    jdk中的类基本都重写了此方法!

    boolean equals(Object obj):判断两个对象是否"相等"!想要判断两个对象是否相等的类,都需要重写此方法.通常是让所有的成员变量都参与比较!!!jdk中的类基本都重写了此方法!!

    int hashCode():返回一个对象的整型值表示形式!

    jdk中的类基本都重写了此方法!

    void finalize():当一个对象被垃圾回收器回收时,被垃圾回收器调用此方法!

    wait() :

    notify():

    以上两个方法在线程中讲解!!!

    包装类:

    基本数据类型只有值可以使用,对应的包装类对象中不但有基本数据类型的值,而且还包含了一些可以操作数据的方法!丰富了对数据的操作!

    八种基本数据类型都有对应的包装类:

    byte       -> Byte

    short      -> Short

    int        -> Integer

    char       -> Character

    long       -> Long

    float      -> Float

    double     -> Double

    boolean    -> Boolean

    包装类的最主要使用场景:

    将字符串转换成基本数据类型的数值!!!

    常用的是:Integer,Character

    Integer类:

    内部封装了一个int值.除此之外,还有一些有用的方法!

    构造方法:

    Integer(int value):

    Integer(String value);

    将一个int值转换成String类型的方法:

    String s = "" + 10;

    String s = new Integer(10).toString();

    String s = Integer.toString(10);

    String s = String.valueOf(10);   //使用静态方法转换int到String

    推荐第一种!!!

    自动拆装箱:

    jdk1.5之后,基本数据类型可以直接赋值给包装类对象,即:自动装箱!

    包装类对象也可以直接和基本数据类型进行算术运算,即:自动拆箱成基本数据类型!

    以Integer为例:

    自动装箱:调用的是valueOf(int)方法;

    自动拆箱:调用的是intValue()方法

    面试题:

    Integer i1 = new Integer(10);

    Integer i2 = new Integer(10);

    System.out.println(i1 == i2);//false.因为使用new关键字,肯定是创建了新的对象

    Integer i3 = 127;

    Integer i4 = 127;

    System.out.println(i3 == i4);//true.从缓存中取得对象,都是同一个对象

    Integer i5 = 128;

    Integer i6 = 128;

    System.out.println(i5 == i6);//false.超出缓存的范围,还是new新对象!

    自动装箱的方法源码:

    查看源码发现:

    若发生自动装箱操作,实际上调用的是valueOf(int)方法.

    方法中,有一个Integer对象的缓存数组.在-128 ~ +127 之间的int型值,直接从数组中返回一个Integer对象的引用!超出这个范围的才是真正的new对象!

    即:在-128 ~ +127之间的数自动装箱成的Integer对象,都是引用的同一个数组元素.所以地址值是相同的!

    BigInteger类:

    针对超过int表数范围的整型数的计算.

    常用方法:四则运算.

    BigDecimal类:

    针对浮点数的精确计算:

    注意:构造方法使用参数是字符串的,否则还是不精确的浮点数计算!

    常用方法:四则运算.

    Character类:

    内部包含一个char类型的数据.

    常用的方法:

    boolean isUpperCase(char ch)

    boolean isLowerCase(char ch)

    boolean isDigit(char ch)

    char toUpperCase(char ch)

    char toLowerCase(char ch)

    案例:统计一个字符串中各种字符的个数.

  • 相关阅读:
    Java小案例——对字符串进行加密解密
    Java基础——使用三元运算符判断一个数的奇偶性
    Java基础——字母大小写转换
    多线程实现——新龟兔赛跑
    编程面试题之——简答题(持续更新...)
    多线程之——共享数据
    多线程之——线程的状态
    Android 8.0 Oreo介绍
    Android 7.0 Nougat介绍
    Android 6.0 Marshmallow介绍
  • 原文地址:https://www.cnblogs.com/akinodoo/p/9924502.html
Copyright © 2011-2022 走看看