자바의 길이와 길이 ()
배열의 길이를 속성으로 사용하는 이유는 무엇 array.length
이며 String의 경우 메소드가 str.length()
있습니까?
이유가 있나요?
먼저 비슷한 목적을 위해 세 가지 방법을 강조하겠습니다.
length
- 어레이 ( int[]
, double[]
, String[]
) - 배열의 길이를 알고
length()
- 문자열 관련 객체 ( String
, StringBuilder
등)-문자열의 길이를 알기 위해
size()
- 컬렉션 개체 ( ArrayList
, Set
등)-컬렉션의 크기를 알기 위해
이제 잊어 length()
단지 생각 length
하고 size()
.
length
메서드가 아니므로 객체에서 작동하지 않는다는 것이 완전히 이해됩니다. 배열에서만 작동합니다.
size()
그것의 이름은 그것을 더 잘 설명하고 그것이 메소드이기 때문에 내가 거기에서 말했듯이 컬렉션 (컬렉션 프레임 워크)과 함께 작동하는 객체의 경우에 사용될 것입니다.
이제 와서 length()
:
String은 원시 배열이 아니고 (그래서 우리는 사용할 수 없습니다 .length
) 컬렉션이 아니고 (그래서 우리는 사용할 수 없습니다 ) 그래서 우리 .size()
는 다른 하나가 필요합니다 (차이점을 length()
유지하고 목적을 제공합니다).
이유에 대한 대답으로 ?
유용하고, 기억하기 쉽고, 사용하기 쉽고 친근하다고 생각합니다.
약간 단순화하면 배열이 일반 클래스가 아니라 특수한 경우라고 생각할 수 있습니다 (기본 요소와 비슷하지만 그렇지 않음). 문자열과 모든 컬렉션은 클래스이므로 크기, 길이 또는 유사한 것을 얻는 방법입니다.
디자인 당시의 이유는 성능 때문이라고 생각합니다. 오늘 만들었다면 아마도 배열 기반 컬렉션 클래스와 같은 것을 생각해 냈을 것입니다.
관심이 있으시면 생성 된 코드에서 두 코드의 차이점을 설명하는 작은 코드 스 니펫이 있습니다. 먼저 소스 :
public class LengthTest {
public static void main(String[] args) {
int[] array = {12,1,4};
String string = "Hoo";
System.out.println(array.length);
System.out.println(string.length());
}
}
바이트 코드에서 중요하지 않은 부분을 잘라 내고 javap -c
클래스 에서 실행 하면 마지막 두 줄에 대해 다음과 같은 결과가 나타납니다.
20: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_1
24: arraylength
25: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
28: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_2
32: invokevirtual #5; //Method java/lang/String.length:()I
35: invokevirtual #4; //Method java/io/PrintStream.println:(I)V
첫 번째 경우 (20-25)의 경우 코드는 JVM에 배열의 크기를 요청합니다 (JNI에서는 GetArrayLength ()에 대한 호출 일 수 있음). 반면 문자열의 경우 (28-35)에서는 다음을 수행해야합니다. 길이를 얻기위한 메서드 호출.
1990 년대 중반에 좋은 JIT와 물건이 없었다면 java.util.Vector (또는 이와 유사한 것) 만 있고 실제로 클래스처럼 동작하지는 않지만 빠르다는 언어 구조가 아니라면 성능이 완전히 저하되었을 것입니다. 물론 속성을 메서드 호출로 마스킹하고 컴파일러에서 처리 할 수 있었지만 실제 클래스가 아닌 것에 메서드를 사용하는 것이 훨씬 더 혼란 스러웠을 것입니다.
.length
Java의 일회성 속성입니다. 1 차원 배열 의 크기를 찾는 데 사용됩니다 .
.length()
방법입니다. 길이를 찾는 데 사용됩니다 String
. 값이 중복되는 것을 방지합니다.
치다:
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
문자열과 배열이 서로 다른 시간에 설계되었으므로 결국 서로 다른 규칙을 사용했을 가능성이 큽니다. 한 가지 이유는 문자열이 내부적으로 배열 length()
을 사용하기 때문에 동일한 정보의 중복을 방지하기 위해 메서드 를 사용했다는 것입니다. 또 다른 방법 length()
은 배열의 크기도 변경할 수 없지만 메서드를 사용하면 문자열의 불변성을 강조하는 데 도움이됩니다.
궁극적으로 이것은 언어가 처음부터 다시 디자인된다면 확실히 고쳐질 진화 된 불일치 일뿐입니다. 내가 아는 한 다른 언어 (C #, Python, Scala 등)가 동일한 작업을 수행하지 않는 한 이것은 언어의 일부로 끝난 약간의 결함 일 수 있습니다.
You'll get an error if you use the wrong one anyway.
In Java, an Array stores its length separately from the structure that actually holds the data. When you create an Array, you specify its length, and that becomes a defining attribute of the Array. No matter what you do to an Array of length N (change values, null things out, etc.), it will always be an Array of length N.
A String's length is incidental; it is not an attribute of the String, but a byproduct. Though Java Strings are in fact immutable, if it were possible to change their contents, you could change their length. Knocking off the last character (if it were possible) would lower the length.
I understand this is a fine distinction, and I may get voted down for it, but it's true. If I make an Array of length 4, that length of four is a defining characteristic of the Array, and is true regardless of what is held within. If I make a String that contains "dogs", that String is length 4 because it happens to contain four characters.
I see this as justification for doing one with an attribute and the other with a method. In truth, it may just be an unintentional inconsistency, but it's always made sense to me, and this is always how I've thought about it.
I was taught that for arrays, length is not retrieved through a method due to the following fear: programmers would just assign the length to a local variable before entering a loop (think a for loop where the conditional uses the array's length.) The programmer would supposedly do so to trim down on function calls (and thereby improve performance.) The problem is that the length might change during the loop, and the variable wouldn't.
Whenever an array is created, its size is specified. So length can be considered as a construction attribute. For String, it essentially a char array. Length is a property of the char array. There is no need to put length as a field, because not everything needs this field. http://www.programcreek.com/2013/11/start-from-length-length-in-java/
I just want to add some remarks to the great answer by Fredrik.
The Java Language Specification in Section 4.3.1 states
An object is a class instance or an array.
So array has indeed a very special role in Java. I do wonder why.
One could argue that current implementation array is/was important for a better performance. But than it is an internal structure, which should not be exposed.
They could of course have masked the property as a method call and handled it in the compiler but I think it would have been even more confusing to have a method on something that isn't a real class.
I agree with Fredrik, that a smart compiler optimazation would have been the better choice. This would also solve the problem, that even if you use a property for arrays, you have not solved the problem for strings and other (immutable) collection types, because, e.g., string
is based on a char
array as you can see on the class definition of String
:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[]; // ...
And I do not agree with that it would be even more confusing, because array does inherit all methods from java.lang.Object
.
As an engineer I really do not like the answer "Because it has been always this way." and wished there would be a better answer. But in this case it seems to be.
tl;dr
In my opinion, it is a design flaw of Java and should not have implemented this way.
참고URL : https://stackoverflow.com/questions/1965500/length-and-length-in-java
'development' 카테고리의 다른 글
사본이있는 Numpy 배열 할당 (0) | 2020.09.16 |
---|---|
Angular 2에서 상대 경로가 매우 긴 가져 오기를 피하는 방법은 무엇입니까? (0) | 2020.09.16 |
Vim에서 한 번에 여러 파일을 열려면 어떻게해야합니까? (0) | 2020.09.16 |
JTable 삽입 후 테이블 모델을 새로 고치는 방법 데이터를 삭제하거나 업데이트합니다. (0) | 2020.09.16 |
GridFS는 생산에 충분히 빠르고 안정적입니까? (0) | 2020.09.16 |