java基础知识--(常用类)String类
8.01 String简介
- String(字符串常量)概述
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。
- 分析String源码
1)String的成员变量
从源码看出String底层使用一个字符数组来维护的
从成员变量可以知道String类的值是final类型的,不能被改变的,所以只要一个值改变就会生成一个新的String类型对象,存储String数据也不一定从数组的第0个元素开始的,而是从offset所指的元素开始。
2)String的构造方法
String()
初始化一个新创建的 String 对象,使其表示一个空字符序列。
String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, int offset, int length, Charset charset)
通过使用指定的 charset 解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, int offset, int length, String charsetName)
通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。
String(byte[] bytes, String charsetName)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
String(char[] value, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
String(int[] codePoints, int offset, int count)
分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。
String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
String(StringBuffer buffer)
分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
String(StringBuilder builder)
分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。
8.02 创建字符串对象
-
直接赋值方式创建对象
直接赋值方式创建对象是在方法区的常量池String str="hello";//直接赋值的方式
-
通过构造方法创建字符串对象
通过构造方法创建字符串对象是在堆内存String str=new String("hello");//实例化的方式
-
用字符数组创建一个字符串。
char[] charArray = {'G','o', 'o' , 'd' , ' ' , ' D' , ' a' ,'y'}; String message=new String(charArray);
8.03 String常用的方法
-
String的判断功能
boolean equals(Object obj):比较字符串的内容是否相同 boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写 boolean startsWith(String str): 判断字符串对象是否以指定的str开头 boolean endsWith(String str): 判断字符串对象是否以指定的str结尾
-
String类的获取功能
int length():获取字符串的长度,其实也就是字符个数 char charAt(int index):获取指定索引处的字符 int indexOf(String str):获取str在字符串对象中第一次出现的索引 String substring(int start):从start开始截取字符串 String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
-
String的转换功能
char[] toCharArray():把字符串转换为字符数组 String toLowerCase():把字符串转换为小写字符串 String toUpperCase():把字符串转换为大写字符串
-
其他常用方法
去除字符串两端空格:String trim() 按照指定符号分割字符串:String[] split(String str)
8.04 String类常用函数
一)获取函数
1.获取字符串中字符的个数,即就是长度:int length();
2.根据位置获取字符:char charAt(int index);
3.根据字符获取位置:int indexOf(int ch); int lastIndexOf(int ch);
4.获取部分子串:String subString(int beginIndex,int endIndex);
二)转换函数
1.将字符串变为字符串数组(切割):String[] split(String regex);
2.将字符串变为字符数组:toCharArray();
3.将字符串变为字节数组:getBytes();
4.将字符串中的字母转换大小写:toUpperCase();toLowerCase();
5.将字符串中的内容进行替换:String replace(char oldChar,char newChar);
6.将字符串两端去空格:trim();
7.将字符串进行连接:concat(String str);
三)判断函数
1.两个字符串内容是否相同:boolean equals(Object obj);
2.字符串中是否包含指定字符串:boolean contains(String str);
3.字符串是否已指定字符串开头,结尾:startWith() endWith();
四)比较函数
compareTo();比较字典顺序
五)其他
1.字符串与数组转换
字符串---->数组
(1)toCharArray 方法。
char[] chars = "Java".toCharArray();
(2)getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)将下标从 srcBegin 到 srcEnd的子串复制到字符数组 dst 中下标从 dstBegin 开始的位置。
数组---->字符串
(1)使用构造方法 Sting(Char[ ])
使用 String 构造方法由一个数组构造一个字符串:
String str = new String(new char[]{' 3' , 'a' , 'v', 'a'});
(2)value0f(char[])。例如,下面的语句
String str=String.valueOf(new char[]{' 3 ' , ' a ' , ' v ' , 'a'});
2.字符和数值---->字符串
(1)Double.parseDouble(str)
(2)Integer.parselnt(str)
(3)使用字符串的连接操作符来将字符或者数字转换为字符串。
(4)将一个字符串转换为一个 double 值或者一个 int 值,也可以另外一种将数字转换为字符串的方法是使用重载的静态 valueOf 方法。该方法可以用于将字符和数值转换成字符串.
例
为了将 double 值 5.44 转换成字符串,可以使用 String.value0f(5.44)。
返回值是 由 字 符'5', '.' ,'4', '4' 构成的字符串。
8.05 经典例题
但凡对字符串的修改都是基于新的字符串对象的
只要该字符串 结果是一个新的字符串!!!
字符串一旦定义出来 则不可改变(对象 常量)
- 求最大子串
public static String piPei() {
String str1 = "abcd";
String str2 = "efabca";
for (int len = str1.length(); len >= 1; len--) {
for (int start = 0, end = len - 1; end < str1.length(); start++, end++) {
String temp = str1.substring(start, end); // 将分隔的子串获取到
if (str2.contains(temp)) {
return temp;
}
}
}
return "";
}
解题思路:
- 回文判断
“上海自来水来自海上” “黄山落叶松叶落山黄” “山西运煤车煤运西山”
public static boolean huiwen(String s1) { // 夹逼思想
int start = 0;
int end = s1.length() - 1;
boolean flag;
while (start > end) {
if (s1.charAt(start) == s1.charAt(end)) {
start++;
end--;
} else {
flag = false;
break;
}
}
return true;
}
解题思路:
利用夹逼思想 分别定义标记当前头尾的变量,将其步长设置为相同,则比较头尾指针所致的元素都内容相同,则是回文字符串。
- 括号匹配
public static boolean parenthesisMatch() {// 括号匹配 栈实现
String str = "()({[]})<><>{}";
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < str.length(); i++) {
if (stack.isEmpty()) {
stack.push(str.charAt(i));
} else {
if (stack.peek() - str.charAt(i) == -1 || stack.peek() - str.charAt(i) == -2) {
stack.pop();
} else {
stack.push(str.charAt(i));
}
}
}
if (stack.isEmpty()) {
return true;
} else {
return false;
}
}
解题思路:
利用栈的特性解题
6. 猜数游戏
import java.util.Scanner;
public class Guess {
Scanner scanner = new Scanner(System.in);
String[] s = { "calcultor", "tough", "strategy", "implement", "current", "objective" }; //猜单词的单词库
public static int count;
Guess() {
this.count = 0;
}
public void startGame() { //开始游戏
String word = s[(int) (Math.random() * (s.length))]; //随机抽取到单词
boolean[] status = new boolean[word.length()]; //定义boolean[]存放单词字母是否猜中
while (true) {
String secretWord = getSecretWord(word, status); //人输入的单词
if (isGameOver(status)) { //游戏是否结束
System.out.println("游戏结束" + secretWord);
break;
}
System.out.print(" 请输入你的猜测" + secretWord); //游戏没有结束 提示用户输入所猜测的字母
String im = scanner.nextLine();// 输入的是一个字符
changStatus(word, status, im); //根据用户输入的字母,判断是否改变boolean[]某个位置的状态
}
System.out.println(count);
}
private String getSecretWord(String word, boolean[] status) { //字母猜中的显示字母,没猜中的用*代替
String s = "";
for (int i = 0; i < status.length; i++) {
if (status[i]) {
s += word.charAt(i);
} else {
s += "*";
}
}
return s;
}
private void changStatus(String word, boolean[] status, String im) { //用户输入的字母是否在这个单词中,在就将这个位置的状态改变,令其字母显示出来
boolean flag = false;
for (int i = 0; i < word.length(); i++) {
if ((word.charAt(i) + "").equals(im)) { // word.charAt(i)+"")字符转字符串
flag = true;
if (status[i]) {
System.out.println("已存在,请重新输入");
} else {
status[i] = true;
}
}
}
if (flag == false) {
count++;
System.out.println("不存在");
}
}
public boolean isGameOver(boolean[] status) { //判断游戏是否结束,Boolean[]每个元素的状态全为true
boolean flag = false;
for (int i = 0; i < status.length; i++) {
if (status[i] == false) {
flag = true;
}
}
return flag == true ? false : true;
}
}
运行结果: