0

虽然,我已经为此做了一个解决方法,但是这件事仍然让我感到困惑,从逻辑上讲。

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 的要求太多了。我也会尽量找时间以身作则回答问题。

4

3 回答 3

2

您将相同的StringTokenizer对象传递给这两种方法。但是,无论首先调用哪个方法,您都会用完所有标记,因为每个方法都会在一个while循环中消耗所有标记。所以被称为 second 的方法没有更多的标记并且不打印任何标记。

于 2013-05-28T18:34:09.650 回答
2

AStringTokenizer保留它已使用的令牌数量的内部计数。当您将对象传递给另一个函数时,该对象不会从头开始。在您的第一种方法中,您使用所有令牌......并且它在最后。

例子

"This is a string"

^ - Position of Tokenizer before method.

"This is a string"

                  ^ - Position of string tokenizer after method.

您将相同的对象传递给另一个方法,并且位置仍然在末尾。因此,没有更多的令牌。

于 2013-05-28T18:35:12.060 回答
0

您是否知道您首先调用 secondMethod() 和 firstMethod() 第二?

鉴于此,代码似乎运行正常。secondMethod() 处理所有标记。在处理完所有令牌后调用 firstMethod() ,因此无事可做。

在任何情况下,StringTokenizer 对象在任何意义上都不会在整个过程中被删除。它通过引用成功地在 main()、firstMethod() 和 secondMethod() 之间传递。确实它用完了令牌,但是,嘿,它只是在做它的工作。

如果您想说服自己相信这一点,只需在您首先调用的方法中检索几个标记,然后在另一个中提取其余标记。它会起作用的。

于 2013-05-28T18:40:40.630 回答