1、String类
1.1 String 类全称:java.lang.String
两种实例化方式:
- a、直接赋值:
String str = “fei”;
只有String类可以这样直接赋值,其他的类需要用new关键字 - b、通过构造方法实例化String对象(传统方法)
String str = new String(“fei”);(String类是一个类)
1.2字符串相等的比较方法:
public boolean equals (String anotherString):( 成员方法,使用时通过对象调用)
使用方法(比较字符串str1和str2):
str1.equals(str2);
注意:
str1 == str2 比较的是两个字符串的 地址是否相同
用equals比较字符串比较的是两个字符串的内容是否相同
看代码:
1.3 字符串常量是String类的匿名对象
具体看代码:
- 一点小建议:在以后开发工作中,如果要判断用户输入的字符串是否等同于另一个指定的字符串,一定要将指定的字符串写在equals前面,避免用户输入的是空字符串,导致空指针异常。例子如下:
在在上边说过,==与equals的区别( = = 比较的是地址而不是值),那来看看下边这段代码的执行结果:
既然 ==比较的是两个对象的地址,那么为什么这明明是两个对象,结果还是true呢???
原因是:
在JVM底层会自动维护一个字符串的对象池(本质就是一个对象数组),如果现在采用直接赋值的方式进行String类是对象实例化,该对象会自动保存在对象池中,如果下一次继续使用直接赋值的方式对String类对象进行实例化,此时对象池中若有指定内容的字符串,就会直接引用(不会再开辟新空间);如果没有该对象,则在开辟新空间并将其保存在对象池中。(如果使用的是有new的方式来实例化对象,有一个new就会开辟一块空间)
手工入池:
public native String intern(); — 这是一个本地方法
使用方法:对象.intern();
1.5 字符串常量一旦定义不可改变:
所谓字符串常量一旦定义不可改变是指:所有的语言对于字符串的底层实现,都是字符数组,数组的最大缺陷就是长度固定。在定义字符串常量时,它的内容不可改变,说到这可能有些人还是不太理解,请看下面这段代码:
虽然肉眼观察会发现字符串内容改变了,但是实际上改变的只是字符串对象的改变而非字符串常量的改变。具体分析请看下图:
因此在用字符串时,有以下几点建议:
- 字符串采用直接赋值的方式
- 字符串比较实用equals
- 字符串别进行过多的+操作
1.6 字符与字符串的相互转换的方法
- a、将字符型数组转化为字符串
public String (char[] value)
public String (char[] value, int offset, int count)//offset : 开始下标 count:数量 - b、将字符串转化为单个字符
public char charAt(int index) - c、将字符串转化为字符数组
public char[] toCharArray(); - d、取得字符串长度
public int length()
1.7 字节(byte)与字符串
- a、将字节数组转换为字符串
public String (byte[] value)
public String (byte[] value, int offset, int count) - b、将字符串转换为字节数组
public byte[] getBytes () - c、将字符串按照指定编码转为字节数组
public byte[] getBytes (String charsetName)//charsetName:编码
1.8 字符串比较
- a、不区分大小写相等比较
public boolean equalslgnoreCase (String anotherString) - b、比较两个字符串大小
public int compareTo (String anotherString)
//返回0 — 两个字符串相等
//返回大于0 — 大于比较对象
//返回小于0 — 小于比较对象
1.9 字符串查找
public boolean contains (String str) --- 判断str在本字符串中是否存在
public boolean startsWith (String str) --- 判断是否以指定字符串开头
public boolean startsWith (String str, int index) --- 判断从指定位置开始是否以指定字符串开头
public boolean endsWith (String str) ---- 判断是否以指定字符串结束
1.10 字符串替换
public Str ing replaceAll (String regex, String replacement) --- 替換所有指定内容
//其中regex表示要替换的是什么,replacement表示用什么替换
public Str ing replaceFirst (Str ing regex, Str ing replacement) --- 替換第一-次出現的指定内容
1.11 字符串拆分
public String[] split(String regex) --- 將字符串按照指定指定格式全部拆分
public String[] split(String regex, int limit)
//按.拆分要用:対象. split(str, "い\. ")
1.12 字符串截取
public String substr ing (int beginIndex) ---从指定位置截取到字符串結尾
public String substr ing (int beginIndex, int endIndex) --从指定位査截取到指定位置[) (左閉右幵)
1.13 String 类的其他方法
转大小写(全部转):
public Str ing toUpperCase(); --- 转大写
public String toLowerCase0; --- 转小写
判断字符串是否カ空(只能判断是否カ空字符串而不能判断 nul I
public boolean isEmpty() ;
注意:null.isEmpty(str) --- 会报错(空指针异常)
1.14两个sb类(********> -方便进行字符串的修改 - java, lang
StringBuffer类
- a、字符串修改
public Str ingBuffer append (各种数据类型的数据) ; - b、Str ing和Str ingBuffer的相互转换
String -> Str ingBuffer :调用Str ingBuffer的构造方法或append ()
StringBuffer -> String :调用Str ingBuffer. toStr ing(方法 - c、 字符串反转
public Str ingBuffer reverse () ;
用法: Str ingBuffer对象. reverse() ; - d、删除指定范围数据
public Str ingBuffer delete(int start, int end) ; - e、插入数据
public Str ingBuffer insert (int offset, 各种数据类型的数据)
Str ingBuild类
用法:和Str ingBuffer-样
String、StringBuffer和StringBuild三个类之间的区别:
- Str ing的内容不可修改,而两个sb可以修改内容
- Str ingBuffer采用同步处理,线程安全,效率较低
- Str ingBuilder采用异步处理,线程不安全,效率较高Str ing"+ '底层会将String -> 转为Str ingBuffer (避免产生较多的垃圾空间)
2、Object类
Object炎是Java默认提供的类
在Java中除了0bject类,所有的类都存在継承关系,默认会継承Object父类,所有类的対象都可以通辻Object类迸行接收
Object类中的常用方法:
1、toString()方法 — 取得对象信息
直接使用対象输出,默认輸出一-个地址编码,如果現在輸出的是String対象,此时輸出字符串内容而非地址,原因就在于String类覆写了Object类的toStr ing方法。
System. out. println;–系統輸出会默认凋用対象的toStr ing()方法
如果默认給出的toStr ing方法功能不足(不想輸出地址而想输出本类信息,需要在子类中覆写toStr ing方法〉
2、equals方法 — 比较对象
3、包装类
包装类 — 就是将基本类型封装到类中
3.1 包装类的分类:
- a、对象类包装类(Object 的直接子类)
Boolean(boolean的包装类)、Character(char的包装类) - b、数值类包装类
Byte(byte的包装类)、Short(short 的包装类)、Long(long的包装类)、Double(double的包装类)、Float(float的包装类)、Interger(int的包装类)
3.2 装箱与拆箱 — 基本数据类型与相应包装类的数据处理
- 装箱 :将基本数据类型变为包装类对象,利用包装类提供的方法实现装箱
- 拆箱:将包装类对象的值取出来变为基本数据类型(利用Number类提供的xxValue() 实现拆箱处理)
阿里编码规范:所有相同类型的包装类对象之间的值进行比较,全部使用equals方法
-
使用Integer定义的变量:对于Integer a = ? — 在 [-128 - 127]以内进行赋值,Integer对象会在Integer对象池中产生,如果对象存在,会复用已有对象,不会再开辟新空间,在这个区间范围以外,则数据会在堆上产生不会复用已有对象。
-
对于以后写代码中用int还是Integer,有一下几点建议:
a、[强制]所有POJO类(简单java类)的属性必须使用包装类型
b、[强制]RPC方法的返回值和参数必须使用包装类型
c、[推荐]所有的局部变量使用基本数据类型
3.3 字符串和基本数据类型的转换:
- 将字符串转为基本类型 — 调用各个包装类
.praseXX(String str)
例如:Interger.parseInt(String str); - 将基本数据类型转为字符串
a、用 “字符串”+基本数据类型
b、使用String类的valueof(基本类型,静态方法) ; — 此方法不产生垃圾空间,推荐使用