String 类简介
1.String不是一个基本数据类型,只是一种JVM提供的一种已封装好的引用数据类型,底层就是char[]的特殊包装应用。
2.从JDK1.9开始String类之中的数组类型采用了byte类型数组:private final byte value []
从JDK1.8以前String类之中的数组类型采用了char类型数组:private final char value[]
String的实例化方式
1.直接赋值,创建匿名对象。
String str = "你好";
2.调用String类的构造方法
String str2 = new String(“你好”);
字符串比较
使用==对于基本数据类型是比较数据值是否相等,对于引用数据类型是比较内存地址。所以用于String类是比较的其地址。
equals()方法是比较的字符串内容是否相等。
所以比较应该是这样:
String strA = "Hello";
String strB ="Hello";
System.out.pringln(strA == strB); //false
System.out.pringln(strA.euqals(strB))//true
注意:
如果从键盘输入字符串进行比较可能接收到null值,那么系统就会显示NullPinterException异常,那么我们就可以将input.equals(“Hello”)替换成"Hello".equals(input);
equals()方法里面提供有一个可以回避null的判断,所以如果将字符串常量写在前面,那么调用equals()方法的时候永远都不可能出现“NullPointerException”,字符串是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象
字符串常量
String str = “Hello”;
这样创建的是一个String类的匿名对象,所谓的String对象的直接赋值只是将一个匿名对象设置一个具体的引用名字。
字符串修改分析
String类最大的缺点就是他是数组一旦开辟了堆空间之后长度就固定了,那么我们想修改怎么办呢?
一般的方法是这样的:
protected static void stringTest(){
String str = "Hello";//创建了一个String对象"Hello"
str += "World";//创建了一个String匿名对象“World”,然后将str与它相加开辟一个新的堆空间,
// 将str的栈修改对应到“Hello World”堆空间
str = str +"!";//匿名对象: "!" ,然后又与将两者相加,将str的栈指向新对象的堆。
System.out.println(str);
}
字符与字符串
String.charAt(int index): 获取指定位置的字符
toCharArray(): 把字符中的数据以字符数组的字符的形式返回。
字符串的操作
比较
字符串比较里面最为常用的方法就是equals()方法
NO | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean equals(String anObject) | 普通方法 | 区分大小写的相等判断 |
2 | public boolean equalsIgnoreCase(String anotherString) | 普通 | 不区分大小写的相等判断 |
3重点 | public int compareTo(String anotherString) | 普通 | 进行字符串大小比较,该方法返回一个int数据,该数据有三种取值:大于(>0),小于(<0),等于(=0) |
4 | public int compareToIgnoreCase(String str) | 普通 | 不区分大小写进行字符串大小写比较 |
查找
从一个完整的字符串之中查找子字符串的存在就属于字符串查找操作,在String类里面一共提供有如下的几个查找方法
NO | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean contains(String s) | 普通 | 判断子字符串是否存在 |
2 | public int indexOf(String str) | 普通 | 从头查找指定字符串的位置,找不到返回-1 |
3 | public int indexOf(String str,int fromIndex) | 普通 | 从指定位置查找指定字符串的位置 |
4 | public int lastIndexOf(String str) | 普通 | 由后向前查找指定字符串的位置 |
5 | public int lastIndexOf(String str,int fromIndex) | 普通 | 从指定位置由后向前查找指定字符串的位置 |
6 | public boolean startsWith(String prefix) | 普通 | 判断是否以指定的字符串开头 |
7 | public boolean startsWith(String prefix,int toffset) | 普通 | 由指定位置判断是否以指定字符串开头 |
8 | public boolean endsWith(String suffix) | 普通 | 判断是否以指定的字符串结尾 |
替换
所谓的字符串替换指的是可以通过一个指定的内容进行指定字符串的替换显示,对于替换方法主要有两个
NO | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String replaceAll(String regex,String replacement) | 普通 | 全部替换 |
2 | public String replaceFirst(String regex,String replacement) | 普通 | 替换首个 |
拆分
序号 | 名称 | 类型 | 说明 |
---|---|---|---|
1 | public String[] split(String regex) | 普通 | 按照指定的字符串全部拆分 |
2 | public String[] split(String regex,int limit) | 普通 | 按照指定的字符串拆分为指定个数 |
截取
序号 | 名称 | 类型 | 说明 |
---|---|---|---|
1 | public String subString(int beginIndex) | 普通 | 由指定索引截取到结尾 |
2 | public String subString(int beginIndex,int endIndex) | 普通 | 截取指定索引范围中的子字符串 |
格式化
Java提供了格式化数据的处理操作,类似于C语言之中的格式化输出语句,可以利用占位符实现数据的输出,对于占位符而言,常用的:字符串(%s)、字符(%c)、整数(%d)、小数(%f)等来描述。
format(String format,Object … args)
// 字符串结构:"用户id-photo-姓名.后缀"
String name = "张三." ;
int age = 18 ;
double score = 98.765321;
String str = String.format("姓名:%s,年龄:%d,成绩:%5.2f。",name,age,score); // %5.2f小数保留两位,整数保留3位
System.out.println(str);//%5.2f 5是总数,.是小数,2是小数位数
其他操作
no | 方法 | 作用 |
---|---|---|
1 | toUpperCase() | 全部大写 |
2 | toLowerCase() | 全部小写 |
3 | str.trim() | 去除两头空格后的信息,String |
4 | str.length() | 字符串长度 |
对象池
1.对象池的主要目的是实现数据的共享处理。
2.但是在Java之中对象池(常量池)实际上可以分为两种
‒ 静态常量池:指的是程序(.class)在加载的时候会自动将此程序之中保存的字符串,普通的常量,类和方法的信息等等,全部进行分配
‒ 运行时常量池:当一个程序加载之后(.class)加载之后,里面可能有一些变量
3.对象池就是在创建对象的时候,首先会对比数据池里有没有相同的,有的话就直接由连接池提供对象,提供使用完后又回收到连接池中。
4.若是用构造方法创建对象的话,就会开辟两块堆空间,其中一块会成为垃圾,不会自动入池,但是我们可以通过使用intern()方法手动入池。
参考文献
阿里云开发者社区