String类:
1)有两种赋值方法,一种是直接赋值,一种是传统方法(使用对象实例化)。一般来说采用直接赋值。
2)直接赋值与传统方法之间在堆栈空间中的区别:
直接赋值和传统方法在赋值的时候都需要在堆内存中开辟空间,不同的是,当进行第二个值的赋予的时候,直接赋值法会通过查找对象池,来确认有没有相同的值,如果有,则第二个值的栈内存和第一个的栈内存一样指向同一块堆内存。查找对象池来确认有没有相同的值来复用的这种方法也叫做共享设计模式。
(对象池—一个对象数组)
相比之下,传统方法只要有多少次赋值,就会在堆内存中开辟多少个空间x2,并不管堆空间中的内容是否相同。例子:String str=new String(“sss”),此处的sss的值占一个堆内存,new再创建一个新的堆内存存放sss,当str指向new的时候,原来最先开始存放sss的值的堆内存就会变成垃圾空间,从而造成空间浪费。
所以当传统方法赋值而来的String类想要进行类似于共享设计模式一样的方法,可以进行入池操作,相关命令为: String str=new String(“sss”).intern();注意!虽然传统方法进行入池后能够进行复用,但是传统方法赋值所造成的空间浪费并没有解决掉。
3)直接赋值与传统方法的比较方法:
直接赋值而来的str可以直接通过“==”来进行比较,进行的是str指向的值的值比较。
传统方法之间的比较如果使用“==”的话,是比较对象所保存的地址地址地址(重要话说三次),所以一般都会返回fasle。如果想要传统方法比较其各自指向的值的话,需要使用equals命令。
例子:str1.equals(srt2); 如此就是比较各自指向的值
4)字符串常量是String的匿名对象
String类的赋值本质上是将一个匿名的字符串赋予名字。
任何字符串常量都是String的匿名对象,该对象永远不会为NULL。
所以以后如果要判断用户输入的字符串是否符合要求的同时又要防止用户输入空,可以用
“要求”.equals(str);
5)字符串常量不可变更。
该处不可变更指的是堆内存中的变量不可变更,而不是栈指向的地址不可变更。
6)字符串的修改
字符串的修改可以通过“+”号来执行,当时String类通过+号来进行修改会产生大量的垃圾空间,不建议改变太多。
7)字符与字符串之间的相互操作
①字符串与字符数组的转换(重点)
char[] data=str.toCharArray();//此处将str中的字符串变成字符数组
String str=new String(data);//将data字符数组转换为str字符串。
②字符串与字节的转换
byte[] data=str.getBytes();//将字符串以字符数组的形式返回
String str=new String(data);//将data字节数组转换为str字符串。
③字符串之间的比较
str1.equals(str2)//str1与str2区分大小写的比较,返回true或者false
str1.equalsIgnoreCase(str2)//不区分大小写的比较
str1.compareTo(str2)//比较两个字符串的大小区别,并且返回ASCII码的差值
8)字符串的查找
①使用contains命令来判断一个子字符串是否存在:
例子:str.contains(“hello”),结果返回true或者false用来判断str字符串中有没有hello这个子字符串
②使用IndexOf命令来查找指定字符串的位置,如果找到了指定字符串,则返回位置的开始位置,否则返回-1(注:如果有多个重复内容,IndexOf只返回能找到的第一个位置)
③使用startsWith来判断字符串是否以指定字符串开头。还可以从指定位置开始判断是否以指定字符串开头。
9)字符串的替换与拆分
①替换:使用replaceAll(指定内容全部替换)或者replaceFirst(替换首个内容)。
格式:str.replaceAll/replaceFirst(”1”,”2”);把字符串中的1(部分/全部)换成2.
②拆分:String[]result = str.split(“1”);//按照1字符来拆分
String[] result = str.split(“1”,2);//按照1字符来拆分,拆成2个数组
注:若拆分的元素涉及.或者其他容易引起歧义的符号,需要使用转义字符\\来区分
注2:用于参照拆分的字符,在拆分之后会消失。
Object类
Object是所有引用数据类的父类,即所有类都可以使用Object来接收(包括类,数组,接口)
1) toString的使用方法
其他类型是输出对象的地址编码,但如果是String类使用toString,则输出内容。
所以如果需要用toString()命令来获取信息,则需要自己进行toString的覆写
2) 对象比较
Stirng类的equals()方法就是覆写Object的equals()
3) Object接收接口对象
假设msg为接口类,可以直接通过Object obj=msg;将msg接口赋给obj
所以要想偷懒不考虑类型,就用object类接收
包装类
上面说到了Object是一个对于引用数据类基本万能的类型,但是基本数据类能不能也偷个懒拐个弯用Object来接收?
完全OK,只需要使用包装类,将基本数据类型封装成一个引用数据类就可以。
包装类的实质其实是通过实例化一个对象,对象里面存放的是基本数据类型,通过引用这个实例化对象使得其中的基本数据类型转化为引用数据类,从而供Object使用。
Java中有8中数据类型,可以分成两大类的引用数据类:
① 对象型(就是Object的直接子类):Boolean和Character(char)
② 数值型(Number类的直接子类):Interge(int),Float,Double,Short,Long,Byte
包装类中对于基本数据类型的处理有两种:装箱和拆箱。但是在JDK中自动会给我们装箱拆箱,所以我们不用在意此过程是如何进行的。
注!:Interge的比较有一个大坑。在-128~127之间的Interge,可以使用==来比较。原因是在Interge的常量池产生,可以复用。而在此数值以外,就是在堆上产生数据,所以不复用,所以要使用.equals()来比较。 因此建议:interge的比较都是用.equals()来进行。
规范:(强制)POJO类(简单JAVA类)属性必须用包装数据类型
(强制)RPC方法的返回值和参数必须使用包装数据类型
(推荐)局部变量使用基本数据类型。