String、Object、包装类,了解一下!!!
1.String类:
先植入一个很重要的观点:任何字符串常量都是String类的对象。
public final class String:可以看出String是用final修饰的类,是一个不可继承的类。
String类的两种实例化方式:
a.直接赋值,例如:String str = "abcd";
b.采用构造方法创建实例化对象,例如:String str = new("abcd");
上面两种实例化方式的区别就是:
1.直接赋值:只会开辟一块堆空间,而且还会将字符串对象自动保存在对象池中,以便下次使用;
2.构造方法:会开辟两块堆空间,其中一块称为垃圾空间,并且不会保存到对象池中。
String 类相等比较:
平常我们经常用“==”来进行值的比较,但是用于对象比较的时候比较的就应该为两个对象所保存的内存地址的比较。
然而,想要对字符串的的内容进行比较,需要使用String类提供的equals();
下面一起来验证两种实例化方式:
上面的代码可以看出str1与str2的地址相同,但是与str3的地址不同,但是内容相同。
String常量的不可变性:
刚开始的时候有介绍过任何字符串常量都是String类的对象。因此这个概念就可以论述为:不可变对象
例如:String str = "hello";
str = str + "world";
其中str先指向"hello",之后又开辟了一块新空间"world",再然后又开辟了一块新空间"helloworld",再让str指向这块全新 的空间,并非是直接在"hello"这块空间里直接写入world,这就是字符串的不可变性。
由于字符串一旦被声明就不可以修改里面的值,想要修改,只能修改其引用(会产生很多垃圾空间)。
因此提供了StringBuffer和StringBuilder来进行修改字符串:
使用StringBuffer进行字符串修改不会产生多余的空间,但需使用其提供的append()例:
StingBuffer buf = new StringBuffer();
buf.append("hello").append("world");
就是产生一块空间,并不会产生多余的空间。
String与StringBuffer的互相转化:
1.String转换为StringBuffer:
a.利用StringBuffer的构造方法:
例:String str = “hello”;
StringBuffer buf = new StringBuffer(str);
b.利用StringBuffer提供的append():
例:String str = “hello”;
StringBuffer buf = new StringBuffer();
buf.append(str);
2.StringBuffer转String:
利用String的toString方法:
例: StringBuffer buf = new StringBuffer();
buf.append("hello");
String str = buf.toString;
StringBuffer与StringBuilder的功能基本上是一样的,但也有些不同的地方:
1.StringBuffer采用同步处理,其大多数方法都采用synchronized关键字修饰,线程安全;StringBuilder采用异步处理,并未采用synchronized关键字修饰,相比StringBuffer来说线程不安全。
2.StringBuilderr因为采用异步处理,所以相比采用同步处理的StringBuffer的效率较高一些。
2.Object类:
Java里Object类简直是超级爸爸一样的存在。Object类默认是所有类的父类,这句话翻译过来就是所有类的对象都可以用 Object进行接收。
Object类中也有定义好的方法:
public string toString():返回对象的信息,在直接打印对象的时候,会打印出该对象的地址。而String类可以直接打印出 对象的内容是因为覆写了Object类的toSting方法。以后想打印出对象的内容需要复写Object类的toString()。
public boolean equals (Object obj):对于这个方法呢,我现在理解的是比较两个对象的地址是否相等。可以根据实际情 况覆写equals(),就等同于String 中的equals();而且呢只能用于比较引用数据类型。
Object类其实不单单只能接受对象, 它接收所有数据类型,包括 接口、类、数组。
接口本身不可以继承任何类,所以Java强制要求Object可以接受接口。
例:Object obj = new int []{1,2,3,4};
Object obj = new MessageImpl();(MessageImpl理解为一个接口的实现类)
Object真正达到了参数的统一,如果一个类希望接受所有数据类型,可用Object完成。
当然,Object类中不仅仅是以上所列出的几种方法。
3.包装类:
上面说过Object类可以接受所有数据类型.然而数据类型分为基本数据类型和引用数据类型
平时使用创建变量的时候所使用的 int i;这样创建出来的叫做基本数据类型,它跟引用数据类型的区别呢就是一个堆栈 关系的问题。
然而Object表示的是接收的是对象,而基本数据类型不具备对象的属性。
那么在接收基本数据类型是怎样完成的?
那就需要将基本数据类型进行包装为类对象;
基本数据类型 | 对应的包装类 |
int |
Integer |
short | Short |
double | Double |
byte | Byte |
float | Float |
long | Long |
boolean | Boolean |
char | Character |
在这里就牵扯出来装箱与拆箱的概念:
装箱:将基本数据类型变为包装类对象,利用包装类提供好的构造方法实现装箱。
例:Integer It = new Integer(24);//装箱
自动装箱:在JDK1.5之后提供了自动装箱
例:Integer It = 24;
实际上是执行的 Integer It = new Integer(24)操作
拆箱:将包装类对象变为基本数据类型,利用Java中提供的方法
例:int data = (new Integer(24)).intValue;
自动拆箱:int data = new Integer(24);
实际上是执行int data = (new Integer(24)).intValue操作;
对于Integer It = ?在-128——127范围内赋值,Integer对象在IntegerCache.cache开辟空间,会复用已有对象,这 个区间内的Integer值可以用“==”来 进 行判断,但是这个区间之外的所有数据都会在堆上产生,并不会复用已有对象,这 时就需要用equals()进行判断。
例:
有时候会将基本数据类型转化为字符串类型;
这是就要用到 parseXXX()来进行String类型转化为基本数据类型。XXX表示基本数据类型。
例如:
由上面的例子可以看出:
1.任何数据类型使用了“+”连接字符串,都会将其转化为字符串类型。
2.parseInt将字符串转为了int型的变量。
3.同时也可以看出来,在上面例子的22行出现了一个错误,那是因为在进行字符串转化的时候,字符串中含有非数字,导 致转换出现了错误。
然而 boolean 转换就不会受字符串中有其他字符的影响:
例:
因为 boolean 就只有两种值,只要不是 true ,那就是 false,那也就是转换过来不受影响的原因。
然而上面都是字符串转为基本数据类型,下面看看基本数据类型转为字符串的方法。
1.在上一个例子当中得出得第一个结论就可以将基本数据类型转化为字符串;
2.再就是使用每种封装类中覆写好的 toString();
3.再就是使用String类中的 valueof();
例:
可是在由于String常量的不可变性,所以,尽量少的使用“+”来进行基本数据类型向字符串转化。
包装类中同样还有很多方法需要去深究,去讨论。所以,希望大家留言评论指出一些有趣的方法跟观点,然后一起讨论讨 论,顺便我在偷个师。
好了,不多说了,抓紧时间敲代码咯!!!