java特殊类---String

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

猜你喜欢

转载自blog.csdn.net/hgelin/article/details/87909036