Java 데이터 유형 (유형)은 기본 유형(기본 유형)과 참조 유형(참조 유형)의 두 가지 주요 범주로 나눌 수 있습니다. 다음은 Java의 기본 데이터 유형에 대한 지식을 정리하는 것입니다. 관심 있는 친구들이 함께 학습할 수 있습니다.
1. 데이터 유형:
Java 소스 코드에서 각 변수 는 유형을 선언해야 합니다. Java 데이터 유형(유형)은 기본 유형과 참조 유형이라는 두 가지 주요 범주로 나눌 수 있습니다. 기본 유형에는 부울 유형과 숫자 유형(숫자 유형)이 포함됩니다. 숫자형은 다시 정수형과 부동소수점형으로 나누어집니다. 정수에는 5가지 유형이 있습니다: byte short int long char(char는 본질적으로 int의 특수 유형입니다). 부동 소수점 유형에는 float 및 double이 포함됩니다. 관계는 다음과 같이 구성됩니다.
2. 기본 유형:
Java는 기본 유형은 언어 수준 지원을 제공합니다. 즉, Java에서 사전 정의되고 해당 예약 키워드로 표시됩니다. 기본 유형은 복잡한 객체가 아닌 단일 값입니다. 기본 유형은 주로 효율성을 고려하지 않지만 기본 유형의 객체 버전도 제공합니다. 즉, 기본 유형 래퍼입니다. 이러한 기본 유형을 직접 사용하거나 기본 유형을 사용하여 배열 또는 기타 사용자 정의 유형을 구성할 수 있습니다. 기본 유형에는 명시적인 값 범위와 수학적 동작이 있습니다.
2.1 정수형정수형에는 byte short int long char이 포함되며 각각 8, 16, 32, 64, 16비트로 표현됩니다. 어떤 곳에서는 char가 정수 범주에 포함되지 않을 수 있지만 본질적으로 char 유형은 int의 하위 집합입니다. 정수의 너비를
정수가 차지하는 메모리 공간의 크기로 간주해서는 안 되며, 정수로 정의된 변수나 표현식의 동작으로 이해해야 합니다. JVM은 유형이 사양에 따라 작동하는 한 원하는 크기의 메모리 공간을 자유롭게 사용할 수 있습니다. byte short int long은 모두 부호가 있으며 2의 보수(2의 보수)로 표시됩니다. Char는 부호 없는 16비트로 표현되며 UTF-16 인코딩 세트를 나타냅니다.
바이트는 8비트의 1바이트로 표현되며 가장 작은
정수형이다. 주로 키 메모리 공간을 절약하는 데 사용됩니다. 바이트 유형은 네트워크, 파일 또는 기타 IO의 데이터 스트림에서 작업할 때 특히 유용합니다. 값 범위는 [-128, 127]입니다. 바이트의 기본값은 (바이트)0입니다. 값 범위를 벗어난 값을 바이트 유형 변수에 할당하려고 하면 바이트 b와 같은 컴파일 오류가 발생합니다. = 128; 이 문은 컴파일할 수 없습니다. 흥미로운 질문이 있습니다. public void test(byte b)라는 메소드가 있습니다. 이 메소드를 다음과 같이 호출하는 것은 잘못된 것입니다. test(0); 컴파일러는 유형 비호환이라는 오류를 보고합니다. ! ! 우리는 바이트 b =0을 기억합니다. 이는 전혀 문제가 되지 않습니다. 여기에 오류가 있는 이유는 무엇입니까?
여기에는 리터럴 값이라는 문제가 포함됩니다. 리터럴 값은 표면에 있는 값입니다. 예를 들어 소스 코드의 정수 리터럴 값은 5, 0, -200입니다. L 또는 l이 정수 끝에 추가되면 리터럴 값은 long 유형이 됩니다. 예를 들어 1000L은 long 유형의 값을 나타냅니다. L 또는 l을 추가하지 않으면 int 유형입니다. 기본 유형 중에서 byte short int long은 L을 추가하지 않고 정수 리터럴로 생성할 수 있습니다(int 리터럴이라고 부르겠습니다). 예를 들어 long 유형의 경우 크기가 범위를 초과하면 byte b = 100, short s = 5입니다. int가 표현할 수 있는 (32비트)는 L 엔딩으로 표현해야 합니다. 정수 리터럴은 16진수 [0X 또는 0x], 10진수 [없음], 8진수 [0] 2진수 [0B 또는 0b] 등 다양한 방식으로 표현될 수 있습니다. 이진수 리터럴은 JDK 7. 함수 이후에만 사용할 수 있습니다. 할당 작업에서 int 리터럴 값은 byte short int long에 할당될 수 있으며 Java 언어는 이 프로세스를 자동으로 처리합니다. 메소드 호출이 다른 경우 test(0)가 호출될 때 일치할 수 있는 메소드는 test(int)이며, 물론 Java가 이와 같은 메소드 호출을 지원하지 않는 이유는 test(byte) 메소드와 일치할 수 없습니다. 할당 작업을 지원하므로 선택의 여지가 없습니다. 래퍼와 기본 유형의 자동 변환(anto-boxing, auto-unboxing) 간의 차이점에 유의하세요. byte d = 'A'; 또한 유효하며 문자 리터럴은 자동으로 16비트 정수로 변환될 수 있습니다.
바이트 유형에 대한 수학 연산을 수행하면 자동으로 int 유형으로 승격됩니다. 표현식에 double 또는 float와 같은 유형이 있으면 자동으로 승격됩니다. 따라서 다음 코드는 잘못된 코드입니다.
byte s2 = 'a'; byte sum = s1 + s2;//should cast by (byte)</span></span></span>
2.1.2 short
는 16으로 표시되고 값 범위는 [- 2^15, 2^15 - 1]. short는 아마도 가장 일반적으로 사용되지 않는 유형일 것입니다. 범위(16비트)를 초과하지 않는 한 정수 리터럴 또는 문자 리터럴을 통해 값을 할당할 수 있습니다. short 유형이 작업에 참여하면 int 이상의 유형으로도 승격됩니다. (순서는 byte short int long float double입니다.)
2.1.3 int
32비트, [- 2^31, 2^31 - 1 ]. 부호 있는 2의 보수 로 표현되는 정수입니다. 일반적으로 사용되는 표현식은 루프 를 제어합니다. 작업 중에 byte 및 short가 int 유형 이상으로 승격됩니다. Java 8 이후에는 int 유형을 사용하여 부호 없는 32비트 정수[0, 2^31 - 1]를 나타낼 수 있습니다.
2.1.4 long
64비트, [- 2^63, 2^63 - 1, 기본값은 0L]인 경우. 매우 큰 숫자를 계산해야 할 때 int가 크기를 수용할 만큼 크지 않으면 long 유형을 사용할 수 있습니다. 길이가 충분하지 않으면 BigInteger 클래스를 사용할 수 있습니다.
2.1.5자
16비트, [0, 65535], [0, 2^16 -1], 'u0000부터 '으으으'로. 부호가 없으며 기본값은 'u0000'입니다. Java는 유니코드 문자 집합 을 사용하여 문자를 나타냅니다. 유니코드는 모든 인간 언어의 문자를 나타낼 수 있는 완전히 국제적인 문자 집합입니다. 유니코드에는 16비트 너비가 필요하므로 Java의 char 유형도 16비트로 표시됩니다. 할당은 다음과 같습니다:
char ch1 = 88; char ch2 = 'A';
ASCII 문자 집합은 유니코드의 처음 127개 값을 차지합니다. char이 정수 유형으로 분류되는 이유는 Java가 char에 대한 산술 연산 지원을 제공하기 때문입니다. 예를 들어 ch2++는 ch2가 Y가 됩니다. char가 더하기, 빼기, 곱하기 및 나누기 연산을 수행하는 경우에도 int 유형으로 변환되므로 명시적으로 다시 변환해야 합니다.
2.2 부동 소수점 유형
에는 IEEE 754 사양에 따라 각각 32비트와 64비트로 표현되는 단정밀도 부동소수점과 배정밀도 배정도가 포함됩니다.
2.2.1 float
은 단정밀도 부동 소수점 수에 해당하는 32비트로 표현되며, double보다 빠르게 실행되고 메모리를 덜 차지합니다. 값이 매우 크거나 매우 작을 경우 부정확해집니다. 정밀도 요구사항이 높지 않은 경우에는 float 유형을 사용할 수 있습니다. 선언 할당의 예:
f1 = 10L; f1 = 10.0f; //f1 = 10.0;默认为double</span></span></span>
는 float 유형에 byte, short, int, long 및 char를 할당할 수 있으며 java는 자동으로 할당됩니다. 변환을 완료합니다.
2.2.2 double
64는 변수에 부동 소수점 값을 할당할 때 리터럴 값 뒤에 f 또는 F가 표시되지 않으면 기본값이 더블형이다. java.lang.Math의 함수는 모두 double 유형을 채택합니다.
double이나 float 모두 원하는 정밀도를 얻을 수 없는 경우 BigDecimal 클래스를 사용할 수 있습니다.
2.3 부울 유형
부울 유형은 true와 false 두 가지 값만 가지며 기본값은 false입니다. boolean은 0인지 아닌지와는 관계가 없지만, 원하는 로직에 따라 변환할 수 있습니다. 부울 유형은 여러 곳에서 필요합니다.
3. 리터럴 값
Java 소스 코드에서는 리터럴 값을 사용하여 고정된 값을 나타냅니다. 숫자 리터럴 값이 가장 일반적입니다. String 리터럴 값은 하나의 유형으로 간주할 수 있습니다. 물론 특수한 null도 리터럴 값으로 간주할 수 있습니다. 리터럴 값은 크게 정수 리터럴, 부동 소수점 리터럴, 문자 및 문자열 리터럴, 특수 리터럴로 나눌 수 있습니다.
3.1. 整型字面值
从形式上看是整数的字面值归类为整型字面值。例如: 10, 100000L, 'B'、0XFF这些都可以称为字面值。整型字面值可以用十进制、16、8、2进制来表示。十进制很简单,2、8、16进制的表示分别在最前面加上0B(0b)、0、0X(0x)即可,当然基数不能超出进制的范围,比如09是不合法的,八进制的基数只能到7。一般情况下,字面值创建的是int类型,但是int字面值可以赋值给byte short char long int,只要字面值在目标范围以内,Java会自动完成转换,如果试图将超出范围的字面值赋给某一类型(比如把128赋给byte类型),编译通不过。而如果想创建一个int类型无法表示的long类型,则需要在字面值最后面加上L或者l。通常建议使用容易区分的L。所以整型字面值包括int字面值和long字面值两种。
3.2. 浮点字面值
浮点字面值简单的理解可以理解为小数。分为float字面值和double字面值,如果在小数后面加上F或者f,则表示这是个float字面值,如11.8F。如果小数后面不加F(f),如10.4。或者小数后面加上D(d),则表示这是个double字面值。另外,浮点字面值支持科学技术法表示。下面是一些例子:
double d2 = 11.4; double d3 = 1.23E3; double d4 = 10D; double d5 = 0.4D; float f1 = 10; float f2 = 11.1F; float f3 = 1.23e-4F; float f4 = 1.23E0F;</span>
3.3 字符及字符串字面值
Java中字符字面值用单引号括起来,如‘@'‘1'。所有的UTF-16字符集都包含在字符字面值中。不能直接输入的字符,可以使用转义字符,如‘\n'为换行字符。也可以使用八进制或者十六进制表示字符,八进制使用反斜杠加3位数字表示,例如'\141'表示字母a。十六进制使用\u加上4为十六进制的数表示,如'\u0061'表示字符a。也就是说,通过使用转义字符,可以表示键盘上的有的或者没有的所有字符。常见的转义字符序列有:
\ddd(八进制) 、 \uxxxx(十六进制Unicode字符)、\'(单引号)、\"(双引号)、\\ (反斜杠)\r(回车符) \n(换行符) \f(换页符) \t(制表符) \b(回格符)
字符串字面值则使用双引号,字符串字面值中同样可以包含字符字面值中的转义字符序列。字符串必须位于同一行或者使用+运算符,因为java没有续行转义序列。
3.4 特殊字面值
null是一种特殊的类型(type),可以将它赋给任何引用类型变量,表示这个变量不引用任何东西。如果一个引用类型变量为null,表示这个变量不可用。
还有一种特殊的class literal,用type name加上.class表示,例如String.class。首先,String是类Class(java.lang.Class)的一个实例(对象),而"This is a string"是类String的一个对象。然后,class literal用于表示类Class的一个对象,比如String.class用于表示类Class的对象String。简单地说,类子面子(class literal)就是诸如String.class 、Integer.class这样的字面值,它所表示的就是累String、类Integer。如果输出Integer.class,你会得到class java.lang.Integer。List.class的输出为interface java.util.List。总之,class literal用于表示类型本身!
3.5 在数值型字面值中使用下划线。
JDK7开始,可以在数值型字面值(包括整型字面值和浮点字面值)插入一个或者多个下划线。但是下划线只能用于分隔数字,不能分隔字符与字符,也不能分隔字符与数字。例如 int x = 123_456_789.在编译的时候,下划线会自动去掉。可以连续使用下划线,比如float f = 1.22_3344.二进制或者十六进制的字面值也可以使用下划线,记住一点,下划线只能用于数字与数字之间,初次以外都是非法的。例如1._23是非法的,_123、11000_L都是非法的。
4. 基本类型之间的转换
我们看到,将一种类型的值赋给另一种类型是很常见的。在Java中,boolean类型与所有其他7种类型都不能进行转换,这一点很明确。对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。首先将7种类型按下面顺序排列一下:
byte <(short=char)< int < long < float < double
如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。
4.1 自动转换
自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。
》int--> float 》long--> float 》long--> double 》float -->double without strictfp
除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。
4.2 强制类型转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:
byte b; b = (byte)a;//1</span>
如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200.
将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
7种基本类型转换总结如下图:
4.3 赋值及表达式中的类型转换:
4.3.1 字面值赋值
在使用字面值对整数赋值的过程中,可以将int literal赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如 byte b = 10L;是错的,要进行强制转换。
4.3.2 表达式中的自动类型提升
除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:
》所有byte/short/char都被提升为int。
》如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。
위 내용은 Java 기본 데이터 유형 그래픽 코드(파워 노드 배열)에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!