String知识点总结

1.String类中compareTo()方法的源码解析:

答:1、首先获取到两个字符串中长度较小的那个,定义为minLength。

      2、将两个字符串转成字符数组

      3、根据minLength,遍历两个字符数组中的各个字符,一对一进行比较。如果相等,比较下一对字符;如果不相等,返回两个字符相减后的结果

      4、如果在minLength范围内,字符均相等,那么返回两个字符串长度相减后的结果

                 正数:大

                 负数:小

                 0  :相等

2. String类常用方法有哪些?

答:charAt(int index) 获得指定位置字符

       equals(Object s) 比较字符串内容

       indexOf(String s) 寻找子串位置

       lastIndexOf(String s) 从后向前寻找子串

       length() 长度

       substring(int start) 截取从指定位置到末尾的子串

       substring(int start, int end) 截取 [start, end) 范围的子串

       trim() 去除两端空白字符

       compareTo(String s) 比较字符串大小,按字符编码比大小

       contains(String s) 是否包含子串

       equalsIgnoreCase(String s) 忽略大小写比较

       replace(char c1, char c2) 替换字符,汇创建新对象

       toCharArray() 转成 char[] 数组

       toLowerCase() 转为小写,会创建新对象

       toUpperCase() 转为大写,汇创建新对象

3. String、StringBuffer、StringBuilder的区别?

答:String是不可变字符串,StringBuffer和StringBuilder都是可变字符串;

       StringBuffer是同步的,线程安全、效率高,StringBuilder是不同步的,线程不安全、效率低。

4. StringBuffer和数组的区别?

答:StringBuffer和数组都可以看作是一个容器,用来存放其它数据;

       StringBuffer的数据最终是一个字符串数据,而数组可以存放多种数据,但必须是同一种数据类型。

 

5. 看程序写结果

/ * 3:形式参数问题

 * String作为参数传递

 * StringBuffer作为参数传递

 *

 * 形式参数:

 * 基本类型:形式参数的改变不影响实际参数

 * 引用类型:形式参数的改变直接影响实际参数

 *

 * 注意:

 * String作为参数传递,效果和基本类型作为参数传递是一样的。

 */

public class Test{

public static void main(String[] args) {

String s1 = "hello";

String s2 = "world";

System.out.println(s1 + "---" + s2);// hello---world

change(s1, s2);

System.out.println(s1 + "---" + s2);// hello---world

StringBuffer sb1 = new StringBuffer("hello");

StringBuffer sb2 = new StringBuffer("world");

System.out.println(sb1 + "---" + sb2);// hello---world

change(sb1, sb2);

System.out.println(sb1 + "---" + sb2);// hello---worldworld

}

public static void change(StringBuffer sb1, StringBuffer sb2) {

sb1 = sb2;//对地址进行操作

sb2.append(sb1);//对内容进行操作

}

public static void change(String s1, String s2) {

s1 = s2;

s2 = s1 + s2;

}

}

案例1:去除字符串中重复的字符

package 字符串去重复案例;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

/**

 * 去除字符串中重复的字符

 *

 * @author Administrator

 *

 */

public class StringRemoveDuplicate {

public static void main(String[] args) {

while(true){

//键盘录入一个字符串

System.out.println("请输入一个字符串:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = null;

try {

 str = br.readLine();

 //如果键盘录入“886”,结束循环

 if(str.equals("886")){

 return;

 }

 //调用方法去除字符串中重复的字符

 String result = removeDuplicate(str);

 System.out.println("去重复后的字符串为:");

 System.out.println(result);

} catch (IOException e) {

e.printStackTrace();

}

}

}

private static String removeDuplicate(String str) {

char[] chars = str.toCharArray();

List list = new ArrayList();

StringBuffer sb = new StringBuffer();

for(int i=0;i<chars.length;i++){

if(!list.contains(chars[i])){

sb = sb.append(chars[i]);

list.add(chars[i]);

}

}

return sb.toString();

}

}

案例2:反转字符串(方法1

package 反转字符串;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/*

 * 字符串反转

 * 举例:键盘录入”abc

 * 输出结果:”cba

 *

 * 分析:

 * A:键盘录入一个字符串

 * B:定义一个新字符串

 * C:倒着遍历字符串,得到每一个字符

 * a:length()和charAt()结合

 * b:把字符串转成字符数组

 * D:用新字符串把每一个字符拼接起来

 * E:输出新串

 */

public class ReverseString{

public static void main(String[] args) {

// 键盘录入一个字符串

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = null;

try {

br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 改进为功能实现

String s = myReverse(str);

System.out.println("实现功能后的结果是:" + s);

}

/*

 * 两个明确: 返回值类型:String 参数列表:String

 */

public static String myReverse(String s) {

// 定义一个新字符串

String result = "";

// 把字符串转成字符数组

char[] chs = s.toCharArray();

// 倒着遍历字符串,得到每一个字符

for (int x = chs.length - 1; x >= 0; x--) {

// 用新字符串把每一个字符拼接起来

result += chs[x];

}

return result;

}

}

反转字符串(方法2

package 反转字符串;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/*

 * 字符串反转

 *

 */

public class ReverseString2{

public static void main(String[] args) {

// 键盘录入一个字符串

System.out.println("请输入一个字符串:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = null;

try {

str = br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 改进为功能实现

String s = myReverse(str);

System.out.println("实现反转后的结果是:" + s);

}

/*

 * 两个明确: 返回值类型:String 参数列表:String

 */

public static String myReverse(String s) {

StringBuffer sb = new StringBuffer(s);

String result = sb.reverse().toString();

return result;

}

}

案例3:判断两个字符串是否由相同的字符组成abcdadcd一样

package 判断两个字符串是否由相同的字符组成;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.Arrays;

/**

 * 判断两个字符串是否由相同的字符组成

 * @author Administrator

 *

 */

public class IsEquals {

public static void main(String[] args) throws Exception{

//键盘录入一个字符串

System.out.println("请输入一个字符串:");

BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));

String str1 = br1.readLine();

//键盘再录入一个字符串

System.out.println("请再输入一个字符串:");

BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

String str2 = br2.readLine();

//调用方法,判断两个字符串是否由相同字符组成

boolean result = isEquals(str1,str2);

System.out.println(result);

}

/**

 * 比较两个字符串是否由相同的字符组成

 *

 * @param str1

 * @param str2

 * @return

 */

private static boolean isEquals(String str1, String str2) {

//String类的toCharArray()方法,将字符串转换为字符数组

char[] chars1 = str1.toCharArray();

char[] chars2 = str2.toCharArray();

//对字符数组进行排序

Arrays.sort(chars1);

Arrays.sort(chars2);

//String类的valueOf()方法,将字符数组转换为字符串

String charsToString1 = String.valueOf(chars1);

String charsToString2 = String.valueOf(chars2);

//判断字符串是否相等

if(charsToString1.equals(charsToString2)){

return true;

}else{

return false;

}

}

}

案例4.如何统计一行字符中有多少个单词

package 如何判断一行字符中有多少个单词;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class WordCount {

public static void main(String[] args) throws IOException{

while(true){

//键盘录入一行字符

System.out.println("请输入一行字符:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();

String[] strs = str.split(" ");

int count = 0;

for(int i=0;i<strs.length;i++){

if(strs[i].equals("")){

continue;

}

count++;

}

//打印一行字符中包含的单词个数

System.out.println(count);

}

}

}

 

案例5.统计字符串中大写、小写、数字字符的个数

package 统计字符串中大小写数字字符的个数;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/*

 * 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)

 * 举例:

 * "Hello123World"

 * 结果:

 * 大写字符:2个

 * 小写字符:8个

 * 数字字符:3个

 *

 * 分析:

 * 前提:字符串要存在

 * A:定义三个统计变量

 * bigCount=0

 * smallCount=0

 * numberCount=0

 * B:遍历字符串,得到每一个字符。

 * length()和charAt()结合

 * C:判断该字符到底是属于那种类型的

 * 大:bigCount++

 * 小:smallCount++

 * 数字:numberCount++

 *

 * 这道题目的难点就是如何判断某个字符是大的,还是小的,还是数字的。

 * ASCII码表:

 * 048

 * A65

 * a97

 * 虽然,我们按照数字的这种比较是可以的,但是想多了,有比这还简单的

 * char ch = s.charAt(x);

 *

 * if(ch>='0' && ch<='9') numberCount++

 * if(ch>='a' && ch<='z') smallCount++

 * if(ch>='A' && ch<='Z') bigCount++

 *D:输出结果。

 *

 * 练习:把给定字符串的方式,改进为键盘录入字符串的方式。

 */

public class StringTest2 {

public static void main(String[] args) {

//键盘录入一个字符串

System.out.println("请输入一个字符串:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s = null;

try {

s = br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//定义三个统计变量

int bigCount = 0;

int smallCount = 0;

int numberCount = 0;

//遍历字符串,得到每一个字符。

for(int i=0; i<s.length(); i++){

char ch = s.charAt(i);

//判断该字符到底是属于那种类型的

if(ch>='a' && ch<='z'){

smallCount++;

}else if(ch>='A' && ch<='Z'){

bigCount++;

}else if(ch>='0' && ch<='9'){

numberCount++;

}

}

//输出结果。

System.out.println("大写字母"+bigCount+"个");

System.out.println("小写字母"+smallCount+"个");

System.out.println("数字"+numberCount+"个");

}

}

案例6.将字符串的首字母改成大写,其它改小写

package 将字符串的首字母改成大写其它改小写;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/*

 * 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)

 * 举例:

 * helloWORLD

 * 结果:

 * Helloworld

 *

 * 分析:

 * A:先获取第一个字符

 * B:获取除了第一个字符以外的字符

 * C:把A转成大写

 * D:把B转成小写

 * E:C拼接D

 */

public class StringTest {

public static void main(String[] args) {

// 键盘录入一个字符串(只包含大、写字母)

System.out.println("请输入一个字符串(只包含大、写字母):");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String s = null;

try {

s = br.readLine();

} catch (IOException e) {

e.printStackTrace();

}

// 先获取第一个字符

String s1 = s.substring(0, 1);

// 获取除了第一个字符以外的字符

String s2 = s.substring(1);

// 把A转成大写

String s3 = s1.toUpperCase();

// 把B转成小写

String s4 = s2.toLowerCase();

// C拼接D

String s5 = s3.concat(s4);

System.out.println(s5);

// 优化后的代码

// 链式编程

/*String result = s.substring(0, 1).toUpperCase()

.concat(s.substring(1).toLowerCase());

System.out.println(result);*/

}

}

 

案例7:将int数组拼成字符串

package 将int数组拼成字符串;

/*

 * 需求:把数组中的数据按照指定个格式拼接成一个字符串

 * 举例:

 * int[] arr = {1,2,3};

 * 输出结果:

 *"[1, 2, 3]"

 * 分析:

 * A:定义一个字符串对象,只不过内容为空

 * B:先把字符串拼接一个"["

 * C:遍历int数组,得到每一个元素

 * D:先判断该元素是否为最后一个

 * 是:就直接拼接元素和"]"

 * 不是:就拼接元素和逗号以及空格

 * E:输出拼接后的字符串

 *

 * 把代码用功能实现。

 */

public class StringTest2 {

public static void main(String[] args) {

// 前提是数组已经存在

int[] arr = { 1, 2, 3 };

// 写一个功能,实现结果

String result = arrayToString(arr);

System.out.println("最终结果是:" + result);

}

/*

 * 两个明确: 返回值类型:String 参数列表:int[] arr

 */

public static String arrayToString(int[] arr) {

// 定义一个可变长字符串

StringBuffer sb = new StringBuffer();

// 先把字符串拼接一个"["

sb = sb.append("[");

// 遍历int数组,得到每一个元素

for (int x = 0; x < arr.length; x++) {

// 先判断该元素是否为最后一个

if (x == arr.length - 1) {

// 就直接拼接元素和"]"

sb = sb.append(arr[x]).append("]");

} else {

// 就拼接元素和逗号以及空格

sb = sb.append(arr[x]).append(",");

}

}

return sb.toString();

}

}

 

案例8:在大串中查找小串出现的次数

package 在大串中查找小串出现的次数;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/*

 * 统计大串中小串出现的次数

 * 举例:

 * 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"

 * 结果:

 * java出现了5次

 *

 * 分析:

 * 前提:是已经知道了大串和小串。

 *

 * A:定义一个统计变量,初始化值是0

 * B:先在大串中查找一次小串第一次出现的位置

 * a:索引是-1,说明不存在了,就返回统计变量

 * b:索引不是-1,说明存在,统计变量++

 * C:把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串

 * D:回到B

 */

public class StringTest5 {

public static void main(String[] args) {

// 键盘录入字符串(大串)

System.out.println("请输入字符串(大串)");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String maxString = null;

try {

maxString = br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 键盘录入字符串(小串)

System.out.println("请输入字符串(小串)");

BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

String minString = null;

try {

minString = br2.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 写功能实现

int count = getCount(maxString, minString);

System.out.println("Java在大串中出现了:" + count + "次");

}

/*

 * 两个明确: 返回值类型:int 参数列表:两个字符串

 */

public static int getCount(String maxString, String minString) {

// 定义一个统计变量,初始化值是0

int count = 0;

int index;

//先查,赋值,判断

while((index=maxString.indexOf(minString))!=-1){

count++;

maxString = maxString.substring(index + minString.length());

}

return count;

}

}

 

案例9:如何输出字符串的所有组合(不会)

 

package 如何输出字符串的所有组合;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class StringTest {

public static void main(String[] args) {

//键盘录入一个字符串

System.out.println("请输入一个字符串:");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = null;

try {

str = br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//将字符串转换成字符数组

char[] charArray = str.toCharArray();

StringBuffer sb = new StringBuffer();

//遍历字符数组

for(int i=0;i<charArray.length;i++){

pailieZuhe(charArray,0,i,sb);

}

}

private static void pailieZuhe(char[] charArray, int begin, int len, StringBuffer sb) {

if(len == 0){

System.out.println(sb+" ");

return;

}

if(begin == charArray.length){

return;

}

sb.append(charArray[begin]);

pailieZuhe(charArray,begin+1,len-1,sb);

sb.deleteCharAt(sb.length()-1);

pailieZuhe(charArray,begin+1,len,sb);

}

}

 

输入:abc   输出:a  b  c  ab  ac  bc   abc

 

猜你喜欢

转载自blog.csdn.net/lz1170063911/article/details/80238323