乐趣区

关于java:Java程序员都要懂得知识点原始数据类型

摘要:Java 原始数据类型有 short、byte、int、long、boolean、char、float、double。原始数据是未解决的或简化的数据,它形成了物理存在的数据,原始数据具备多种存在模式,例如文本数据、图像数据、音频数据或几种类型数据的混合。

本文分享自华为云社区《Java 知识点问题总结之原始数据类型》,原文作者:breakDraw。

java 原始数据类型有 short、byte、int、long、boolean、char、float、double。原始数据是未解决的或简化的数据,它形成了物理存在的数据,原始数据具备多种存在模式,例如文本数据、图像数据、音频数据或几种类型数据的混合。认为对于 Java 原始数据类型的相干知识点总结。

Q:java 中数据类型大小会和平台是 32 位、64 位相干吗?

A:不相干,虚拟机起因平台兼容

Q:java 中解析数据时,须要思考处理器的大小端问题吗?(即 0x1234 的 12 是放在高地址还是低地址)

A:不须要。java 因为虚拟机的关系, 屏蔽了大小端问题, 须要晓得的话可用 ByteOrder.nativeOrder() 查问。在操作 ByteBuffer 中,也能够应用 ByteBuffer.order() 进行设置:。

Q:java 中 short、int、long 的字节别离是多少?
A:2、4、8

Q:float、double 是多少字节?
A:4、8

Q: java 中 byte、char 是多少字节?C++ 中 char 是多少字节?
A : java 中是 1 和 2,C++ 中 char 是 1

Q:java 中 boolean 类型的大小?
A:bool 类型无空间大小(来自 java 编程思维)
依据 http://docs.oracle.com/javase…:

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its“size”isn’t something that’s precisely defined.

布尔类型:布尔数据类型只有两个可能的值:真和假。应用此数据类型为跟踪真 / 假条件的简略标记。这种数据类型就示意这一点信息,然而它的“大小”并不是准确定义的。

贴一下书中对于数据类型的形容:

Q:不可变类型有哪几种?
A:short、int、long、float、double、byte、char、boolean 的 包装类型,以及 String,这 9 种属于不可变类型。(这只是局部,还有其余的不可变类)

  • 不可变类型概念:外面的值的内容变了,对应的内存地址也会变动。

Q:类里的成员如果是根本数据类型,那么会主动初始化吗?初始化成什么?
A:会,初始化为 0 或者 false。

Q:java 中局部变量没初始化,会报错吗?
A:会

Q:布尔类型能够强制转化成其余类型吗?
A:不能。boolean b = 1 或者 boolean b =“true”是不能够的

Q:什么时候不能隐式转化?
A:如果会失落精度,则不能隐式转化,比方 long 转 int 或者 double 转 long 这种。编译器会强制咱们应用强制转化

Q: 8 种原始数据类型的类型优先级排序是?
A:
(byte/short/char)<int<long<float<double
即隐式转换都是从低往高转。

Q: 上面哪个是谬误的?

A:
B 选项是谬误的。
因为 2 个 byte 类型变量相加的时候,会主动转换成 int 类型,左边的 int 类型赋值给 short 类型便会报错。(好冷的常识)

Q:

float f = 1.1;

有错吗?
A:
float 浮点前面要加 f。加 f 就代表是 float 类型,否则就是 double 类型浮点。

float f = 1.1f;
double d1 = 1.1;

Q:布尔类型能够做加减乘除吗?
A:不能

Q:Integer N = 0; int n = N; 这时候会产生什么?
A:主动拆包

Q:整型包装类型的比拟,上面输入啥?

Integer num1 = 128,num2 = 128;
System.out.println(num1==num2);

A:
输入 false。
值的范畴在 -128~127 的时候 Integer 能够间接用 == 比拟大小,然而超出这个范畴时,== 就不论用了,要用 equals。
大抵起因是在那个范畴,Integer 的对象会间接用缓存对象,所以地址都雷同。
不在那个范畴,Integer 对象会新生成 1 个对象,所以地址不同。

  • 另一个留神点:“==”对于对象来说,比拟的是地址。

Q:java 中哪 2 个类能够反对任意精度的整数 和任意精度的浮点数?
A: BigInteger 和 BigDecimal

  • 这 2 个也属于不可变类。

Q: java 的数组肯定须要咱们手动初始化吗?
A:不须要,数组元素会主动初始化为 null 或者 0 或者 false。

Q:java 反对 C ++ 里的运算符重载吗?
A:不反对

Q:if(a=b) 能够吗?
A:不行,不能在条件表达式中放入赋值操作。除非 a 和 b 都是 boolean 类型。

Q:浮点数相等的比拟形式
A:相等的话要像上面这样

if(Math.abs(a-b))<1E-6F)

如果用浮点的 a == b 或者 a!= b 做 while 循环退出判断,可能会导致死循环

Q:上面的数组申明哪几个是对的?
A. char[] chr1 = new char[]{‘A’,‘B’,‘C’};
B. char[] chr2 = new char[3]{‘A’,‘B’,‘C’};
C. char[][] chr3 = new char[][10];
D. char[][] chr4 = new char[10][];
E. char[] chr5 = new char[3];

A:ADE 是对的。

§字符串

Q:StringBuffer 和 StringBuilder 的区别:
A:
StringBuffer 是线程平安的,然而慢
StringBuilder 是线程不平安的(即能够多个线程同时读取他的内容),然而快。

Q:String s =“123”+“456”+“789”; 对于这种动态的拼接,用 StringBuffer 去拼接比用 String 去拼接要快,对吗?
A:错,反编译代码后,咱们发现代码是
String s =“123456789”;
因为对于动态字符串的连贯操作,Java 在编译时会进行彻底的优化,将多个连贯操作的字符串在编译时合成一个独自的长字符串。
因而要留神 StringBuffer/Builder 的实用场合:for 循环中大量拼接字符串。
如果是动态的编译器就能感知到的拼接,不要自觉地去应用 StirngBuffer/Builder
PS:

  • 如果是字符串变量相加,会优化成 StringBuilder 做 append
  • 如果是常量字符串相加,则会间接拼接
    具体能够查看这篇博文,外面有展现这 2 种状况的字节码。
    https://blog.csdn.net/weixin_34405557/article/details/89630362?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

Q:上面输入什么后果?为什么?

String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
 
System.out.println(s1 == s2);  // true
System.out.println(s1 == s3);  // true
System.out.println(s1 == s4);  // false
System.out.println(s4 == s5);  // false
System.out.println(s1 == s6);  // true
System.out.println(s1 == s9);  // false

Q:
println(s1 == s2)输入 true
println(s1 == s3)输入 true
println(s1 == s4)输入 false
println(s4 == s5)输入 false
println(s1 == s6)输入 true
println(s1 == s9)输入 false

  • 字符串的 == 操作比拟的是援用地址。
  • 如果是间接写死在代码里的常量字符串,则地址是固定的,都在常量池中。
  • 写死的常量字符串拼接,依旧会作为常量放入常量池中。(常量池就是指,程序编译的时候,就曾经晓得了这个字符串)
  • 如果是 String 类型的,则援用地址是堆中的 string 对象地址,而十分量池中地址。(因为程序编译的时候,string 里的内容不肯定是确定的,因而不可能会放到常量池中)
  • 因而波及 string 拼接的,都是和原先常量不等。s7 和 s8 曾经属于 string 对象,所以二者不属于常量拼接。
  • intern 会试图把字符串放入常量池。

具体起因可见:https://www.cnblogs.com/syp17…

§可变参数

Q:办法重载时,如何抉择可变参数和固定参数?像上面输入啥:

 public static void main(String[] args) {f(1);
    }
 
    public static void f(int ...a){System.out.println("可变参数办法:"+Arrays.toString(a));
    }
 
    public static void f(int a){System.out.println("固定长度 参数办法:"+a);
    }

A:输入固定长度参数办法。

准则:如果重载办法中,固定参数办法能满足,优先用固定参数办法,不满足时再去抉择可变参数办法。

§参考资料:

https://www.cnblogs.com/syp17…

点击关注,第一工夫理解华为云陈腐技术~

退出移动版