疯狂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)
案例:统计一个字符串中各种字符的个数.