挑战第3天
- Java 创建对象有几种方式?
- 有没有可能两个不相等的对象有相同的hashCode
- 深拷贝和浅拷贝的区别
- final有哪些用法
- static有哪些用法
- 3*0.1 == 0.3 返回值是什么
- a=a+b与a+=b有什么区别
- try catch finally,try里有 return,finally还执行么
Java 创建对象有几种方式?
- 使用new关键字:
- 通过反射机制:
- 使用java.lang.Class类的newInstance()方法或者java.lang.reflect.Constructor类的newInstance()方法来创建对象。
- 采用clone机制:
- 利用对象的clone()方法来复制一个已经存在的对象,从而创建一个新的对象。
- 通过序列化机制:
- 通过将对象序列化到文件、内存或网络中,然后再反序列化回对象,以此来创建对象。这通常涉及到实现java.io.Serializable接口。
有没有可能两个不相等的对象有相同的hashCode
- 可能存在相同hashCode值:
- 在哈希表中,不同的对象可能因为哈希算法的设计而产生相同的哈希码(hashCode),这种现象称为哈希冲突。
- 处理哈希冲突的方法:
- 拉链法:
- 每个哈希表的槽位(索引)上挂一个链表,当发生冲突时,冲突的元素会被添加到对应槽位的链表中。
- 开放定址法:
- 当发生冲突时,寻找哈希表中的下一个空闲位置,将冲突的元素存储在那里。这通常涉及到线性探测、二次探测或双重哈希等策略。
- 再哈希法:
- 使用多个不同的哈希函数,当发生冲突时,尝试使用下一个哈希函数计算新的位置,直到找到一个没有冲突的位置。
深拷贝和浅拷贝的区别
- 浅拷贝:
- 只复制对象本身,不复制对象内部引用的对象。
- 对象的非基本类型属性仍然指向原始对象中的相同引用。
- 修改原始对象的引用属性会影响拷贝对象的相应属性。
- 深拷贝:
- 复制对象及其内部引用的所有对象,创建完全独立的副本。
- 对象的所有属性,包括基本类型和非基本类型,都被复制。
- 修改原始对象的引用属性不会影响拷贝对象的相应属性。
final有哪些用法
- 修饰类:
- 修饰方法:
- 修饰变量:
- 被final修饰的变量一旦被赋值后,其值不能被改变。
- 如果final修饰的是引用类型变量,那么该引用不可变,但引用指向的对象内容可以变。
- 提高运行效率:
- 被final修饰的方法,JVM可能会尝试进行方法内联,以提高程序运行效率。
- 常量存储:
- 被final修饰的常量,在编译阶段会存入常量池中。
- 重排序规则:
- 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
- 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
static有哪些用法
- 静态变量:
- 被static修饰的变量称为类变量,由类的所有实例共享。
- 静态方法:
- 被static修饰的方法可以不通过类的实例来调用,它们属于类本身。
- 静态块:
- static块通常用于初始化静态变量,它在类加载时执行一次。
- 静态内部类:
- 被static修饰的内部类可以不依赖于外部类的实例,它们是与外部类分离的。
- 静态导入:
- JDK 1.5引入的特性,允许导入类的静态成员,使得在代码中可以直接使用这些静态成员而不需要类名作为前缀。
- 使用import static语法,可以简化对静态方法和变量的引用。
3*0.1 == 0.3 返回值是什么
- 浮点数精度问题:
- 不等式结果:
- 3 * 0.1 == 0.3 的返回值是 false。
- 原因:
- 由于浮点数的精度限制,3 * 0.1 的结果可能不等于 0.3。
a=a+b与a+=b有什么区别
- 操作符区别:
- a = a + b 会先计算 a + b 的结果,然后将结果赋值给 a。
- a += b 是 a = a + b 的简写形式,但会进行隐式类型转换,确保结果与左侧变量类型一致。
- 类型转换:
- += 操作符会自动将加法操作的结果转换为左侧变量的类型。
- a = a + b 则不会自动进行类型转换,需要显式转换。
- 代码示例:
- byte a = 127; byte b = 127; b = a + b; 会报编译错误,因为 a + b 的结果是 int 类型,不能直接赋值给 byte 类型的 b。
- byte a = 127; byte b = 127; b += a; 是正确的,因为 += 会自动将结果转换为 byte 类型。
- short 类型示例:
- short s1 = 1; s1 = s1 + 1; 会报编译错误,因为 s1 + 1 的结果是 int 类型。
- 正确写法是 short s1 = 1; s1 += 1;,因为 += 会自动将结果转换为 short 类型。
try catch finally,try里有 return,finally还执行么
- finally 块的执行:
- 不管是否发生异常,finally 块中的代码总是会被执行。
- finally 与 return 的关系:
- 当 try 或 catch 块中有 return 语句时,finally 块仍然会执行。
- 执行顺序:
- finally 块的执行是在 return 语句之后,但在返回值被实际返回给调用者之前。这意味着 finally 块中的代码执行完毕后,之前保存的返回值才会被返回。
- 返回值的确定:
- 函数的返回值在 finally 块执行之前就已经确定,finally 块中的操作不会改变这个返回值。
- finally 块中的 return:
- 通常不建议在 finally 块中使用 return,因为这会导致函数提前退出,并且返回的值不是 try 或 catch 块中指定的值。