字符串是Java程序中经常处理的对象,如果字符串运用的不好,将影响到程序运行的效率。在Java中,字符串作为String类的实例来处理。以对象的方式处理字符串,将使字符串更加灵活、方便。
一、概述
String
类代表字符串,处于java.lang包。在Java 程序中的所有字符串字面值(如"abc"
)都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
//等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
二、构造方法
在Java程序中,如需使用String定义字符串可以直接定义也可以通过构造方法定义。在api文档中提供的构造函数如下:
//直接定义字符串
String name = "张三";
//通过构造函数定义字符串
String str = new String("李四");
三、常用的方法
在使用字符串时,经常需要对字符串进行处理,以满足一定的要求。例如:从现有的字符串中截取新的字符串,替换字符串中的部分字符,以及去掉字符串中的首尾空格等等操作。
char | charAt(int index) 返回指定索引处的 char 值。 |
int | compareTo(String anotherString) 按字典顺序比较两个字符串。 |
String | concat(String str) 将指定字符串连接到此字符串的结尾。 |
boolean | contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。 |
boolean | endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 |
boolean | equals(Object anObject) 将此字符串与指定的对象比较。 |
byte[] | getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
int | indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 |
int | lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 |
int | length() 返回此字符串的长度。 |
String | replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String[] | split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
boolean | startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 |
String | substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 |
String | substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 |
char[] | toCharArray() 将此字符串转换为一个新的字符数组。 |
String | toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
String | toString() 返回此对象本身(它已经是一个字符串!)。 |
String | toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
String | trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
static String | valueOf(Object obj) 返回 Object 参数的字符串表示形式。 |
package com.zking;
public class Test {
public static void main(String[] args) {
String str = "";
// toCharArray()将此字符串转换为一个新的字符数组。
str = "abcdefg";
char[] charArray = str.toCharArray();
System.out.println("字符数组charArray的长度为: " + charArray.length);
// getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
str = "hello";
byte[] bytes = str.getBytes();
System.out.println("字节数组bytes的长度为: " + bytes.length);
// charAt(int index)返回指定索引处的 char 值。
str = "helloworld";
System.out.println(str.charAt(2));
// compareTo(String anotherString)按字典顺序比较两个字符串,通过首字母的ascii值进行比较。
String s1 = "hello";
String s2 = "world";
System.out.println(s1.compareTo(s2));
// concat(String str)将指定字符串连接到此字符串的结尾。
str = "hehe";
System.out.println(str.concat("heihei"));
// contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时,返回 true。
str = "my name is zz";
System.out.println(str.contains("is"));
// endsWith(String suffix)测试此字符串是否以指定的后缀结束。
str = "HelloWorld.java";
System.out.println(str.endsWith(".java"));
// equals(Object anObject)将此字符串与指定的对象比较。
String name1 = "张三";
String name2 = "李四";
System.out.println(name1.equals(name2));
// indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引。
str = "indexof";
System.out.println(str.indexOf('i'));
// lastIndexOf(int ch)返回指定字符在此字符串中最后一次出现处的索引。
str = "lastIndex";
System.out.println(str.lastIndexOf('I'));
// length()返回此字符串的长度。
str = "world";
System.out.println(str.length());
// replace(char oldChar, char newChar)返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有 oldChar
// 得到的。
str = "我爱你";
System.out.println(str.replace("你", "中国"));
// split(String regex)根据给定正则表达式的匹配拆分此字符串。
str = "a,b,c,d,e,f,g";
String[] split = str.split(",");
System.out.println(split.length);
// startsWith(String prefix)测试此字符串是否以指定的前缀开始。
str = "hello.java";
System.out.println(str.startsWith("h"));
// substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
str = "who are you?";
System.out.println(str.substring(4));
// substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。
str = "hahaheheheihei";
System.out.println(str.substring(2, 5));
// toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
str = "my name is zz HELLOWORLD";
System.out.println(str.toLowerCase());
// toString()返回此对象本身(它已经是一个字符串!)。
str = "my name is zz HELLOWORLD";
System.out.println(str.toString());
// toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
str = "my name is zz HELLOWORLD";
System.out.println(str.toUpperCase());
// trim()返回字符串的副本,忽略前导空白和尾部空白。
str = " my name is zz HELLOWORLD ";
System.out.println(str.toUpperCase());
// valueOf(Object obj)返回 Object 参数的字符串表示形式。
str = "123";
System.out.println(String.valueOf(str));
}
}
四、经典案例
package com.zking.test;
import java.util.Arrays;
import java.util.Scanner;
/**
* String类及常用方法 toCharArray getBytes length() indexOf substring replace split
* toLowerCase toUpperCase trim lastIndexOf charAt concat contains compareTo
*/
public class Test {
private static Scanner sc = new Scanner(System.in);
// 1、现有一字符串:”67a,3431m , 910 , 45 , 268”;
// 要求最终通过程序处理得到结果为: “268 , 3431m , 45 , 67a , 910”。
/**
* 方法功能:根据提供的目标字符串按照特定的规则符号进行分割成字符串数组后进行冒泡排序
*
* @param arrayStr
* 目标字符串
* @param str
* 规则符号
*/
public static void work1(String arrayStr, String str) {
// 参数arrayStr是一个有规则的字符串
String[] split = arrayStr.split(str);
System.out.println("排序前: " + Arrays.toString(split));
// 进行冒泡排序 compareTo
for (int i = 0; i < split.length - 1; i++) {// 轮数
for (int j = 0; j < split.length - 1 - i; j++) {// 每一轮比较的次数
if (split[j].compareTo(split[j + 1]) > 0) {
String temp = split[j];
split[j] = split[j + 1];
split[j + 1] = temp;
}
}
}
System.out.println("排序后: " + Arrays.toString(split));
}
// 3、控制台接收输入(类似“aa@bb”字符串),
// 判断以“@”分割的前后两个字符串是否相等。
// 如果相等在控制台输出“相等”,否则输出“不相等”
public static void work3(String content) {
int index = content.indexOf('@');
if (index != -1) {// 说明目标字符串中存在@
// 按照@进行分割成字符串数组
String[] split = content.split("@");
if (split[0].equals(split[1])) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
} else {
System.out.println("提供的字符串不满足要求(必须包含@)");
}
}
// 6、定义个string字符串“8,2,1,65,99,7,4”,取出该字符串中最小的数字;
public static void work6(String content, String str) {
String[] split = content.split(str);
String min = split[0];
for (int i = 0; i < split.length - 1; i++) {
if (min.compareTo(split[i]) > 0) {
min = split[i];
}
}
System.out.println(min);
}
// 7、要求输出九九乘法表,要求结果中所有的5被英文字母”F”代替,2被“T”代替;
public static void work7(int num) {
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i; j++) {
System.out.print((j + " * " + i + " = " + (i * j) + "\t").replace("5", "F").replace("2", "T"));
}
System.out.println();
}
}
// 8、取出该文件名“abcjkj.jd.ksd.aspx”的后缀名
public static void work8(String fileName) {
int index = fileName.lastIndexOf(".");
if (index != -1) {
String hz = fileName.substring(index);
System.out.println(hz);
} else {
System.out.println("文件名不符合要求");
}
}
// 9、让用户随即输入一段字符串,
// 凡是碰到“B”“b”“c”三个字符,全部自动换行输出
public static void work9(String content) {
// for (int i = 0; i < content.length(); i++) {
// System.out.print(content.charAt(i));
// if(content.charAt(i) == 'B' || content.charAt(i) == 'b' ||
// content.charAt(i)=='c') {
// System.out.println();
// }
// }
System.out.println(content.replace("B", "\n"));
}
// 10、完成用户的注册以及登陆,
// 要求进行判断(两次密码是否一致 密码和用户名长度是否安全)
public static void work10() {
String username = "";
String password = "";
// 只要满足要求才能注册成功,成功后会立刻将注册的账户和密码保存到以上2个字符中
// 注册
while (true) {
System.out.println("请输入注册的账户: ");
String uname = sc.next();
if (uname.trim().length() >= 6 && uname.trim().length() <= 12) {
System.out.println("请输入注册的密码: ");
String pwd = sc.next();
if (pwd.trim().length() == 6) {
System.out.println("注册成功");
// 将注册成功的账户和密码赋值到最新开始定义的字符串中
username = uname;
password = pwd;
break;
} else {
System.out.println("密码错误");
}
} else {
System.out.println("账号不满足要求,重新输入");
}
}
// 登录
System.out.println("欢迎进入杀猪登录系统");
while (true) {
System.out.println("请输入账户: ");
String newUsername = sc.next();
System.out.println("请输入密码: ");
String newPassword = sc.next();
// 判断注册的账户和输入的账户对比
if (newUsername.trim().equals(username) && newPassword.trim().equals(password)) {
System.out.println("登录成功");
// 进入另外的逻辑处理方法
break;
} else {
System.out.println("账户或密码错误");
}
}
}
// 11、判断.java文件名是否正确,判断邮箱格式是否正确
public static void work11() {
String fileName = "hello.java";
int index = fileName.lastIndexOf('.');
if(index!=-1) {
String hz = fileName.substring(index);
if(hz.equals(".java")) {
System.out.println("格式正确");
}else {
System.out.println("格式有问题");
}
}else {
System.out.println("文件名不符合要求");
}
//邮箱格式
String email = "1231868458@qq.com";
int a1 = email.lastIndexOf('@');
int a2 = email.lastIndexOf('.');
if(-1!=a1 && -1!=a2 && a1 < a2) {
System.out.println("邮箱格式正确");
}else {
System.out.println("邮箱格式不对");
}
}
// 12、输入一个字符串,输入一个字符,判断该字符在该字符串中出现的次数(indexof And substring)
public static void work12() {
int count = 0;
String str = "asdhhdkjahskfhkjdshfshkjahskjdhas";
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i) == 'a') {
count++;
}
}
System.out.println(count);
}
public static void workDemo() {
String str = "asdhhdkjahskfhkjdshfshkjahskjdhas";
int index = str.indexOf('a');
int count = 0;
while(index!=-1) {
count++;
//从当前位置读取完毕后,往后面增加一个位进行判断a的位置
index = str.indexOf('a',index+1);
}
System.out.println(count);
}
// 13、预习StringBuffer/StringBuild
public static void main(String[] args) {
// work1("67a,3431m,910,45,268", ",");
// work3("aa@aa");
// work6("8,2,1,65,99,7,4", ",");
// work7(9);
// work8("aksjhdka.ajkshd.asfa.asfha.java");
// work9("ashdajahsBkasdjkablkasdcasd");
// work10();
// work11();
// work12();
workDemo();
}
}