String类俩种实例化方式
字符串相等比较*
string类匿名对象---字符串常量
String类不可变更操作*
对象池*
String类提供的方法
作为javase的一个类,String也存在构造方法,对于String对象的实例化可以通过直接赋值、构造方法初始化俩种方式。
1.比较字符串:equals()方法。
比较大小通常有俩种方式:
1)==
2)equals()
在比较String对象的时候,我们会发现这俩种方式存在着很大的区别:
1)==:数值的比较,比较的是对象的内存地址数值。
2)equals():进行字符串内容的比较。
2.字符串常量---String类的匿名对象。
java中本身没有字符串常量的概念,基本上都是string类匿名对象。
在这里补充一点点小知识:
如果在以后开发中,string匿名对象需要和一个用户输入的字符串比较,
那么匿名对象要写在字符串前面:"字符串常量".equals(str),
这是为了避免用户输入的str=null出现NullPointerException
3.String类俩种实例化的区别
1)直接赋值
连续多次采用直接赋值的方式进行String对象实例化,并且赋同一个值
用“==”对这些对象进行比较,会发现结果都为true
之前说过“==”比较的是对象所在内存的地址
因此"这些对象都指向同一块栈内存"
在实例化第一个对象后,"再没有开辟新的内存",why?
(“String类的设计采用共享设计模式”)
在这里引入一个"对象池","JVM底层会自动维护一个对象池(字符串对象池)",
当采用直接赋值的方式进行string对象的实例化时,那么该实例化对象(内容)会"自动保存"在这个对象池中,
当"下次再"次采用直接赋值方式进行实例化时,
此时对象池中如"有指定内容,则直接引用";
否则,开辟新的字符串对象将其保存在对象池中‘供下次使用“。
对象池:--一个对象数组(为了减少开销)
2)构造方法
对 String str = new String("hello");进行分析
①此方式会开辟俩块堆内存空间:
一块为垃圾空间:存着"hello"
另一块是new的空间,也存"hello",由堆指向
②对共享存在影响,new的String对象不会自动入池,
但是采用public native String intern()会进行手工入池
String str = new String("hello").intern;
3)"区别"
直接赋值:只会开辟一块栈内存空间,并且可以数据共享(字符串对象自动存入对象池供下次使用)
构造方法:会开辟俩块栈内存空间,其中一块是垃圾空间,
不会自动保存在对象池中,但是可以采用intern()手工入池;
5.字符串常量不可变更
对字符串进行"+"操作时,"栈的指向在变;而内容没变",只是存放"内容的空间成为了垃圾空间"而已。
当进行大量字符串改变的操作时,就会产生大量的垃圾空间
使用String原则:
1.采用直接赋值进行赋值
2.采用equals()进行比较
3.不要过多对string对象进行改变操作
6.String中提供的灰常good的方法。
1)字符与字符串相互转换***
1.String->char[]
public char[] toCharArray(String str)
2.char[]->String
public String(char[] value)
public String(char[] value,int offset,int length);
3.String->char
public char toChar(int index);
4.取得字符串长度
public int length();
2)字节与字符串
1.byte[]->String
public String(byte[] values);
2.String->byte[]
public byte[] getBytes(String str);
3.String->byte 按照指定编码
public byte[] getbytes(String chareseName);
3)字符串比较
区分大小写:
public boolean equals(Object obj);
public int compareTo(String anothorString);
返回值:== 0 俩个字符串相等
>0 大于比较anothor对象
<0 小于比较another对象
不区分大小写:
public boolean equalsIanoreCase(String str);
4)字符串查找*******
public boolean contains(String str);
public boolean startsWith(String str);
public boolean startsWith(Stirng str,int dex);//指定位置开始
public boolean endsWith(String str);
5)字符串替换----与正则表达式有关
public String replaceAll(String regex,String repalxement);
//替换所有的regex为replacement
public String replaceFirst(String regex,String replacement);
//替换遇到的第一个regex为replacement
6)字符串拆分
public String[] split(String regex);
public String[] aplit(String regex ,int limit);
//数组长度是limit
7)字符串截取
public String substring(int beginIndex); //从指定位置到结尾
public String substring(int beginIndex,int endIndex);
//截取指定内容
8)其他方法
public String trim();去掉左右空格,保留中间空格
public String toUpperCase();转大写
public String toLowerCase();转小写
public boolean isEmpty();
判断字符串是否为空字符串(长度为0),不能判空
str != null ||str.isEmpty