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的方法没有更多的令牌,并且不打印任何令牌。AStringTokenizer
保留其使用的令牌数量的内部计数。当您将对象传递给另一个函数时,它不会从头开始。在第一种方法中,您使用所有令牌..并且它位于末尾
范例
^-标记器在方法之前的位置。
"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()是这里的新方法。我只会用那个。