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() 去掉前后的空格,中间空格不处理
来源:https://www.cnblogs.com/kerrys/p/7095103.html