String类
概述
java.lang.String 类代表字符串。
Java程序中所有的字符串文字(例如 “abc” )都可以被看作是实现此类的实例。
类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写或小写的所有字符的字符串的副本。
特点
- 字符串内容不变(常量):字符串的值在创建后不能被更改。
- 因为String对象是不可变的,所以它们可以被共享。(防止资源浪费)
- “abc” 等效于 char[] data={ ‘a’ , ‘b’ , ‘c’ }
## 使用步骤
查看类
java.lang.String :此类不需要导入。
查看构造方法
public String() :初始化新创建的 String对象,以使其表示空字符序列。
public String(char[] value) :通过当前参数中的字符数组来构造新的String。
public String(byte[] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的 String。
代码实现:
public class stinglei {
public static void main(String[] args) {
//空参构造
String str1=new String();
System.out.println("第一个字符数组为:"+str1);
//根据字符数组构造
char[] st2={'L','X'};
String str2=new String (st2);
System.out.println("第二个字符数组为:"+str2);
//根据字节数组构造
byte[] str3={97,98,99};
String str4=new String (str3);
System.out.println("第三个字符数组为:"+str4);
}
}
public class demo2string {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a', 'b', 'c'};
String str3 = new String(charArray);
System.out.println(str1==str2);
System.out.println(str2==str3);
System.out.println(str1==str3);
}
}
运行结果
字符串常量池:程序当中,直接写上的双引号字符串都在字符串常量池中
对于基本类型来说== 是进行数值的比较
对于引用类型来说 ==是进行地址值的比较
上面代码中第一个字符串和第二个字符串结果为true说明地址值一样
字符串常量池基本原理
常用方法
字符串比较的方法
是进行对象的地址值比较,如果要对字符串内容比较,可以用两个方法
public boolean equals(Object obj):参数可以是任何对象,只有参数是一个字符串且内容一致才会返回true 否则返回false
equal使用注意事项:
不区分大小写的比较
public class stringcompare {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a', 'b', 'c'};
String str3 = new String(charArray);
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str3));
System.out.println(str3.equals("abc"));
}
}
区分大小写的比较
public class stringcompare {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "Abc";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
}
}
获取功能的方法
String 当中与获取相关的常用方法有:
public int length():获取字符串当中的字符个数,拿到字符串长度
public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串
public char charAt(int index):获取指定索引位置的单个字符
public int indexOf(String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1
public class stringhuoqu {
public static void main(String[] args) {
//获取字符串长度
int length="jahsfjihasjgh".length();
System.out.println(length);
//拼接字符串
String str1="Hello";
String str2="World";
String str3=str1.concat(str2);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
//获取指定索引位置的单个字符
char ch="asfdjkaf".charAt(4);
System.out.println("在四号的索引位置是:"+ch);
//查找参数字符串中在本来字符串中第一次出现的位置,若没有返回-1
String ori="sjdfhuiahsfiajd";
int num=ori.indexOf("i");
System.out.println("第一次索引值:"+num);
//若没有呢?
int num2=ori.indexOf("xunxun");
System.out.println("第一次索引值:"+num2);
}
}
转换功能的方法
public char[] toCharArray() 将当前字符串拆分成字符数组作为返回值
public byte[] getBytes() 获得当前字符串底层的字节数组
public String replace (CharSequence oldString, CharSequence newString)
将所有出现的老字符串替换成新的字符串,返回替换之后的字符串
public class changestring {
public static void main(String[] args) {
String str1 = "HelloWorld";
System.out.println(str1);
char[] str2 = str1.toCharArray();//转换成数组可以一个字一个字玩
System.out.println(str2);
byte[] str3 = str1.getBytes();//IO流常用
for (int i = 0; i < 10; i++) {
System.out.println(str3[i]);
}
//替换词汇时用到String replace
String str="How do you do?";
String str4= str.replace("o","*");
System.out.println(str);//原来字符串不变,需要重新定义一个字符串来接收
System.out.println(str4);
// 比如你打游戏时,队友的一些脏话会进行替换,大部分脏话替换成***
String lang1="会玩不,你大爷的!";//这时候就用到了我们的替换功能了
String lang2=lang1.replace("你大爷的","****");
System.out.println(lang1);//原来输出内容
System.out.println(lang2);//替换后输出内容
}
}
截取功能的方法
public String substring(int index) 截取从参数位置一直到字符串末尾的
public String substring(int begin,int end)从开始位置截取到结束位置的字符串
public class stringqq {
public static void main(String[] args) {
String str1="HelloWorld";
String str2=str1.substring(5);//从第五个位置截取
System.out.println(str2);//输出截取后的结果
System.out.println(str1);//原来字符串依旧不变
System.out.println("==========");
String str3=str1.substring(4,7);//截取从第二个到第五个
System.out.println(str3);
//下面看一个例子,来解释字符串会不会发生改变
String strA="Hello";
System.out.println(strA);//输出Hello
strA="java";
System.out.println(strA);//输出java
}
//这是不是字符串发生改变?
// 当然不是,这是两个字符串,strA当中保留的是地址值,本来它所保存的是Hello字符串的地址0x666,
// 当执行语句strA=java之后又开辟了新的字符串,并把新的字符串的地址0x999赋值给strA,所以造成了好像字符串改变的假象
//这里所说的地址值均是随意写的,并不代表真正的地址值
分割功能的方法
分割与截取有一定差距,并不是一类
public String[] splist(String regex)//按照参数规则把字符串切分为若干部分
public class stringdivid {
public static void main(String[] args) {
String str1="汛汛,520";//这是一个字符串
System.out.println(str1);//没有分割以前
String str[]=str1.split(",");//以什么作为划分依据,这里以,作为依据,
// 使用字符串数组接收
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);//分割以后
}
//注意,
// split方法参数是一个正则表达式 若以“.”作为依据进行分割,
// 必须写||.才可以实现分隔,因为当它单独出现时有单独含义。看下面的例子
String str6="汛汛.520";//使用英文句点分隔
/*String st7[]=str6.split(".");//使用英文句点作为划分依据
//看下运行结果
System.out.println(st7.length);//输出划分后的字符串数组长度,运行结果为0
for (int i = 0; i < str6.length(); i++) {
System.out.println(st7[i]);//运行结果不显示
}
*/
String st8[]=str6.split("\\.");//使用英文句点作为划分依据
//看下运行结果
System.out.println(st8.length);//长度输出结果为2
for (int i = 0; i < str6.length(); i++) {
System.out.println(st8[i]);//
}
}
}
String类的练习
1、定义一个方法,把数组{1,2,3}按照指定形式拼接成【word1#word2#word3】
分析:
准备一个int数组
定义一个方法把数组转换成字符串
用到:循环,字符串拼接,区分下是否是最后一个
public class stringpritace {
public static void main(String[] args) {
int[] arrAy = {1, 2, 3};
String str2 = get(arrAy);
System.out.println(str2);
}
public static String get(int[] arr) {
String str = "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1)
{
str += "word" + arr[i] + "]";
}else
{
str += "word" + arr[i] + "#";
}
}
return str;
}
}
2、键入一个字符串,统计出各种字符出现次数
思路:
Scanner类要使用
String str=sc.next()
定义四个变量,分别代表四种字符出现次数。
对字符串一个字一个字检查(toCharArray)方法
遍历char数组,对当前字符的种类进行判断,并且用四个变量进行++
打印输出
import java.util.Scanner;
public class stringpricate2 {
public static void main(String[] args) {
int shuzi = 0;
int daxiezimu = 0;
int xiaoxiezimu = 0;
int other = 0;
Scanner sc = new Scanner(System.in);
System.out.println("输入一串字符");
String input = sc.next();
char[] str1 = input.toCharArray();
for (int i = 0; i < str1.length; i++) {
char ch=str1[i];
if ('A' <= ch && ch <= 'Z') {
daxiezimu++;
} else if ('a' <= ch && ch <= 'z') {
xiaoxiezimu++;
} else if ('0' <= ch && ch <= '9') {
shuzi++;
} else {
other++;
}
}
System.out.println("大写字母有" + daxiezimu + "个");
System.out.println("小写字母有" + xiaoxiezimu + "个");
System.out.println("数字有" + shuzi + "个");
System.out.println("其他字符有" + other + "个");
}
}