事情是这样下面这两段代码运行的结果应该是一样的,但是实则不同,比较费解。
package quiz2;
import java.util.*;
public class Strings {
void importantMethods(){
ArrayList<String> al=new ArrayList<String>();
al.add("equalsIgnoreCase()");
al.add("toUpperCase()");
al.add("toLowerCase()");
al.add("concat()");
al.add("length()");
al.add("charAt()");
al.add("replace()");
al.add("toString()");
al.add("trim()");
al.add("substring()");
System.out.println("String一共有"+al.size()+"个方法需要记住,请默写");
Scanner in=new Scanner(System.in);
for(int i=0;i<al.size();i++){
if(i==al.size()-1){
andyloop:while(true){
String typeIn2=in.next();
if(al.contains(typeIn2)){
while(true){
System.out.println(typeIn2+"是String需要记住的方法之一");
System.out.println("恭喜你已经答出了所有String需要的方法");
break andyloop;
}
}
else{
while(true){
System.out.println(typeIn2+"不是String需要记住的方法之一");
System.out.println("请仔细思考后重新输入");
continue andyloop;
}
}
}
}
outer:while(true){
String typeIn1=in.next();
if(al.contains(typeIn1)){
System.out.println(typeIn1+"是String需要记住的方法之一");
System.out.println("还有"+(al.size()-1)+"个方法,请继续");
al.remove(typeIn1);
break outer;
}
else{
System.out.println(typeIn1+"不是String需要记住的方法之一");
System.out.println("请仔细思考后重新输入");
continue outer;
}
}
}
}
}
运行到
String一共有10个方法需要记住,请默写
toString()
toString()是String需要记住的方法之一
还有9个方法,请继续
trim()
trim()是String需要记住的方法之一
还有8个方法,请继续
substring()
substring()是String需要记住的方法之一
还有7个方法,请继续
concat()
concat()是String需要记住的方法之一
还有6个方法,请继续
replace()
replace()是String需要记住的方法之一
还有5个方法,请继续
就结束了
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但是我把代码改一下
package quiz2;
import java.util.*;
public class Strings {
void importantMethods(){
ArrayList<String> al=new ArrayList<String>();
al.add("equalsIgnoreCase()");
al.add("toUpperCase()");
al.add("toLowerCase()");
al.add("concat()");
al.add("length()");
al.add("charAt()");
al.add("replace()");
al.add("toString()");
al.add("trim()");
al.add("substring()");
System.out.println("String一共有"+al.size()+"个方法需要记住,请默写");
Scanner in=new Scanner(System.in);
for(int i=0;i<10;i++){
if(i==9){
andyloop:while(true){
String typeIn2=in.next();
if(al.contains(typeIn2)){
while(true){
System.out.println(typeIn2+"是String需要记住的方法之一");
System.out.println("恭喜你已经答出了所有String需要的方法");
break andyloop;
}
}
else{
while(true){
System.out.println(typeIn2+"不是String需要记住的方法之一");
System.out.println("请仔细思考后重新输入");
continue andyloop;
}
}
}
}
outer:while(true){
String typeIn1=in.next();
if(al.contains(typeIn1)){
System.out.println(typeIn1+"是String需要记住的方法之一");
System.out.println("还有"+(al.size()-1)+"个方法,请继续");
al.remove(typeIn1);
break outer;
}
else{
System.out.println(typeIn1+"不是String需要记住的方法之一");
System.out.println("请仔细思考后重新输入");
continue outer;
}
}
}
}
}
结果就完全不一样了
String一共有10个方法需要记住,请默写
toString()
toString()是String需要记住的方法之一
还有9个方法,请继续
concat()
concat()是String需要记住的方法之一
还有8个方法,请继续
length()
length()是String需要记住的方法之一
还有7个方法,请继续
trim()
trim()是String需要记住的方法之一
还有6个方法,请继续
replace()
replace()是String需要记住的方法之一
还有5个方法,请继续
substring()
substring()是String需要记住的方法之一
还有4个方法,请继续
charAt()
charAt()是String需要记住的方法之一
还有3个方法,请继续
toUpperCase()
toUpperCase()是String需要记住的方法之一
还有2个方法,请继续
toLowerCase()
toLowerCase()是String需要记住的方法之一
还有1个方法,请继续
equalsIgnoreCase()
equalsIgnoreCase()是String需要记住的方法之一
恭喜你已经答出了所有String需要的方法
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
按照我自己的理解,这两段代码结果应该是一样的。
两段代码唯一的不同之处以用黄色字体标出。
还请大神赐教,多谢
------解决思路----------------------
你的第43行一直在al.remove(typeIn1);
会造成al.size()发生改变~~~自然程序就会出错了。