String
1.String类概述
java。lang.String类代表字符串。java程序中所有的字符文字(例如“abc”)都可以被看作是实现类的实例,用双引号表示。
类String中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取字符串以及创建具有翻译为大写或小写的所有字符串的副本。
内存编码
Java中,字符串在内存里使用定长Unicode编码方式的。一个中文或英文字符(char)占用两个字节(16位) 。任何字符都算一个字符长度,占两个字节.
例:在Java语言中,字符串"abcdef"在内存中所占用的字节数是12个
而访问字符长度通过length()方法访问,该方法获得的长度是当前字符串的字符长度,与内存中存储无关。
2.使用步骤
-
查看类
-
o java.lang.String :此类不需要导入。
-
查看构造方法
-
String() 创建一个空的字符串对象
-
String(String original) 根据字符串来创建一个字符串对象
-
String(char[] value) 通过字符数组来创建字符串对象
-
String(byte[] bytes) 通过字节数组来构造新的字符串对象
-
String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
代码如下:
public static void main(String[] args) {
//1.String() 创建一个空的字符串对象
String str1=new String();
System.out.println("str1: "+str1);
// 2.String(String original) 根据字符串来创建一个字符串对象
String str2=new String("abc");
System.out.println(str2);
// 3.String(char[] value) 通过字符数组来创建字符串对象
char[] chs={'A','B','C','D','E'};
String str3 = new String(chs);
System.out.println(str3);
// 4.String(byte[] bytes) 通过字节数组来构造新的字符串对象
byte[] bytes={97,98,99,100,101};
String str4 = new String(bytes);
System.out.println(str4);
// 5.String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
String str5 = new String(bytes, 1, 2);
System.out.println(str5);
}
String特点
-
字符串不变:字符串的值在创建后就不能被更改
String s1=“abc”;
s1+=“d”;
System.out.println(s1); //“abcd”
//内存中有"abc",“abcd"两个对象,s1从指向"abc”,改变指向,指向了"abcd"
-
因为String对象是不可变的,所以它们可以被共享。
String s1=“abc”;
String s2=“abc”;
//内存中只有一个"abc"对象被创建,同时被s1和s2共享。
3.常用的方法
1.判断功能的方法
- public boolean equals (Object anObject) :将此字符串与指定对象进行比较。
- public boolean equalsIgnoreCase (String anotherString) :将此字符串与指定对象进行比较,忽略大小写。
- public boolean contains(string str) :在此字符串查找是否包含指定str字符串
- public boolean startsWith(string) :在此字符串查找是否以指定str字符串开头
- public boolean endsWith(string) :在此字符串查找是否以指定str字符串结尾
- public boolean isEmpty(): 判断字符串是否为空
演示代码:
public static void main(String[] args) {
//创建字符串对象
String s1="abcd";
String s2="abcd";
String s3="ABCD";
//boolean equals(Object anObject) 将此字符串与指定对象进行比较。
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //false
System.out.println("----------------");
//boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
System.out.println(s1.equalsIgnoreCase(s2)); //true
System.out.println(s1.equalsIgnoreCase(s3)); //true
System.out.println("----------------");
//public boolean contains(string str) :在此字符串查找是否包含指定str字符串
System.out.println(s1.contains("a"));//判断s1字符串是否包含a
//public boolean startsWith(string) :在此字符串查找是否以指定str字符串开头
System.out.println(s1.startsWith("http://"));//判断s1字符串是否以http://开头
//public boolean endsWith(string) :在此字符串查找是否以指定str字符串结尾
System.out.println(s1.endsWith(".png"));//判断s1是否以.png结尾
//判断字符串是否为空
String str8 = " ";
System.out.println("str8是空字符串吗?" + str8.isEmpty());//false 因为空格也是字符,length是>0
}
注意:Object 是" 对象"的意思,也是一种引用类型。作为参数类型,表示任意对象都可以传递到方法中。
2.获取功能的方法
-
public int length () :返回此字符串的长度。
-
public String concat (String str) :将指定的字符串连接到该字符串的末尾。
-
public char charAt (int index) :返回指定索引处的 char值。
-
public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
-
public int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
-
public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
-
public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
演示代码
public static void main(String[] args) {
String str="HelloWorld";
//public int length () :返回此字符串的长度。
System.out.println(str.length());
System.out.println("---------------");
//public String concat (String str) :将指定的字符串连接到该字符串的末尾。
String str2 = str.concat("_Java");
System.out.println(str2);
System.out.println("---------------");
//public char charAt (int index) :返回指定索引处的 char值。
char c1 = str2.charAt(0);
char c2 = str2.charAt(1);
System.out.println(c1);
System.out.println(c2);
System.out.println("---------------");
//public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
int a = str.indexOf("o");
int b = str.indexOf("l");
int c = str.indexOf("ll");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("---------------");
//public int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int _a = str.lastIndexOf("o");
int _b = str.lastIndexOf("l");
System.out.println(_a);
System.out.println(_b);
System.out.println("---------------");
/*
public String substring (int beginIndex) :返回一个子字符串,
从beginIndex开始截取字符串到字符串结尾。
*/
String sub1 = str.substring(5);
System.out.println(sub1);
System.out.println("---------------");
/*
public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到
endIndex截取字符串。含beginIndex,不含endIndex。
*/
String sub2 = str.substring(2, 4);
System.out.println(sub2);
System.out.println("---------------");
}
3.转换功能的方法
-
public char[] toCharArray () :将此字符串转换为新的字符数组。
-
public byte[] getBytes () :使用平台的默认字符集将该 String编码转换为新的字节数组。
-
public String toLowerCase() :使用默认语言环境的规则将此 String所有字符转换为小写。
-
public String toUpperCase() :将此 String所有字符转换为大写,使用默认语言环境的规则。
-
public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
-
public String trim() :将字符串两端的空格字符去除。
演示代码:
public static void main(String[] args) {
String str="abcde";
//public char[] toCharArray () :将此字符串转换为新的字符数组。
char[] chars = str.toCharArray();
for(int i=0;i<chars.length;i++){
System.out.print(chars[i]+",");
}
System.out.println("\n-------------");
//public byte[] getBytes ():使用平台的默认字符集将该 String编码转换为新的字节数组。
byte[] bytes = str.getBytes();
for(int i=0;i<bytes.length;i++){
System.out.print(bytes[i]+",");
}
System.out.println("\n-------------");
//public String toLowerCase() :使用默认语言环境的规则将此 String所有字符转换为小写。
String lowerCase = str.toLowerCase();
System.out.println(lowerCase);
System.out.println("-------------");
//public String toUpperCase() :将此 String所有字符转换为大写,使用默认语言环境的规则。
String upperCase = str.toUpperCase();
System.out.println(upperCase);
System.out.println("-------------");
//public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
String str2="HelloWorld";
String str3 = str2.replace("l", "L");
System.out.println(str2); //注意,replace会返回一个新的字符串,新字符串才是被替换后的。这里输出HelloWorld
System.out.println(str3); //HeLLoWorLd
//public String trim() :将字符串两端的空格字符去除
String str4 = " HelloWorld ";
String str5 = str4.trim();
System.out.println(str5);//HelloWorld
}
CharSequence 是一个接口,也是一种引用类型。作为参数类型,可以把String对象传递到方法中。
4.分割字符串功能的方法
- public String[] split(String regex) :将此字符串按照给定的regex(规则)拆分为字符串数组。
方法演示,代码如下:
public static void main(String[] args) {
String str="你好,我叫张三,我的兴趣爱好是:打篮球";
String[] strs = str.split(","); //["你好","我叫张三","我的兴趣爱好是:打篮球"]
for(int i=0;i<strs.length;i++){
System.out.println(strs[i]);
}
}
常量池(Constant pool)
常量池也是JVM中的一块内存区域,在JDK1.6及以前,常量池是存储在方法区的,在JDK1.7之后,常量池被划分到了堆内存。常量池的东西只会保存一份
String的内存区域
通过如下代码创建的String字符串都是存储在常量池的:
String s1="abc";
String s2="abc";
System.out.println(s1==s2); //返回true
因为常量池的东西只保存一份,因此s1==s2返回的是true
String s1="abc";
String s2="ab"+"c";
System.out.println(s1==s2); //返回true
java编译器编译期间会对代码进行优化:
如果都是字符串常量进行拼接:String s2="ab"+"c"; 会被优化成String s2="abc";,在常量池只生成一个"abc"字符串常量,因此s1==s2返回的是true
字符串拼接内存图详解
代码如下:
public static void main(String[] args) {
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s1==s4); //false
System.out.println(s3==s4); //false
}
示例代码如下:
package com.gec.common;
import java.util.Arrays;
public class StringDemo {
public static void main(String[] args) {
//表示一个字符串
String str = new String("hello");
String str2 = "world";
//构造器
char[] cs = new char[] {'你','好','啊'};
String str3 = new String(cs);
System.out.println("str3:" + str3);
//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String
String str4 = new String(cs,0,cs.length-1);
System.out.println("str4:" + str4);
//charAt(int index) 返回 char指定索引处的值
char c = str2.charAt(0);
System.out.println("charAt(0):" + c );
//将指定的字符串连接到该字符串的末尾
str2 = str2.concat("!");
System.out.println("str2:" + str2);
//contains判断包含
System.out.println("str2是否包含d这个字符:" + (str2.contains("d") == true ? "包含" : "不包含"));
//测试此字符串是否以指定的后缀结尾
System.out.println("是以感叹号为后缀吗" + str2.endsWith("?"));
//测试前缀
System.out.println("是以w为前缀吗:" + str2.startsWith("w"));
String str5 = "World!";
System.out.println("str2.equals(str5):" + str2.equals(str5));
//调用忽略大小写的方法 用户名可以忽略大小写
System.out.println("str2.equalsIgnoreCase(str5):" + str2.equalsIgnoreCase(str5));
//输入 admin 去除字符串的前后空格 trim()
String str6 = " admin ";
System.out.println("str6:" + str6 + " abc");
System.out.println("str6:" + str6.trim() + " abc");
//返回指定字符第一次出现的字符串内的索引。
String str7 = "aabcdb";
System.out.println("第一次出现的b索引是:" + str7.indexOf('b'));
//判断字符串是否为空
String str8 = " ";
System.out.println("str8是空字符串吗?" + str8.isEmpty());//false 因为空格也是字符,length是>0
// 数组有length属性,String是有length方法
System.out.println("str8.length():" + str8.length());
//返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar
String str9 = "你大,爷的";
System.out.println(str9.replace("大,爷", "**"));
//将此字符串分割为给定的 regular expression的匹配
// 选中数据删除
String str10 = "1_2_3_4";
String[] split = str10.split("_");
System.out.println(Arrays.toString(split));
//返回一个字符串,该字符串是此字符串的子字符串 截取字符串
String str11 = "1234,中国是一个伟大的国家,我爱中国,我爱人民";
String substring = str11.substring(5);
System.out.println("sustring(5):" + substring);
//区间截取
String substring2 = str11.substring(5, str11.length()-1);
System.out.println(substring2);
//将字符串转换成char数组
char[] cs2 = str10.toCharArray();
for (char d : cs2) {
System.out.println(d);
}
//小写转大写
String str12 = "abc";
System.out.println("abc转大写:" + str12.toUpperCase());// char 97 65
//大写转小写
String str13 = "ABC";
System.out.println(str13 + "转小写:" + str13.toLowerCase());
}
}
```java
substring2 = str11.substring(5, str11.length()-1);
System.out.println(substring2);
//将字符串转换成char数组
char[] cs2 = str10.toCharArray();
for (char d : cs2) {
System.out.println(d);
}
//小写转大写
String str12 = "abc";
System.out.println("abc转大写:" + str12.toUpperCase());// char 97 65
//大写转小写
String str13 = "ABC";
System.out.println(str13 + "转小写:" + str13.toLowerCase());
}
}