2011-12-30 26 views
10

me he dado cuenta que cuando se hace la longitud de una matriz de escribir algo como:¿Cuál es la diferencia entre longitud y longitud()?

arrayone.length; 

Sin embargo, para tales cosas como listas de matriz o una cadena, se escribe una abrazadera en el extremo, como la siguiente para la longitud de la cadena:

stringone.length(); 

¿Cuál es la razón principal de esto y ¿cómo saber cuándo poner los soportes o ahora?

Respuesta

8
.length; 

directamente accede a un miembro de campo.

.length(); 

invoca un método (es decir, un descriptor de acceso) para acceder a un miembro de campo.

en el caso de String, esto es de esperar ya que es inmutable.

0

.length() es un método de una clase String y que devuelve el número de caracteres en la cadena.

.length dará la cantidad de elementos almacenados en una matriz.

public class length 
{ 
public static void main(String args[]) 
{ 
String x="test"; 
int a[]={1,2,3,4}; 
System.out.println(x.length()); 
System.out.println(a.length); 
} 
} 

// output 
4 
4 
2

La única manera verdadera de saber cuándo usar cuál es la experiencia. Aunque un IDE con autocompletado generalmente te ayudará cuando no lo recuerdes.

En su mayor parte (no siempre) array.length, System.out y System.err son los 3 más comunes que se toparán y que en realidad son acceso de miembros en lugar de llamadas a métodos.

0

Array.length es una propiedad de Array, similar a una referencia de variable.

ArrayList.size() es una llamada de método real al objeto de lista de matriz.

3

Arrays se manejan de manera diferente a Strings o ArrayLists o cualquier otra cosa que se pueda contar en Java. Un Array es más o menos un tipo nativo y su longitud nunca se puede cambiar después de su inicialización, por lo que no es necesario encapsularlo. La variable de longitud puede exponerse directamente sin efectos secundarios.

La razón por la String utiliza un método en lugar de una variable se debe a que internamente usa un char[] que no quiere exponer públicamente (por inmutabilidad/encapsulación), por lo que envuelve la longitud variable en un método length(). Es la misma razón que ArrayList tiene un método size() en lugar de una variable length.

La única vez que usará la variable en lugar del método es con arreglos. Todo lo demás serán métodos. Es decir, utilizará los corchetes para todo menos para las matrices.

0
int[] myArray = new int[10]; 
String myString = "hello world!"; 
List<int> myList = new ArrayList<int>(); 

myArray.length //gives the length of the array 
myString.length() //gives the length of the string 
myList.size()  //gives the length of the list 

Es muy probable que las cadenas y matrices se diseñaron en diferentes momentos y, por lo tanto, terminaron utilizando diferentes convenciones.Una justificación es que, como Strings usa matrices internamente, se utilizó una longitud de método() para evitar la duplicación de la misma información. En última instancia, esto es solo una evolución inconsistente que definitivamente se solucionaría si el lenguaje alguna vez se rediseña desde cero. : D

+0

No. No es que hayan sido diseñados en diferentes momentos. Cualquier cosa que tenga un "tamaño" –

0

La principal diferencia es que en el A) primer caso de su tipo de matriz, por ejemplo, int[], Object[], double[], etc .. que tiene un campo llamado pública longitud y el B) segundo caso es una cadena de objetos que tiene una función llamada length(), la función podría haberse llamado getLength() u otra cosa. La longitud del campo público tipo matriz es probablemente una resaca de la forma C++ de hacer las cosas.

tipos de matriz tienen la siguiente:

  • La longitud del campo public final, que contiene el número de componentes de la matriz (longitud puede ser positivo o cero)
  • El clon método público, que anula el método del mismo nombre en la clase Objeto y no arroja excepciones marcadas
  • Todos los miembros heredados de la clase Objeto; el único método de objeto que no es congénita, es su método clone

Tome un vistazo a this, Array Types.

0

length es una referencia de miembro de pseudo-datos, y solo funciona para arreglos (pequeños-a) (ignorando las clases que puede definir que implementan el miembro).

Todo lo demás es un objeto de una clase, y todas las clases de JDK que tienen este concepto definen los métodos de instancia length() o size(). (Ojalá hubieran sido coherentes y escogido uno o el otro, pero eso es agua en el puente.)

Cuestiones relacionadas