String类

自闭症网瘾萝莉.ら 提交于 2020-02-04 02:36:42

String

 

 “==”与“equals()”的区别

 

“==” java提供的关系运算符,主要功能是进行数值相等判断的,如果用在了String对象上,表示的是内存地址数值的比较;

 

equals”是由String提供的一个方法,负责进行字符串内容的比较

 

 在开发时,如果要判断输入的内容是否是某一字符串,应将字符串写在最前面

 

 String的两种实例化方式区别:

 

方式一:直接赋值 String str = “hello”;

方式二:构造方法  String str = new String(“hello”);

 

问:采用方式一

String stra = “hello”;

String strb = “hello”;

String strc = “world”;

 

System.out.println(stra==strb)   //true

System.out.println(stra==strc)   //false

 

共享设计模式:

JVM的底层实际上会存在一个对象池(不一定只保存String对象),当代码之中使用了直接赋值的方式定义了一个String 类对象时,会将此字符串对象所使用的匿名对象入池保存。而后如果后续还有其他String类对象也采用了直接赋值的方式,并且设置了同样内容的时候,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。

 

方式二,使用构造方法实例化对象,一定要使用关键字new,一旦使用了new就表示要开辟新的堆内存空间。

String str = new String(“hello”);

 

“hello” 匿名对象,开辟堆内存空间

new  再开辟一个堆内存空间

 

总结: 如果使用的是构造方法进行String类对象的实例化的时候,那么最终的操作形式就变成了开辟两块堆内存空间(其中有一块堆内存空间将成为垃圾空间)。

 

除了内存的浪费之外,如果使用了构造方法定义的String类对象,其内容不会保存在堆内存,因为使用了关键字new开辟的心内存。如果现在希望开辟的新内存数据也可以进行对象池的保存,那么可以采用String类定义的一个手工入池的方法:public String intern();

 

 

 

Eg:

String stra = new String(“hello”).intern()//使用构造方法定义了新的内存空间而后入池

String strb = “hello”;

System.out.println(stra==strb);  //true

 

直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池之中以供下次重复使用

构造方法:会开辟两块堆内存空间,其中有一块会成为垃圾,并且不会自动入池,但是用户   可以使用intern()方法手动入池;

 

 

String类的特点:

1.String类对象的相等判断使用equals方法完成,“==”实现的是地址数值比较

2.字符串内容一旦声明则不可改变,String类对象内容的改变是依靠引用关系的变更实现的。

3.String类有两种实例化方式,使用直接赋值可以不产生垃圾空间,并且可以自动入池,不 要使用构造方法实例化

 

 

字符与字符串:

public String(char[] value)  构造  将字符数组变为String类对象

public String(char[] value,int offset, int count) 构造 将部分字符数组变成String 类对象

public char charAt(int index) 普通 取得指定下标的字符

public char[] toCharArray() 普通   将字符串变成字符数组

 

字节与字符串

字节使用byte描述,使用字节一般主要用于数据的传输或者进行编码转换的时候使用

 

public String(byte[] bytes)

public String(byte[] bytes, int offset, int length)

public byte[] getBytes()

public byte[] getBytes(String charsetName)  throws UnsupportedEncodingException

 

 

字符串比较

public boolean equals(String anObject)

public boolean equalsIgnoreCase(String anotherString)

 

 

public int compareTo(String anotherString)

判断两个字符串的大小,按照字符编码比较。此方法的返回值有三种结果:

1. = 0 表示要比较的两个自发性内容相等

2. > 0 表示大于的结果

3. < 0 表示小于的结果

String str1 = Hello;

String str2 = HEllo;

Str1.compareTo(str2)  =32

 

查找字符串的方法

public boolean contains(String s)

public int indexOf(String str) 由前向后查找指定字符串的位置,如果找到了则返回(第一个字母)位置的索引,没找到则返回-1

 

public int indexOf(int ch,int fromIndex) //由指定位置从前向后查找指定字符串的位置,找不到则返回-1

public int lastIndexOf(String str) //由后向前查找

public int lastIndexOf(String str,int fromIndex) //由指定位置从后向前。。

public boolean startsWith(String prefix)

public boolean endsWith(String suffix)

 

 

 

 

 

字符串替换

public String replaceAll(String regex,String replacement)

public String replaceFirst(String regex,String replacement)

 

Eg:

 

 

String str = "helloworld";
String resultA = str.replaceAll("l","9");
String resultB = str.replaceFirst("l","9");
System.out.println(resultA); //he99owor9d
System.out.println(resultB); //he9loworld

 

 

字符串截取

public String substring(int beginIndex)//从指定索引截取到结尾

public String substring(int beginIndex, int endIndex)

//截取部分子字符串的部分 (索引从0开始)

不能使用负数作为下标

 

 

字符串拆分

public String[] split(String regex)

public String[] split(String regex,int limit)//部分拆分,如果能拆成很多部分,照数组的长度由limit决定

 

如果“hello world see you”.split(“”)此时按空字符串拆分(不是空格),表示按照每一个字符进行拆分

 

如果是一些敏感字符(正则标记)严格来讲是拆分不了的,如果真的遇见则用 “\\”(转义)侯进行拆分

 

trim() 去掉前后的空格,中间空格不处理

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!