疯狂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)

 

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

posted @ 2018-11-07 18:12  杜菲  阅读(156)  评论(0编辑  收藏  举报