Java学习笔记

个人技术成长之路

Java基础知识

Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

Java语言特点

  • 简单性:Java语法与C++类似,但移除了指针等复杂特性
  • 面向对象:完全支持面向对象的设计理念
  • 平台无关性:一次编写,到处运行
  • 安全性:提供安全的执行环境
  • 多线程:内置多线程支持

Java基本语法

以下是一个简单的Java程序示例:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Java数据类型

Java中的数据类型分为两大类:

  1. 基本数据类型:byte, short, int, long, float, double, boolean, char
  2. 引用数据类型:类、接口、数组

注意:Java中的基本数据类型有固定的大小,例如int占4个字节,long占8个字节。这与C/C++不同,后者的数据类型大小可能因平台而异。

面向对象编程

Java是一种纯面向对象的编程语言,所有的代码都必须位于类中。面向对象编程的三大特性是:封装、继承和多态。

封装

封装是将数据和操作数据的方法绑定在一起,对外部世界隐藏内部实现细节。在Java中,我们使用访问修饰符(public, private, protected)来实现封装。

public class Person {
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        }
    }
}

继承

继承允许一个类获取另一个类的属性和方法。在Java中,使用extends关键字实现继承。

public class Employee extends Person {
    private double salary;
    
    public double getSalary() {
        return salary;
    }
    
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

多态

多态允许不同类的对象对同一消息作出响应。在Java中,多态通过方法重写和方法重载实现。

public class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}

集合框架

Java集合框架提供了一套性能优良、可扩展的集合类,用于存储和操作对象组。

主要接口

  • Collection:集合层次结构的根接口
  • List:有序集合,允许重复元素
  • Set:不允许重复元素的集合
  • Map:键值对映射,不允许重复键

常用实现类

  • ArrayList:基于动态数组的List实现
  • LinkedList:基于双向链表的List实现
  • HashSet:基于哈希表的Set实现
  • TreeSet:基于红黑树的有序Set实现
  • HashMap:基于哈希表的Map实现
  • TreeMap:基于红黑树的有序Map实现

集合使用示例

import java.util.*;

public class CollectionDemo {
    public static void main(String[] args) {
        // List示例
        List list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
        
        for (String fruit : list) {
            System.out.println(fruit);
        }
        
        // Map示例
        Map map = new HashMap<>();
        map.put("Apple", 10);
        map.put("Banana", 20);
        map.put("Orange", 30);
        
        for (Map.Entry entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

并发编程

Java提供了强大的并发编程支持,包括线程创建、同步机制和并发工具类。

线程创建

在Java中创建线程有两种方式:

  1. 继承Thread类
  2. 实现Runnable接口
// 方式1:继承Thread类
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running...");
    }
}

// 方式2:实现Runnable接口
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable is running...");
    }
}

// 使用示例
public class ThreadDemo {
    public static void main(String[] args) {
        // 使用Thread子类
        MyThread thread = new MyThread();
        thread.start();
        
        // 使用Runnable实现类
        Thread thread2 = new Thread(new MyRunnable());
        thread2.start();
    }
}

同步机制

Java提供了synchronized关键字和Lock接口来实现线程同步。

// 使用synchronized关键字
public class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }
    
    public synchronized int getCount() {
        return count;
    }
}

// 使用Lock接口
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockCounter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
    
    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

Java 8特性

Java 8引入了许多新特性,包括Lambda表达式、Stream API、新的日期时间API等。

Lambda表达式

Lambda表达式是一种匿名函数,可以更简洁地表示只有一个抽象方法的接口(函数式接口)的实例。

// 传统方式
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

// Lambda表达式
Runnable runnable = () -> System.out.println("Hello World");

Stream API

Stream API提供了一种函数式编程的方式来处理集合数据。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        List names = Arrays.asList("John", "Jane", "Jack", "Joe");
        
        // 过滤以J开头的名字并转换为大写
        List filteredNames = names.stream()
                .filter(name -> name.startsWith("J"))
                .map(String::toUpperCase)
                .collect(Collectors.toList());
        
        System.out.println(filteredNames);
    }
}

新的日期时间API

Java 8引入了新的日期时间API,解决了旧API的设计缺陷。

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class DateTimeDemo {
    public static void main(String[] args) {
        // 获取当前日期
        LocalDate today = LocalDate.now();
        System.out.println("Today: " + today);
        
        // 获取当前时间
        LocalTime time = LocalTime.now();
        System.out.println("Current time: " + time);
        
        // 获取当前日期和时间
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("Current date and time: " + dateTime);
        
        // 格式化日期时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = dateTime.format(formatter);
        System.out.println("Formatted date and time: " + formattedDateTime);
    }
}

Java 17新特性

Java 17是一个长期支持版本(LTS),引入了多项新特性和改进。

密封类(Sealed Classes)

密封类允许类的作者控制哪些类可以继承该类,增强了封装性。

// 密封类示例
public sealed class Shape permits Circle, Rectangle, Triangle {
    // 类的内容
}

public final class Circle extends Shape {
    // Circle的实现
}

public final class Rectangle extends Shape {
    // Rectangle的实现
}

public final class Triangle extends Shape {
    // Triangle的实现
}

模式匹配(Pattern Matching)

Java 17增强了instanceof的模式匹配功能,简化了类型检查和转换。

// 传统方式
if (obj instanceof String) {
    String s = (String) obj;
    // 使用字符串s
}

// 使用模式匹配
if (obj instanceof String s) {
    // 直接使用字符串s
}

文本块(Text Blocks)

文本块使多行字符串的表示更加简洁和直观。

// 传统方式
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, World!</p>\n" +
              "    </body>\n" +
              "</html>\n";

// 使用文本块
String html = """
              <html>
                  <body>
                      <p>Hello, World!</p>
                  </body>
              </html>
              """;

记录类(Records)

记录类是一种特殊的类,主要用于存储数据,自动生成构造函数、getter方法、equals()、hashCode()和toString()方法。

// 传统的数据类
public class Person {
    private final String name;
    private final int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    // equals(), hashCode(), toString()方法
}

// 使用记录类
public record Person(String name, int age) {
    // 自动生成构造函数、getter方法、equals()、hashCode()和toString()方法
}