Pourquoi int a[10] = {1,2,3,4,5,6,7,8,9,10};
String str = "foo";
int a_len = a.length;
int str_len = str.length();
3 Réponses :
C'est considéré comme une variable et non une méthode. Ce serait comme si vous avez créé une classe et que le public statique Int num et plus loin dans une méthode a raconté que nombre d'être égal à quelque chose de globalement p>
Simplement: c'est comme ça, et comme ça fait toujours été. P>
C'est spécifié dans Section JLS 10.7 que les tableaux ont une finale publique Il y a quelques morceaux d'incohérence qui ont survécu depuis 1,0 - évidemment, ces choses ne peuvent vraiment pas être changées après la libération ... p> longueur code>. Cela aurait pu être spécifié comme une méthode à la place, pour la cohérence - mais il n'était tout simplement pas ... tout aussi chaîne code> pourrait em> avoir fait une décision de mise en œuvre d'avoir une finale publique < Code> longueur code> champ - mais encore une fois, cela n'arrive pas à être de cette façon. P>
Et puisque le JIT sera probablement en ligne String: Longueur () Code> Quoi qu'il en soit, il ne devrait y avoir aucune différence dans la performance non plus.
Oui, je suis sûr que s'il était fait, il serait fait différemment. Soit une longueur de matrice une méthode appelez ou introduisez un régime général pour les champs en lecture seule pour tous les objets.
@jon Skeet: Donc, n'a-t-il pas eu lieu dans les prochains versions signifie qu'ils auraient pu simplement ajouter du champ de données de longueur à la chaîne?
@Vaibhavagarwal: Cela s'éloignerait de la meilleure pratique généralement acceptée pour séparer les API de la mise en œuvre. La meilleure solution aurait été d'introduire une méthode longueur () code> dans les tableaux, mais cela aurait été déroutant d'avoir les deux, imo.
D'accord. Donc, je prends, c'est comme c'était la première mise en œuvre qu'ils ont proposée et ne voulaient pas le changer plus tard. Droit?
@Vaibhavagarwal - Yep. Et il y a beaucoup de choses dans Java (et la plupart des autres langues) comme ça. Java en particulier a été assez rigide sur ses points de compatibilité à la hausse et tant d'améliorations / changements «raisonnables» ont été rejetées.
@Hot Licks Point accepté. Mais la chose que je suis confuse est que si nous voulons garder une langue à la hausse compatible, alors pourquoi avons-nous des types de données obsolètes? Pourquoi ne pas les garder?
Tout d'abord, Java n'a que très rarement (si jamais) complètement éliminé une classe ou une méthode - généralement, ils sont simplement «obsolètes» et fortement découragés. Deuxièmement, les tuteurs de l'API (et surtout l'API en dehors du principal Java. Code> Les classes) sont différentes des gardiens de la machine virtuelle Java, Bytecodes, et al. Ce dernier groupe est (généralement) conservateur à une faute, tandis que l'ancien groupe est souvent trop rapide pour lancer de nouvelles fonctionnalités et options.
Les tableaux n'ont pas besoin d'implémenter une interface, de sorte que Comme des licks chauds indiqués ci-dessous, chaîne code> implémente charcuternence code> et donc longueur code> doit être une méthode dans ce cas car les interfaces ne peuvent spécifier que des méthodes. P>
longueur code> est implémentée en tant que champ final public dans ce cas afin d'éviter les appels de méthode supplémentaires. P>
Chaluquant (code> n'existait pas avant Java 1.4. Bien que la Chaluquant n'était évidemment pas la raison de conduite de ce choix de conception (puisqu'elle n'existait pas), il serait toujours logique de choisir cette conception avec l'idée que la chaîne pourrait avoir besoin de mettre en œuvre de nouvelles interfaces à l'avenir. P>
Il n'y avait rien de tel que charcuternence code> lorsque cette décision a été prise.
@Hotlicks - C'est un très bon point, et il est mis en évidence par les documents de 1,2 pour String . Bien que Chaluquant n'existait pas à l'époque, la capacité d'utiliser longueur code> dans une future interface pourrait très bien avoir joué un rôle dans la décision. Je vais mettre à jour ma réponse cependant.
Une plus grande question est de savoir pourquoi Java n'a pas implémenté une classe de base pour des objets ressemblant à des cordes et faire une chaîne une sous-classe. Chaluquant est une tentative faible de récupérer de cette surveillance.
probablement parce que la longueur de la matrice est stockée dans le cadre de l'objet Array, et la longueur de la chaîne n'est pas et devra être calculée.
@Shmiddty - En fait, la longueur de la chaîne est stockée.
@Shmiddty: Étant donné que les chaînes de Java sont immuables, la valeur pourrait être mise en cache.
Aussi discuté ici: Stackoverflow.com/questions/5950155/java-Arrays-length
Temps de fonctionnement des appels de fonction, ce n'est pas raisonnable. Pourquoi les chaînes n'ont pas ce champ?
@Hotlicks Je voudrais simplement spéculer (c'est pourquoi je ne l'ai pas posté comme une réponse).
@Shmiddty - Eh bien, vous êtes peut-être en partie vrai - il est possible que tôt, dans la version 0.0.1 ou autre, string.length () requis sur calcul requis et le concept "coincé". Mais à partir des versions 1.2 - 5.0, lorsque je travaillais dans les entrailles de Java, la longueur d'un objet de chaîne a toujours été stockée dans l'objet comme un seul champ Int.
@Hotlicks si probablement qu'il est lié à la compatibilité à l'envers?
@Shmiddty - C'est définitivement la compatibilité en retard. Et peut-être quelques egos.
Une autre question est pourquoi le même concept s'appelle «taille» dans d'autres contextes. Beaucoup d'incohérence.
@Hotlicks c'est une bonne question aussi. Avez-vous une réponse pour cela aussi?
@Vaibhavagarwal - que j'attribuais plus tôt dans la négligence.
Tout le monde i> est en train de spéculer. La réponse est "parce que c'est la façon dont gosling et al. I> a conçu". Pas beaucoup de point dans la demande ici: vous obtiendrez des devinettes et si vous êtes chanceux, certains de la chance post hoc i> raisonnement. Vous demandez au mauvais endroit. Pas constructif.