- 图谱
- Q/A
- Java 中应该使用什么数据类型来代表价格?
- 怎么将 byte 转换为 String?
- 我们能将 int 强制转换为 byte 类型的变量吗? 如果该值大于 byte 类型的范围,将会出现什么现象?
- 存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么? 如 C = (C) B;
- a = a + b 与 a += b 的区别
- 我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?
- 3*0.1 == 0.3 将会返回什么? true 还是 false?
- int 和 Integer 哪个会占用更多的内存?
- 为什么 Java 中的 String 是不可变的(Immutable)?
- 我们能在 Switch 中使用 String 吗?
- 有没有可能两个不相等的对象有有相同的 hashcode?
- 两个相同的对象会有不同的的 hash code 吗?
- 我们可以在 hashcode() 中使用随机数字吗?
- “a==b”和”a.equals(b)”有什么区别?
- final、finalize 和 finally 的不同之处?
- 静态内部类与顶级类有什么区别?
- Java 中,Serializable 与 Externalizable 的区别?
- 接口是什么? 为什么要使用接口而不是直接使用具体类?
- equals与==的区别
- String、StringBuffer与StringBuilder的区别
- switch能否用String做参数
著作权归https://www.pdai.tech所有。 链接:https://www.pdai.tech/md/java/basic/java-basic-lan-sum.html
本文章全部内容都来自 https://www.pdai.tech 我只是用于知识体系巩固。不存在盈利行为。
图谱
Q/A
Java 中应该使用什么数据类型来代表价格?
如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。
浮点型本身在转换中就不精确。
怎么将 byte 转换为 String?
看起来挺奇怪的,下面转换的其实是ABCD 对应自己的字节码,通常也不会用到byte[] 在存储参数
byte a = 123;
String s = String.valueOf(a);
System.out.println(s); // 123
byte[] byteArray = new byte[] {65, 66, 67, 68, 69};
String s1 = new String(byteArray);
System.out.println(s1); //ABCD
我们能将 int 强制转换为 byte 类型的变量吗? 如果该值大于 byte 类型的范围,将会出现什么现象?
是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 127。
int a = 128;
byte b = (byte) a;
System.out.println(b);// -128
存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么? 如 C = (C) B;
可以,向下转型。但是不建议使用,容易出现类型转型异常
a = a + b 与 a += b 的区别
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。
a+b 的方式 会选自动转成了int,然后进行运算
byte a = 127;
byte b = 1;
b = a+b; // 不兼容的类型: 从int转换到byte可能会有损失
byte c = 127;
byte d = 1;
System.out.println(c+=d); // -128
我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?
不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。
Double a = Double.valueOf(123);
Long b = a;// 不兼容的类型: java.lang.Double无法转换为java.lang.Long
Double c = Double.valueOf(123);
Long d = c.longValue();
System.out.println(d); // 123
3*0.1 == 0.3 将会返回什么? true 还是 false?
false,因为有些浮点数不能完全精确的表示出来。就是这么奇怪,浮点型就是一个奇怪的类型。
double a = 3;
double b = 0.3;
double c = 0.3;
System.out.println(a*0.1); // 0.30000000000000004
System.out.println(a*0.1 == 0.3); // false
System.out.println(b == c); // true
int 和 Integer 哪个会占用更多的内存?
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
为什么 Java 中的 String 是不可变的(Immutable)?
其中 a 的这种用双引号创建的方式,是直接用到了字符串常量池,那我用 a = “321” 输出时值的确变了。
用 new String() 方式创建,最后也用 c = “3214567897” ,输出也变了呀。
输出的值虽然变了,但是 “123” 还是那个 “123” , a = “321” 只不过是重新又建立一个值 把 a 对应的值切换到了新的。
String a = "123";
String b = "123";
String c = new String("123");
a = "321";
c = "321456897";
System.out.println(a); // 321
System.out.println(c); // 321456897
我们能在 Switch 中使用 String 吗?
从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。
String a = "hello";
switch (a){
case "hello":
System.out.println("hello world"); // 成功输出:hello world
break;
}
有没有可能两个不相等的对象有有相同的 hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。
两个相同的对象会有不同的的 hash code 吗?
不能,根据 hash code 的规定,这是不可能的。
我们可以在 hashcode() 中使用随机数字吗?
不行,因为对象的 hashcode 值必须是相同的。
“a==b”和”a.equals(b)”有什么区别?
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较
final、finalize 和 finally 的不同之处?
- final 可以修饰 熟悉、方法、类 意味不可变动和改变
- finalize 不太懂这个,改变就没用过呀🤣 (Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。)
- finally finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。
静态内部类与顶级类有什么区别?
顶级类 就是你建了一个类文件,这个类的类名 要是一样的。 而静态内部类可以随便起名字
Java 中,Serializable 与 Externalizable 的区别?
Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。
接口是什么? 为什么要使用接口而不是直接使用具体类?
接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现。
可以看到 List 这个接口,有很多类都实现了,比如 ArrayList
equals与==的区别
简单来说 == 比对的是对象的地址值;equals 比对的就是真正的值。
String、StringBuffer与StringBuilder的区别
第一点: 可变和适用范围。String对象是不可变的,而StringBuffer和StringBuilder是可变字符序列。每次对String的操作相当于生成一个新的String对象,而对StringBuffer和StringBuilder的操作是对对象本身的操作,而不会生成新的对象,所以对于频繁改变内容的字符串避免使用String,因为频繁的生成对象将会对系统性能产生影响。
第二点: 线程安全。String由于有final修饰,是immutable的,安全性是简单而纯粹的。StringBuilder和StringBuffer的区别在于StringBuilder不保证同步,也就是说如果需要线程安全需要使用StringBuffer,不需要同步的StringBuilder效率更高。
switch能否用String做参数
Java1.7开始支持,但实际这是一颗Java语法糖。除此之外,byte,short,long,枚举,boolean均可用于switch,只有浮点型不可以。好多类型可以做为参数呀,以前还以为只有 int 和 String😂