java基础知识--(常用类)String类

8.01 String简介

  1. String(字符串常量)概述

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。

  1. 分析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 创建字符串对象

  1. 直接赋值方式创建对象
    直接赋值方式创建对象是在方法区的常量池

    String str="hello";//直接赋值的方式
    
  2. 通过构造方法创建字符串对象
    通过构造方法创建字符串对象是在堆内存

    String str=new String("hello");//实例化的方式
    
  3. 用字符数组创建一个字符串。

    char[] charArray = {'G','o', 'o' , 'd' , ' ' , ' D' , ' a' ,'y'};
    String message=new String(charArray);
    

8.03 String常用的方法
java基础知识--(常用类)String类

  1. String的判断功能

    boolean equals(Object obj):比较字符串的内容是否相同
    boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
    boolean startsWith(String str): 判断字符串对象是否以指定的str开头
    boolean endsWith(String str): 判断字符串对象是否以指定的str结尾
    
  2. 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
    
  3. String的转换功能

    char[] toCharArray():把字符串转换为字符数组
    String toLowerCase():把字符串转换为小写字符串
    String toUpperCase():把字符串转换为大写字符串
    
  4. 其他常用方法

    去除字符串两端空格: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 方法。该方法可以用于将字符和数值转换成字符串.

java基础知识--(常用类)String类

 为了将 double 值 5.44 转换成字符串,可以使用 String.value0f(5.44)。
返回值是 由 字 符'5', '.' ,'4', '4' 构成的字符串。

8.05 经典例题

但凡对字符串的修改都是基于新的字符串对象的
只要该字符串 结果是一个新的字符串!!!
字符串一旦定义出来 则不可改变(对象 常量)

  1. 求最大子串
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 "";
	}

解题思路:
java基础知识--(常用类)String类

  1. 回文判断
    “上海自来水来自海上” “黄山落叶松叶落山黄” “山西运煤车煤运西山”
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;
	}

解题思路:

利用夹逼思想 分别定义标记当前头尾的变量,将其步长设置为相同,则比较头尾指针所致的元素都内容相同,则是回文字符串。

  1. 括号匹配
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;
		}
	}

解题思路:

利用栈的特性解题
java基础知识--(常用类)String类
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;
	}
}

运行结果:
java基础知识--(常用类)String类