D04 第四部分 常用API与异常任务

一、基础任务

  1. Java中如何计算圆的面积,需要用到哪个常用API?

    Math类中的 Math.PI * Math.pow(半径, 2)

  2. 理解Object的hashcode()方法与equals()方法。

    hashCode()
    方法返回对象的哈希码值,它是一个int类型的整数。哈希码值用于在哈希表等数据结构中快速定位对象。
    如果两个对象根据equals()方法判断相等,那么它们的hashCode()值必须相等。但是,反过来并不成立,即如果两个对象的hashCode()值相等,并不一定意味着它们是相等的对象。
    在重写equals()方法时,通常也需要重写hashCode()方法,以确保对象的一致性。如果两个对象根据equals()方法被判断为相等,那么它们的hashCode()值必须相等,否则可能会导致在哈希集合(如HashMap)中出现问题。
    ​
    equals()
    equals()方法用于判断两个对象是否相等。在Java中,Object类中的equals()方法默认实现是比较对象的引用是否相等(即内存地址是否相同),等价于==运算符。
    方法不重写展示的是对象的地址值,没有意义。进行重写,可以让对象根据属性进行判断是否相同。通常情况下,需要根据对象的实际内容来判断是否相等,因此需要重写equals()方法。

  3. 对于引用类型而言,equals()与==的区别是什么?如果是基本类型呢?

    引用类型:
    equals()方法:通常用于比较对象的内容是否相等。默认情况下,Object类中的equals()方法是比较对象的内存地址是否相同,即是否指向同一对象。但是,许多类(如String、Integer等)都对equals()方法进行了重写,使其比较对象的内容是否相同。
    ==运算符:用于比较对象的引用是否相等,即是否指向同一内存地址。它不会调用对象的equals()方法,而是直接比较引用的地址。
    ​
    基本类型:
    equals()方法:基本类型没有equals()方法,因为它是对象方法,而基本类型不是对象。只有引用类型才有equals()方法。
    ==运算符:对于基本类型,==运算符用于比较它们的值是否相等。当比较两个基本类型的值时,==运算符会比较它们的实际值。

  4. 你知道哪些获取时间的方式?查阅资料掌握LocalDate和Date的区别?

    获取时间的方式:
    使用java.util.Date类:这是Java早期的日期和时间处理类,不推荐使用,因为它存在线程安全性问题,并且大部分方法已被废弃。
    使用java.util.Calendar类:Calendar类提供了一种获取和操作日期和时间的方式,但使用起来比较繁琐。
    使用java.time包中的新日期和时间API:从Java 8开始引入的java.time包提供了一组新的日期和时间API,包括LocalDate、LocalTime、LocalDateTime等类,这些类提供了更简洁、易读和线程安全的方法来处理日期和时间。
    ​
    LocalDate 和 Date 的区别:
    java.util.Date是Java旧版的日期和时间类,而java.time.LocalDate是Java 8中引入的新日期API的一部分。
    java.util.Date是可变的,并且不是线程安全的,而java.time.LocalDate是不可变的和线程安全的。
    java.util.Date表示一个时间戳,同时包含日期和时间信息,而java.time.LocalDate仅表示日期信息,不包含时间。
    java.util.Date中的方法大多已被废弃,而java.time.LocalDate提供了一组新的方法来操作日期,更符合现代编程习惯。

  5. 举例实现 字符串 和 Date 的相互转换。

    import java.text.SimpleDateFormat;
    import java.util.Date;
    ​
    public class Main {
        public static void main(String[] args) throws Exception {
            // 字符串转换为 Date
            String dateString = "2024-01-28";
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(dateString);
            System.out.println("String to Date: " + date);
    ​
            // Date 转换为字符串
            Date currentDate = new Date();
            String dateString2 = format.format(currentDate);
            System.out.println("Date to String: " + dateString2);
        }
    }
    ​

  6. 你知道哪些方式可以实现字符串的拆分和字符串的拼接?

    拆分字符串:
    使用split()方法:根据指定的分隔符拆分字符串。
    ​
    拼接:
    使用+运算符:可以直接使用+运算符将多个字符串拼接在一起。
    使用StringBuilder类:StringBuilder类提供了更高效的字符串拼接方式,特别是需要大量拼接操作时。

  7. Exception与Error的区别是什么?

    Exception: 表示程序可以捕获并处理的异常情况,它是由程序员编写的代码导致的,通常可以通过合适的异常处理机制(如try-catch块)来解决。Exception分为受检异常(checked exception)和非受检异常(unchecked exception)两种类型。
    ​
    Error: 表示程序无法处理的严重问题,通常是由于系统故障或资源耗尽等导致的,不应该由程序员试图捕获和处理。Error通常表示虚拟机内部的错误,如OutOfMemoryError、StackOverflowError等。

  8. throw与throws的区别是什么?

    throw: 用于在代码块内抛出一个异常对象,将异常传递到调用者。
    throws: 用于在方法声明中标识方法可能抛出的异常类型,表示该方法可能会抛出异常,调用者需要处理这些异常。

  9. try、catch、finally三个语句块中,哪个语句块是可以省略的?

    在try-catch-finally结构中,try块是必须的,而catch块和finally块是可选的。
    可以只有try块,也可以有try-catch或者try-finally,或者全部三个块都存在。

  10. try-catch语句块中,catch可以存在多个,存在多个时需注意什么?

    在一个try-catch结构中,可以有多个catch块,每个catch块用于捕获不同类型的异常。但需要注意的是,catch块的顺序很重要,应该从特定异常类型到一般异常类型进行排列,否则可能导致编译错误或者逻辑错误。

  11. finally语句块,一般用来写什么样的代码内容?

    finally语句块一般用来写无论是否发生异常都需要执行的代码,例如资源的释放、关闭数据库连接等。finally块中的代码会在try块中的代码执行完毕后执行,无论是否发生异常。

  12. 什么是拆箱和装箱?

    拆箱:包装类->基本数据类型(手动int.value)
    装箱:基本数据类型->包装类(手动 .valueOf,new)

  13. 简述一下包装类的缓存机制。

    常量优化机制,double和float没有这个概念
    在-128到127的范围内,如果前面已经存在包装类对象,就会被直接引用,而不会继续创建新的。

  14. 如果想比较包装类的值是否相等,应采用equals还是==?

    ==运算符用于比较对象的引用是否相等,而不是比较值是否相等。因此,如果使用==运算符比较两个包装类对象,实际上比较的是它们在内存中的存储地址,而不是它们的值。
    ​
    equals()方法被重写以比较对象的值是否相等。对于包装类来说,equals()方法比较的是它们所包装的值是否相等。
    ​
    如果想比较两个包装类对象的值是否相等,应该使用equals()方法,而不是==运算符。

    二、进阶任务

  15. 如果异常一直通过throws抛出,最终抛到main方法,main方法继续上抛会出现什么情况?

    虚拟机停止运行,程序终止

  16. Integer i=150,j=150;sout(i==j)的结果是什么?为什么?

    对于给定的代码Integer i = 150, j = 150;,变量i和j都是指向Integer对象,值为150。但是,由于150不在默认缓存范围内(即-128到127之间),因此实际上不会使用缓存,而是每次创建一个新的对象。
    ​
    false

  17. finally,final,finalize三者的区别是什么?

    finally用于定义在try-catch-finally结构中的一个代码块,在该结构中,finally块中的代码无论是否发生异常都会被执行,通常用于释放资源、关闭文件等清理操作。,final用于修饰类、方法和变量,而finalize是一个方法,用于在对象被垃圾回收之前进行清理操作。

  18. String s = new String(“1”)创建了几个对象?

    字符串常量池中的对象:
    字符串常量池中的字符串 "1",这是一个字符串常量,Java在编译时会将所有相同的字符串常量共享,因此如果字符串常量池中已经存在 "1",则不会创建新的对象,而是直接引用已经存在的对象。
    ​
    堆中的对象:
    使用 new String("1") 创建了一个新的 String 对象,这个对象在堆内存中分配,它与字符串常量池中的对象不同,是一个全新的对象。

  19. 若String s1 = ”1”+”1”语句,拼接后产生的字符串对象会存在堆空间还是字符串常量池?

    字符串常量池

  20. 若String s2 = new String(”1”)+”1”语句,拼接后产生的字符串对象会存在堆空间还是字符串常量池?

    在这个语句中,new String("1") 创建了一个新的字符串对象,并将其存储在堆空间中。然后,由于字符串常量池中已经存在字符串常量 "1",所以 "1" + "1" 会被编译器优化为 "11",而 "11" 将会作为一个字符串常量存储在字符串常量池中。新创建的字符串对象,由于是通过字符串连接操作得到的,因此会被放入字符串常量池中。所以最终产生的字符串对象中,"11" 会存在于字符串常量池中。
    ​
    因此,String s2 = new String("1") + "1"; 中拼接后产生的字符串对象 "11" 存在于字符串常量池中。

  21. 若String s3 = new String(”1”)+ new String(”1”)语句,拼接后产生的字符串对象会存在堆空间还是字符串常量池?

    在这个语句中,new String("1") 会分别创建两个新的字符串对象,并将它们存储在堆空间中。然后,通过拼接操作 new String("1") + new String("1") 生成的字符串对象是一个新的对象,它存储在堆空间中,因为它是通过 new 关键字显式创建的。
    ​
    因此,String s3 = new String("1") + new String("1"); 中拼接后产生的字符串对象存在于堆空间中。

  22. string和stringbuild、stringbuffer三者的应用场景。

String: 适用于不需要频繁修改字符串内容的情况,因为String对象是不可变的。例如,当字符串内容固定不变,或者用于进行常量字符串的拼接时,可以使用String。
​
StringBuilder: 适用于需要频繁进行字符串拼接或修改的情况。StringBuilder是可变的,它的性能比String更高效,因为它不会像String那样在每次修改时都创建一个新的对象,而是在原有对象的基础上进行修改。因此,当需要动态地构建字符串,进行频繁的增删改操作时,应该使用StringBuilder。
​
StringBuffer: 与StringBuilder类似,也适用于需要频繁进行字符串拼接或修改的情况。StringBuffer是线程安全的,所有的方法都是同步的,因此在多线程环境下使用时更安全。但是,由于线程安全的代价是性能的降低,所以在单线程环境下,通常推荐使用StringBuilder而不是StringBuffer。

三、进阶任务

  1. 什么是哈希?查阅资料并谈谈你对哈希表的理解。

    哈希(Hash)是一种将任意长度的输入通过哈希算法转换成固定长度输出的过程。哈希函数的主要目的是将数据快速地映射到一个固定大小的数据集上。这个输出通常被称为哈希值或哈希码。
    ​
    哈希表的理解
    哈希表是一种数据结构,它使用哈希函数来将键映射到数组中的特定位置。这样可以实现高效的数据查找、插入和删除操作。哈希表的基本原理是通过将键映射到数组索引来加快数据的访问速度。
    ​
    在哈希表中,键经过哈希函数计算后得到哈希码,然后根据哈希码确定在数组中的位置。当有多个键具有相同的哈希码时,就会发生哈希冲突。解决哈希冲突的常见方法包括链地址法(Chaining)和开放地址法(Open Addressing)等。
    ​
    哈希表的优点是在平均情况下具有很高的查找效率,时间复杂度通常为 O(1)。但是在最坏情况下,哈希表的性能可能会下降到 O(n),这取决于哈希函数的质量和哈希冲突的处理方式。
    ​
    ​
    链地址法(Chaining)
    链地址法是一种简单而直观的方法,它使用一个数组,每个数组元素称为槽(slot)。每个槽存储一个链表或者其他形式的数据结构(如树),用于存储具有相同哈希码的键值对。
    ​
    当发生哈希冲突时,新的键值对会被插入到对应槽的链表中,而不是直接覆盖。这样,即使多个键具有相同的哈希码,它们仍然可以被存储在同一个槽中,通过链表进行组织。
    ​
    链地址法的优点在于简单易实现,并且可以很好地处理多个键具有相同哈希码的情况。但是在极端情况下,即链表变得非常长时,查找性能可能会下降到 O(n),其中 n 是链表的长度。
    ​
    开放地址法(Open Addressing)
    开放地址法是一种直接将冲突的键值对存储在哈希表中的方法,而不是使用额外的数据结构来存储。当发生冲突时,它会尝试在哈希表中的其他位置寻找空闲槽,直到找到一个合适的位置。
    ​
    开放地址法有多种探测方法,常见的包括线性探测(Linear Probing)、二次探测(Quadratic Probing)、双重哈希(Double Hashing)等。这些方法决定了在发生冲突时如何寻找下一个槽。
    ​
    开放地址法的优点在于不需要额外的存储空间来存储链表或其他数据结构,因此在空间利用率上可能更高。而且在缓存友好性上也有一定的优势。但是开放地址法需要解决如何处理删除操作以及如何选择适当的探测方法等问题。
    ​
    选择链地址法还是开放地址法取决于具体的应用场景和需求。链地址法适用于存储大量数据,且需要高度动态性的情况,而开放地址法则适用于空间较为紧缺,且对存储效率有较高要求的情况。

  2. String s = “1”+ “1”创建了几个字符串对象?

    1个

  3. String s = new String(“1”)+ new String(“1”)创建了几个字符串对象?

    6个 

    “1”,常量池 1个

    new 堆空间 new stringBuilder 2个

    new 堆空间 new stringBuilder 2个

    s 拼接后的对象 1个

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值