Java 学习笔记

Java 学习笔记

💡 原文中文,约5200字,阅读约需13分钟。
📝

内容提要

本文梳理Java核心知识,包括static与instanceof关键字、抽象类与接口、多态、字符串比较、try-catch-finally、集合框架、泛型、枚举、注解、多线程、常用类及反射机制,涵盖各知识点的基本用法与注意事项。

🔎

延伸解读

字符串比较:== 与内存地址

文章通过示例说明,对于引用类型变量,== 比较的是变量指向的内存地址。s1 和 s2 都指向字符串常量池中的同一对象,因此 s1 == s2 为 true;而 s3 通过 new String("AA") 创建,会在堆中分配新地址,所以 s1 == s3 为 false。这提醒读者,比较字符串内容应使用 equals 方法,而非 ==。

集合框架选型:根据场景选择实现

文章梳理了 Set、List、Map 的常用实现及其特点。例如,HashSet 依赖 hashCode 和 equals 判重;TreeSet 要求元素实现 Comparable 或传入 Comparator,以支持排序;ArrayList 基于数组,适合随机访问;LinkedList 基于链表,适合频繁增删;Vector 和 Hashtable 线程安全但效率较低。读者可根据是否需要排序、线程安全及操作特点来选择合适的集合类。

泛型:提升类型安全与代码简洁性

泛型将集合元素限制为特定类型,从而在编译期发现类型错误,并避免取出元素时的强制类型转换。文章指出,泛型类与泛型方法可灵活定义,但静态方法中不能使用类的泛型,因为泛型类型在实例化时才确定,而静态方法随类加载。此外,泛型与继承是并列关系,List<Son> 并非 List<Parent> 的子接口,需使用通配符如 ? extends E 或 ? super E 来匹配。

反射:运行时获取类信息的四种方式

反射允许在运行时获取类的结构信息。文章介绍了获取 Class 对象的四种方式:类名.class、对象.getClass()、Class.forName() 以及类加载器 loadClass()。获得 Class 对象后,可进一步获取属性、方法、构造器、父类、接口、包和注解等信息。需要注意的是,引导类加载器不可获取,且 newInstance() 要求运行时类具有可见的无参构造器。

❓

Q&A

Java中static关键字有哪些用法?

static关键字可以用于声明静态属性和静态方法,定义静态内部类,以及静态导入某个类中的静态方法或属性。例如,使用import static java.lang.System.out;可以直接调用out.println()。

Java中抽象类和接口有什么区别?

抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类;接口没有构造器,抽象类有构造器;接口可以继承接口,类可以实现接口;接口可以多继承。

Java中字符串比较时==和equals有什么区别?

对于引用类型变量,==比较的是变量指向的内存地址。例如,String s1 = "AA", s2 = "AA", s3 = new String("AA"); s1 == s2为true,因为指向同一个内存地址;s1 == s3为false,因为指向不同内存地址。这涉及Java内存结构和字符串常量池。

Java集合框架中Set、List、Map的主要实现类有哪些?

Set的实现类有HashSet、LinkedHashSet、TreeSet;List的实现类有ArrayList、LinkedList、Vector;Map的实现类有HashMap、LinkedHashMap、TreeMap、Hashtable、Properties。

Java泛型的作用是什么?

泛型的核心思想是把一个集合中的数据内容限制为一种特定的数据类型。作用包括解决元素存储的安全性问题,以及解决获取数据元素时需要强制类型转换的问题。

Java中实现多线程有哪几种方式?

有两种方式:继承Thread类并实现其run()方法,通过Thread类的start()方法启动多线程;实现Runnable接口并完善run()方法,通过Thread类的start()方法启动多线程,Runnable类型实例可作为参数传递给Thread类的构造方法。

Java反射中获取Class类实例有哪几种方式?

有四种方式:通过调用类本身的.class属性获取;通过运行时类对象的getClass()方法获取;通过Class类的静态方法forName(String className)获取;通过类加载器获取。注意引导类加载器是不可获取的。

🏷️

标签

➡️

继续阅读