Java Can';t将StringTokenizer传递给多个方法

Java Can';t将StringTokenizer传递给多个方法,java,string,Java,String,虽然,我已经为此做了一个变通办法,但从逻辑上讲,这件事仍然让我感到困惑 public static void main(String[] args) { String sent = "He is doing it good"; StringTokenizer st= new StringTokenizer(sent); long t1 = System.currentTimeMillis();

虽然,我已经为此做了一个变通办法,但从逻辑上讲,这件事仍然让我感到困惑

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新手,只是好奇这个东西到底叫什么?垃圾收集


啊,看来我要求太多了。我也会尽量抽出时间回答问题

您正在向这两个方法传递相同的
StringTokenizer
对象。但是,无论首先调用哪个方法,您都会用完所有令牌,因为每个方法都会在
while
循环中使用所有令牌。因此,被称为second的方法没有更多的令牌,并且不打印任何令牌。

您正在向这两个方法传递相同的
StringTokenizer
对象。但是,无论首先调用哪个方法,您都会用完所有令牌,因为每个方法都会在
while
循环中使用所有令牌。因此,被称为second的方法没有更多的令牌,并且不打印任何令牌。

A
StringTokenizer
保留其使用的令牌数量的内部计数。当您将对象传递给另一个函数时,它不会从头开始。在第一种方法中,您使用所有令牌..并且它位于末尾

范例

^-标记器在方法之前的位置。

"This is a string"

                  ^ - Position of string tokenizer after method.

将相同的对象传递给另一个方法,该位置仍在末尾。因此,不再有代币。

一个
StringTokenizer
保存其使用的代币数量的内部计数。当您将对象传递给另一个函数时,它不会从头开始。在第一种方法中,您使用所有令牌..并且它位于末尾

范例

^-标记器在方法之前的位置。

"This is a string"

                  ^ - Position of string tokenizer after method.

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

您是否知道您正在首先调用secondMethod(),然后调用firstMethod()

鉴于此,代码似乎运行正常。secondMethod()处理所有标记。firstMethod()在处理完所有标记后被调用,因此无需执行任何操作

在任何情况下,StringTokenizer对象始终不会被删除。它正在main()、firstMethod()和secondMethod()之间通过引用成功地传递。它确实用完了代币,但是,嘿,它只是在做它的工作


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

您是否知道要先调用secondMethod(),然后再调用firstMethod()

鉴于此,代码似乎运行正常。secondMethod()处理所有标记。firstMethod()在处理完所有标记后被调用,因此无需执行任何操作

在任何情况下,StringTokenizer对象始终不会被删除。它正在main()、firstMethod()和secondMethod()之间通过引用成功地传递。它确实用完了代币,但是,嘿,它只是在做它的工作


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

明白了。谢谢有什么方法可以避免在每个方法中创建标记器对象吗?这取决于您真正想做什么。您是要在每个方法中重新解析整个字符串,还是要在一个方法中解析部分字符串,在另一个方法中解析其余字符串?请重新解析整个字符串。建议不鼓励使用StringTokenizer。我现在要转到split()。谢谢,明白了。谢谢有什么方法可以避免在每个方法中创建标记器对象吗?这取决于您真正想做什么。您是要在每个方法中重新解析整个字符串,还是要在一个方法中解析部分字符串,在另一个方法中解析其余字符串?请重新解析整个字符串。建议不鼓励使用StringTokenizer。我现在要转到split()。谢谢。你看过api文档了吗?好的,split()是这里的新方法。你看过api文档了吗?好的,split()是这里的新方法。我只会用那个。