public static void main(String args[]) throws JSONException {
JSONObject json = new JSONObject();
json.put("name", "abcgdj");
json.put("no", "1234");
json.put("contact", "6748356");
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
System.err.println(Iterators.size(keys));
}
En este código, después de ejecutarse Iterators.size(keys)
, el iterador se está convirtiendo en vacío y para la segunda sentencia print, lo va a devolver 0.
El size()
método es bajo el paquete com.google.common.collect.iterators
.So He mirado el código de Iterators.size () function.It era,
public static int size(Iterator<?> iterator) {
long count = 0L;
while (iterator.hasNext()) {
iterator.next();
count++;
}
return Ints.saturatedCast(count);
}
Así que tengo una duda de que cómo el iterador keys
se vacía. si es llamada por referencia?
¿Puede alguien explicar lo que está pasando en el interior tamaño de la función ()
System.err.println(Iterators.size(keys));
Como se dice en el Javadoc , esto agota el keys
iterador: sólo sigue llamando next()
hasta que hasNext()
es falsa.
Entonces no se restablece antes de llamar
System.err.println(Iterators.size(keys));
de nuevo (porque no hay manera de restablecer un iterador). Así que hasNext()
vuelve inmediatamente falsa, por lo que no hay más elementos para que se lea. Por lo tanto el tamaño es cero.
Que había necesidad de reasignar la variable con un nuevo iterador:
Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));
keys = json.keys(); //
System.err.println(Iterators.size(keys));
o no declarar una variable (ya que es efectiva (*) inútil después):
System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));
(*) Se puede utilizar para eliminar el último elemento del iterador.