String类(java.long.String)——引用数据类型
1、String类的两种实例化方式
//直接赋值:(在堆上开辟内存)
String str = "Hello World";
System.out.println(str);
//直接赋值的方式是最为常见,但是String本身就是一个类,一定存在构造方法
//String类的构造方法:public String(String str);
//传统方式赋值:
String str = new String("Hello World");//使用关键字new进行对象实例化
System.out.println(str);
2、字符串相等比较
之前我们比较两个数是否相等使用"=="来比较,但是观察字符串使用"=="比较
//两个字符串内容相等,而比较结果为不相等
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);//false
//"=="本身是进行数值比较的,如果用于对象比较
//那么所比较的就是两个对象所保存的内存地址数值化比较,并不是对象的内容
要想进行内容比较,则必须使用String类提供的equals方法
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));//true
注意:String类中 "=="与"equals"的区别
a."==":进行数值比较,比较两个字符串对象的内存地址数值
b."equals":两个字符串内容的比较
3、字符串常量是String的匿名对象
在任何语言的底层,都不会提供有直接的字符串类型。Java中,本身也没有字符串常量的概念,所有使用""定义的内容本质上是String的匿名对象
String str1 = ("Hello");//将匿名的String类对象设置名字,匿名对象保存在堆内存中
String str2 = new String("Hello");
System.out.println(str1.equals(str2));//true
System.out.println("Hello".equals(str2));//true
//在日后的开发中。如果需要判断输入的字符串与特定的字符串是否相等,一定要将特定字符串写在前面
String str1 = null;
System.out.println("Hello".equals(str1));//false
//如果写在了后面,输入为空有可能会报错:java.lang.NullPointerException
String str1 = null;
System.out.println(str1.equals("Hello"));
4、String类两种实例化的区别
1、直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用
2、构造方法:会开辟两块堆内存空间,并且其中一块空间将变为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池
一般采取直接赋值的方式对String类对象实例化
5、字符串常量不可变更
对于字符串的底层实现都是字符数组,数组最大的缺点就是长度固定,在定义字符串常量时其内容不可改变(该地址空间中的内容不可改变)
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str); // hello world!!!
对于以上代码,表面上看起来输出的字符串 str发生了改变,但其实改变的是字符串的引用
字符串使用原则:
I、字符串实例化时采用直接赋值
II、字符串比较使用equals()
III、字符串不要做过多的改变(减少+操作)
6、字符与字符串的相互转换
//a.将字符数组转为String
public String(char[] value);//字符数组所有内容转为字符串
public String(char[] value,int offset, int count)//字符数组部分内容转为字符串
//b.将字符串转为单个字符
public char charAt(int index);//取得指定索引字符
//c.将字符串变为字符数组
String -> char[]
public char[] toCharArray();//对象.toCharArray
//取得字符串长度:public int length();
判断一个字符串是否由数字组成
//将字符串变为字符数组后判断每一位字符是否数字
public static void main(String[] args){
String str = "1abc2345";
System.out.println(isNumber(str));
}
public static boolean isNumber(String str){
char[] data = str.toCharArray();
for(int i=0; i<data.length; i++){
if (data[i] <'0' || data[i] > '9'){//不是数字,停止遍历
return false;
}
}
return true;
}
7、字节与字符串
a.将字节数组转为字符串(*********)
byte[] -> String
public String(byte[] value);//将字节数组变为字符串
public String(byte[] value,int offset, int count)//将部分字节数组变为字符串
b.将字符串转为字节数组
String -> byte[]
public byte[] getBytes();
c.将字符串按照指定编码转为字节数组
public byte[] getBytes(String Charsetname)
8、字符串比较
a.不区分大小写的相等比较
public boolean equalsIgnoreCase(String anotherString)
b.比较两个字符串的大小
public int compareTo(String anotherString);
1,返回大于 0 的数:表示大于比较对象
2,返回等于 0 的数:表示等于比较对象
3,返回小于 0 的数:表示小于比较对象
9 字符串查找
public boolean contains(String str);//判断str在本字符串中是否存在
public boolean startsWitch(String str);//判断是否以指定字符串开头
public boolean startsWitch(String str, int index); //从指定位置开始判断是否以指定字符串开头
public boolean endsWith(String str);//判断是否以指定字符串结尾
10 字符串替换
public String replaceALL(String regex, String replacement);//替换所有指定内容
public String replaceFirst(String regex,String replacement);//替换首个内容
11 字符串的拆分
public String[] split(String regex);//将字符串按照指定格式拆分
public String[] split(String regex, int limit); //将字符串部分拆分,数组长度为limit
12 字符串截取:
public String substring(int beginIndex);[ 结尾;
//从指定位置截取到字符串结尾
public String substring(int beginIndex, int endIndex);[ )
//截取部分内容
13 String类其他方法
a.去掉左右空格:
pubic String trim();
b.字符串转大小写://首字母大写
public String toUpperCase();
public String toLowerCase();
c.判断字符串是否为空:(只能判断是否为空字符串而不是null)
public String isEmpty();
14、两个sb类*********
——方便进行字符串的修改 java.lang
——StringBuffer ——StringBuilder 与String的不同点:
String 的内容不可修改,两只sb可以修改
StringBuffer采用同步处理,线程安全,效率较低
StringBuilder采用异步处理,线程不安全,效率较高
String+底层会将String —> StringBuilder
a.字符串修改:
public StringBuffer append(各种数据类型)
b.StringBuffer <-> String
StringBuffer <- String //调用StringBuffer 的构造方法过append();
StringBuffer -> String //StringBuffer toString();
c.字符串反转
public StringBuffer reverse();
d.删除指定范围的数据
public StringBuffer delete(int start, int end);
e.插入数据
public StringBuffer insert(int offset, 各种数据类型)
Object类(RealFather)
Object类是java默认提供的类。
1. java处了object类,所有的类都存在继承关系,默认会继承Object父类,所有类都可以通过Object类进行接收
2. Object的构造方法
toString -取得对象信息
直接使用对象输出,默认输出地址编码,如果现在输出的是String对象,
此时输出字符串内容而不是地址,原因在于String类覆写了Object类的toString方法
System.out.println();//系统默认调用对象的toString方法
如果默认给出的toString()方法功能不足(不行输出地址而想输出内容)——
需要在子类中覆写toString()方法
2.2 对象比较——equals()
2.3 接收引用数据类型
Object类可以接收所有引用数据类型,包括:类、数组、接口
包装类:包装类就是将基本数据类型封装到类中
1、分类
a.对象性包装类(Object的直接子类):Boolean(boolean),Character(char)
b.数值性包装类(Number的直接子类):存在数值转换异常
Byte(byte),Short(Short),Long(long),Double(double),Float(float),Integer(int)
2、装箱与拆箱:基本数据类型与相应包装类的数据处理
装箱:将基本数据类型变为包装类对象,利用每个包装类提供的构造方法实现
拆箱:将包装类中的基本数据值取出,利用NUmber类提供的 xxValue()实现
Integer i = new Integer(10);//手动装箱
int result = i.Value();//手动拆箱
Integer i1 = 10;//自动装箱
int result = i1+10;
阿里编码规范:所有相同类型的包装类对象之间的值比较,全部使用equals方法
****说明:对应Integer var = ? 在-128——127之间的赋值,Integer对象在Integer常量池中产生
,会复用已有对象。这个区间内的Integer值可以直接使用 == 判断。除此之外的所有数据
都会在堆上产生,并不会复用已有对象。
使用int还是Integer:
a.[强制]所有的POJO类(简单java类,Bean)属性必须使用包装类型
b.[强制]RPC方法的返回值类型和参数必须使用包装类型
c.[推荐]所有的局部变量使用基本数据类型
3、字符串与基本类型的转换
将字符串转为基本类型:调用各个包装类,parseXX(String str)
Integer.parseInt(Strint str)
基本类型变为字符串:
a."" + 基本类型
b.使用String类的Valueof(基本类型,静态方法),此方法不产生垃圾空间