尽管如此,我已经为此做了一个解决方法,但是这个问题仍然令我感到困惑,逻辑上很好。
public static void main(String[] args)
{
String sent = "He is doing it good";
StringTokenizer st= new StringTokenizer(sent);
long t1 = System.currentTimeMillis();
secondMethod(st);
firstMethod(st);
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
public static void firstMethod(StringTokenizer st)
{
System.out.println("in first");
while(st.hasMoreTokens())
{
System.out.println(st.nextToken());
}
}
public static void secondMethod(StringTokenizer st)
{
System.out.println("in second");
while(st.hasMoreTokens())
{
System.out.println(st.nextToken());
}
}
Output of above //
in second
He
is
doing
it
good
in first
//请避免细粒度准确。
在上面的代码中,我意识到Java在首次使用后删除了st。就像我先调用firstMethod一样,st很好地传递给方法,我可以看到完整的标记化字符串,但是在secondMethod中没有,反之亦然。为什么这样?为什么我不能将st传递给不同的方法? Java的新手,只是好奇究竟是什么叫做这个东西?垃圾收集?
啊,看起来我在SO上问得太多了。我会尽量抽出时间回答问题。答案 0 :(得分:2)
您将相同的StringTokenizer
对象传递给两个方法。但是,无论先调用哪种方法,都会耗尽所有标记,因为每种方法都会消耗while
循环中的所有标记。因此,名为second的方法不再有令牌,也不会打印任何令牌。
答案 1 :(得分:2)
StringTokenizer
保留其已使用的令牌数量的内部计数。将对象传递给另一个函数时,该对象不会从头开始。在你的第一种方法中,你使用所有的令牌......它就在最后。
示例
"This is a string"
^ - Position of Tokenizer before method.
"This is a string"
^ - Position of string tokenizer after method.
您将相同的对象传递给另一个方法,并且该位置仍然在最后。因此,不再有令牌。
答案 2 :(得分:0)
你知道你先调用secondMethod()而第二个调用firstMethod()吗?
鉴于此,代码似乎正常运行。 secondMethod()处理所有标记。在处理完所有令牌后调用firstMethod(),因此无需执行任何操作。
在任何情况下,StringTokenizer对象在任何意义上都不会被删除。它通过引用在main(),firstMethod()和secondMethod()之间成功传递。确实,它耗尽了令牌,但是,嘿,它只是在做它的工作。
如果你想说服自己,只需在你先调用的方法中检索几个标记,然后在另一个标记中获取剩余标记。它会起作用。