String是定义在java.lang包下的一个类,它不是基本数据类型。 String是不可变的,JVM使用字符串池来储存所有的字符串对象。
因为是常量类,无法被继承,且大部分的修饰也不运行字符串的值被进行改变
String s = "hello"; 和 String s = new String("hello");的区别:
从最终实现结果来说,没有任何区别,但是第一个定义方式只会创建一个内存 (如果能在常量池找到hello,则不创建空间,如果找不到则创建一块常量池空间)
而第二种方式则创建两个两个内存(new出来的对象会有堆内存,而hello如果找不到,还会创建一个常量池的内存)
例题
public static void main(String[] args) {
String s1 = "hello";//0x0001
String s2 = "word";//0x0002 //0x0003
String s3 = "helloword";
System.out.println(s3 == s1 + s2);
//输出结果为false 原因两块地址值相加不可能等于另一块地址
System.out.println(s3.equals(s1+s2));
//输出结果为true 比较的是字符串
System.out.println(s3 == "hello"+"word");
//输出结果为true 之所以为true编译器在处理这个情况就已经对这两个数据进行了拼接,所以为 true
System.out.println(s3.equals("hello"+"word"));
//输出结果为true 比较的是字符串
}
equals(Object obj):判断两个字符串的内容是否相等
equalsIgnoreCase(String anotherString):比较两个字符串是否相符,不考虑大小写问题
contains(String s):判断字符串当中是否包含某一个字符串,如果存在则返回true
startsWith(String prefix):判断字符串是否以指定字符(串)开始
endsWith(String suffix):判断字符串是否以指定字符(串)结束
isEmpty():判断字符串内容是否为空(不是判断地址)
字符串为空的几个状态
String str = "";//字符串不包含任何内容
String str = null;//字符不存在地址
String获取相关功能
String length();获取字符串的长度
char charAt(int index):根据索引位置返回一个字符
int indexOf(int ch):根据一个字符(是一个重载方法)返回该字符的第一次出现的索引位置
int indexOf(String str, int fromIndex):从指定位置开始查找字符出现的位置,索引位置不变
String substring(int beginIndex):从指定位置开始截取字符串,默认到达末尾。(包含开始位置本身)
String substring(int beginIndex, int endIndex):从指定位置开始,到指定位置结束截取字符串(包含开始位置本身,但是不包含结束位置)
byte[] getBytes():把一个字符串转换成byte的数组
byte[] getBytes(String charsetName):根据指定字符集编码,转化字符串为字节数组
char[] toCharArray():将一个字符串转换为字符数组
static String valueOf(char[] data):将一个字符数组转换成字符串(常用)
valueOf可以将任意数据类型全部转换成字符
String toLowerCase():将字符串的内容全部转换为小写
String toUpperCase():将字符串的所有内容转换为大写
String concat(String str):将两个字符串进行拼接
不变性:是一个 immutable 模式的对象,不变模式的主要作用是当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。 常量池优化:String 对象创建之后,会在字符串常量池中进⾏行缓存,下次创建同样的对象时,会直接返回缓存的引用。 final:String 类不可被继承,提⾼了系统的安全性。
(1)节省内存 由于字符串的不可变性,不同的字符串变量可以引用同一个示例来实现节省堆内存的目的。 (2) 更安全 字符串的不可变性也保证了多线程访问时的线程的安全性。 (3) hashCode 缓存 String 的 hashCode的计算和构成字符串的字符有关,由于 String 的不可变性就可以将 hashCode 缓存起来。源码中也可以看出计算过之后,下次调用 hashCode 直接返回。
线程安全的可变字符串。一个类似于String的字符串缓冲区。
StringBuffer的一个内容可变的,而String是不了变的。
StringBuffer构造:
StringBuffer():无参构造
StringBuffer(int capacity):就是构建一个指定大小缓冲区的字符串缓冲区对象。
StringBuffer(String str):构建一个带有字符串的字符串缓冲区对象
StringBuffer的常用方法:
int capacity():返回当前字符串缓存区容量大小(默认容量是16)
int length():返回字符串的长度
举例:
StringBuffer sb3 = new StringBuffer("hello");
sb3.capacity()为什么返回的是21而不是16;
字符串缓冲区的大小,固定最小是16,如果有新的数据进来,这个16大小属于保留,并不会占用。
所用新数据的进来是在原来的16的基础上+新字符串的字节大小。
StringBuffer其实底层维护还是一个字符数组。
方式一: 在创建对象的时候,通过构造添加数据
方式二: StringBuffer append(String str):将任意数据类型插入,全部会转换为String类型插入到StringBuffer缓冲区当中,返回的是缓冲区本身
方式三: StringBuffer insert(int off,String str):在指定位置(索引)将指定的数据进行插入。
StringBuffer的删除功能: StringBuffer deleteCharAt(int index):根据指定索引位置进行删除,返回本身。 StringBuffer delete(int start,int end):从指定位置开始到指定位置结束删除。
StringBuffer的替换功能: StringBuffer replace(int start,int end,String str):从指定位置开始,到指定位置结束,替换什么内容。
StringBuffer的反转功能: StringBuffer reverse();将字符串进行反转
这里并不会继续返回StringBuffer,返回的是String,同时也意味着截取的过程并不会改变StringBuffer的实际数据
String substring(int start);从指定位置开始,到末尾的截取
String substring(int start,int end):从指定位置开始到指定位置结束的截取
String 与 StringBuffer互转的的几种方式
String 转 StringBuffer
//方式一
String s = ""+a;
System.out.println(s);
//方式二
String s1 = String.valueOf(a);
System.out.println(s1);
//方式三
//int -> Integer -> String
Integer i = new Integer(a);
String s3 = i.toString();
//方式四
String s4 = Integer.toString(a);
System.out.println("----------------");
//String转int
String str = "100";
//方式一
Integer i5 = new Integer(str);
//方式二
int i6 = i5.intValue();
//方式三
int i7 = Integer.parseInt(str);
评论