String的常见内存分析题:
String str1 = new String("hello world");
String str2 = new String("hello world");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
String str3 = "hello world";
System.out.println(str1 == str3);
String str4 = "hello world";
System.out.println(str3 == str4);
内存分析:
indexOf( )函数的用法:
String的其他常见方法见博客:https://www.cnblogs.com/laurarararararara/p/11448731.html
小练习 1•:
/**
* 用户输入一段字符串,包含数字,字母以及其它的字符,统计
* 字符串中,数字,字母以及其它的字符各自出现的次数,并打印
* 出来
*/
逻辑分析:遍历整个字符串,并且需要获取字符串中的每一个字符,判断这个字符是否是数字,字符或者其他类型。
判断是字串的数字的函数:isDigit( ), 判断是否是字符isLetter( ).
代码实现:
Scanner in = new Scanner(System.in); String str = in.nextLine(); System.out.println(str); int numberCnt=0; int number = 0; int charCnt=0; int others=0; for (int i = 0; i <str.length(); i++) { char ch=str.charAt(i);//获取字符串的字符的方法 charAt( ) if(Character.isDigit(ch)){ //查找数字个数的方法 numberCnt++; } // else if ((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')){ //注意或者关系。大写或者小写 // CHAR_NUMBER++; // } else if(Character.isLetter(ch)){ charCnt++; } else{ others++; } } System.out.println("numberCnt:"+numberCnt); System.out.println("charCnt:"+charCnt); System.out.println("others:"+others);
结果实现:
补充•:快捷键注释多行代码与取消注释 ctrl+/ 可以注释多行,也可撤销
段注释 ctrl+alt+/ 可以注释一段,也可撤销
ctrl+/ 效果如图:
ctrl+alt+/ 效果如图:
小练习2•:
/**
* 获取用户输入的一段字符串,该字符串格式(每个字串用空格隔开)如下,把用户输入的数组中的单词找出来并打印
*如abc7 789t thi *uhh jui 890
*则输出的单词为thi jui
*/
逻辑分析:用户输入字符串的特点是每输入一段小串,然后用空格隔开,接着输入下一小串。程序的目的是为了找出每一小串是否全是字符则为单词,
若每一小串的开始第一个就不是字符,则之间跳到写一个空格处继续开始,无需往后判断。
若没遇到空格,则判断该小串是否全是字符;若遇到空格,则需判断,是因为遍历完了单词串后才遇到的空格,还是从之前跳过来的,
如果是遍历完单词串则需要记录单词数目。
根据该逻辑,可以写出简单的if else逻辑
if(){
}
else{
if(){}
}
定义一个flag 变量来判断遇到空格后是否遇到了单词。
if(ch!=" "){ //如果没有遇见空格,表示正在遍历
if(!Charachter.isLetter(ch)){ //如果遍历期间遇见了不是单词的,则flag置为false,表示不是一个单词
flag=false;
}
}else{ //否则,遇见了空格
if(flag){ //前面遍历的是单词
number++; //记录单词数目
}
else{ //否则,需要重新判断
flag=false;}
不足:该程序并未考虑到最后输入的字符串是单词的情况:
改进如下:
因为最后的输入的下一个没有遇见空格,所以遍历了剩下的字符串但是没有进入else中判断,所有没有记入单词数目,改进如下:
如何打印字符串?subString方法,提取字符串:
String substr = str.substring(idx, str.length());
上述问题:将用户的输入一组字符单词个数统计完之后,并将单词打印出来
思路:在判断是单词的时候,将单词打印出来,用当前正在遍历的位置i减去单词的长度count即可获得子串
整个代码为:
import java.util.Scanner; public class StringTestUnit{ public static void main(String[] args){ Scanner in = new Scanner(System.in); String str = in.nextLine(); int charCnt = 0;//字符 boolean flag = true;//默认为是一个单词 int number = 0; int count = 0; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i);//找索引 if (ch != ' ') { // 如果判断字符的过程中,遇见一个不是字母的字符,不用继续判断了 // 直接往后找' ' 'a' '8' if (flag && !Character.isLetter(ch)) { // 已经不是一个字母了,也就是不是一个单词了 flag = false; } count++; } else { // 否则如果遇见空格了 if (flag) { System.out.println(str.substring(i - count, i)); //当前正在遍历的位置-单词的字符个数 number++; } flag = true; // flag需要重置以下,马上要遍历下一个串了 count = 0; } } //这里面需要处理一下长串中的最后一个小的字串是不是单词 if (flag) { number++; System.out.println(str.substring(str.length() - count, str.length())); } System.out.println(number); } }
小练习3•:
/**
* 请输出1000以内的完数,完数是他的因子的整数的和刚好等于数字本身,比如6=1+2+3
* 此时,6为完数
*输出结果如下 6:1 2 3
*/
如果因数和等于该整数,则这个数为完数。求因数的方法:该整除 除以从1到比它小的整除,如果能整除,则该数为因子。
题目要求输入因子,需要一个数组来暂时储存因子,否则输出又要重新计算该数的因子。
for(int i=1;i<=1000;i++){ //整数
for(int j;j<i;j++){//因数
if(i%j==0)
sum=sum+j; //因数和
arr[i]=j;//将因子依次放入数组
i++; //持续记录数组的值
}
if(sum==i)
{
System.out.print(i+":");
for(int j=0;j<i;j++){
System.out.print(arr[j]+" ");
}
}
}
public class StringTestUnit2 { public static void main(String[] args) { /** * 请输出1000以内的完数,完数是他的因子的整数的和刚好等于数字本身,比如6=1+2+3 * 此时,6为完数 */ String str1="abc"; int arr[]=new int[500]; int index=0; for(int i=1;i<=1000;i++) { //求出i所有的因数 int sum=0; for (int j = 1; j <i; j++) { if (i % j == 0) { arr[index]=j; //将因子记录在数组里 index++; sum = sum + j; } } if (sum == i) { System.out.print(i+":"); for(int j=0;j<index;j++) { System.out.print(arr[j]+ " "); //输出数组 } System.out.println(); } index=0; //将索引置0,开始下一个数字的因子在数组的存储 } } }