JAVA入门
Java8新特性
Java 8引入了许多新特性和改进,其中一些最显著的包括:
-
Lambda 表达式:Lambda 表达式是 Java 8 中最显著的新特性之一。它允许在方法内部定义匿名函数,从而更容易实现函数式编程。这使得代码更简洁和可读,并提供了更好的抽象机制。
(a, b) -> a + b
-
函数式接口:Java 8引入了函数式接口概念,这是一种只有一个抽象方法的接口。这为Lambda表达式提供了类型和基本的函数式编程支持。例如,
java.util.function
包中包含了许多常用的函数式接口,如Consumer
、Function
、Predicate
。 -
方法引用:方法引用允许您使用已存在的方法来实现函数式接口。有四种主要的方法引用类型:静态方法引用、实例方法引用、构造方法引用、类构造方法引用。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(System.out::println);
-
流 (Stream):Java 8引入了Stream API,它提供了一种用于处理集合数据的高级抽象方式。使用Stream,您可以轻松地进行过滤、映射、归约和其他数据处理操作。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();
-
默认方法 (Default Method):接口中可以包含默认方法的定义,这使得向接口添加新方法时不会破坏已经实现该接口的类。
interface MyInterface { default void myDefaultMethod() { // 默认实现 } }
-
新的日期和时间 API:Java 8引入了
java.time
包,提供了全新的日期和时间 API,以替代旧的Date
和Calendar
类。LocalDate today = LocalDate.now(); LocalTime now = LocalTime.now();
-
新的 JavaScript 引擎:Java 8引入了 Nashorn JavaScript 引擎,可用于在Java应用程序中嵌入和执行JavaScript代码。
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval("print('Hello, world!')");
-
并行数组:Java 8引入了并行数组,可用于在多核处理器上并行处理大规模数据。
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8}; int sum = Arrays.parallelStream(numbers) .sum();
这些新特性和改进使Java 8成为了一个更强大、更现代的编程语言,更容易进行并发编程和函数式编程。它提供了更多的工具来简化和改进Java应用程序的开发。
Java基本数据类型
Java 的基本数据类型包括以下八种:
-
byte:字节类型,8 位,范围为 -128 到 127。用于节省内存空间。
byte myByte = 42;
-
short:短整数类型,16 位,范围为 -32,768 到 32,767。
short myShort = 1000;
-
int:整数类型,32 位,范围为 -2^31 到 2^31 - 1。
int myInt = 12345;
-
long:长整数类型,64 位,范围为 -2^63 到 2^63 - 1。
long myLong = 1234567890L;
-
float:单精度浮点类型,32 位,用于表示小数。通常用
f
后缀表示。float myFloat = 3.14f;
-
double:双精度浮点类型,64 位,通常用于表示小数。
double myDouble = 3.14159265359;
-
char:字符类型,16 位,用于表示一个 Unicode 字符。
char myChar = 'A';
-
boolean:布尔类型,用于表示真或假。
boolean myBoolean = true;
这些基本数据类型用于存储不同类型的数据,根据需要选择合适的类型以节省内存并确保数据的准确性。例如,使用 byte
类型来存储年龄通常足够,而使用 double
类型来存储精确的浮点数值。
除了基本数据类型,Java 还提供了对象数据类型,如 String
、Integer
、Double
,用于处理更复杂的数据。但这些对象数据类型通常包装在基本数据类型之上,以提供额外的功能。
Java重点内容总结
Java 是一门功能强大的编程语言,有一些主要的重点概念,其中一些可能较难理解。以下是一些 Java 中的重难点内容以及相应的示例:
-
面向对象编程(OOP):Java 是一门面向对象的语言,它强调类和对象的概念。在 Java 中,你可以创建类和对象,这些对象可以包含属性和方法。
// 创建一个类 class Dog { String name; // 构造方法 public Dog(String name) { this.name = name; } // 方法 public void bark() { System.out.println(name + " is barking!"); } } // 创建对象 Dog myDog = new Dog("Buddy"); myDog.bark();
-
继承:Java 支持继承,一个类可以派生自另一个类,从而获得其属性和方法。
// 基类 class Animal { void eat() { System.out.println("Animal is eating"); } } // 派生类 class Dog extends Animal { void bark() { System.out.println("Dog is barking"); } }
-
多态:Java 具有多态性,允许一个对象在不同上下文中采用不同的行为。
Animal myDog = new Dog(); myDog.eat(); // 调用 Dog 类的 eat 方法
-
接口:接口定义了一组抽象方法,类可以实现接口以提供这些方法的具体实现。
interface Drawable { void draw(); } class Circle implements Drawable { public void draw() { System.out.println("Drawing a circle"); } }
-
异常处理:Java 强制处理异常,使用
try-catch
块来捕获和处理异常。try { int result = 5 / 0; // 产生 ArithmeticException } catch (ArithmeticException e) { System.out.println("Division by zero is not allowed"); }
-
多线程编程:Java 具有强大的多线程支持。你可以创建多个线程来执行并发任务。
class MyThread extends Thread { public void run() { System.out.println("Thread is running"); } } MyThread thread = new MyThread(); thread.start(); // 启动线程
-
集合框架:Java 提供了各种集合类来处理不同类型的数据。例如,
ArrayList
用于存储一组对象。ArrayList<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); System.out.println(names.get(0)); // 输出 "Alice"
-
Lambda 表达式:Java 8 引入了 Lambda 表达式,它允许你以更简洁的方式编写函数式接口的实现。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.forEach(n -> System.out.println(n));
思考
- Java 中的接口和抽象类有什么区别?
接口是抽象方法的集合,抽象类是抽象方法和具体方法的集合。 - 什么是泛型?
泛型允许你使用一个通用类型来表示多个类型。 - 什么是 Java 注解?
注解是元数据,用于为 Java 代码提供额外的信息。注解可用于生成文档,跟踪代码中的依赖关系,甚至在运行时执行检查和编译时检查。 - 什么是 Java 反射?
Java 反射使你可以在运行时查看和修改 Java 对象。 - 什么是 Java 序列化?
Java 序列化允许你使用ObjectOutputStream
和ObjectInputStream
保存和读取 Java 对象。 - 什么是 Java 异常处理?
Java 异常处理通过检查异常,参数检查,运行时异常和错误处理来处理错误。 - 什么是 Java 枚举?
Java 枚举允许你声明一个枚举类型,其中每个常量都是枚举类型中的唯一实例。 - 什么是 Java 注解处理器?
Java 注解处理器允许你扫描和处理 Java 源文件。 - 什么是 Java 集合?
Java 集合用于存储和操作数据。Java 集合类提供了一种存储和访问对象的统一方式。 - 什么是 Java 泛型?
Java 泛型允许你使用一个通用类型来表示多个类型。 - 什么是 Java 并发?
Java 并发用于在 Java 程序中实现并发。 - 什么是 Java IO?
Java IO 用于读取和写入原始数据。 - 什么是 Java 字符串?
Java 字符串用于存储和操作文本。 - 什么是 Java 字符串?
Java 字符串用于存储和操作文本。 - Java中如何创建线程?
Java 提供了三种创建线程的方法:
- 继承
Thread
类 - 实现
Runnable
接口 - 实现
Callable
接口
- Java 中的同步是什么?
Java 同步用于防止线程冲突。 - Java 中的同步锁是什么?
Java 同步锁用于防止线程冲突。 - Java 中的同步集合是什么?
Java 同步集合用于防止线程冲突。 - Java 中的同步方法是什么?
Java 同步方法用于防止线程冲突。 - Java 中的同步代码块是什么?
Java 同步代码块用于防止线程冲突。 - Java 中的同步类是什么?
Java 同步类用于防止线程冲突。 - Java 中的同步变量是什么?
Java 同步变量用于防止线程冲突。 - Java中的Builder和Buffer有什么区别和联系?
在 Java 编程中,“Builder” 和 “Buffer” 是两个不同的概念,它们用于不同的目的,并且通常与不同的数据类型相关联。
- “Builder” 通常用于创建不可变对象(Immutable Objects)。它是一种设计模式,目的是解决创建复杂对象的问题,允许你通过一系列的方法链式调用来设置对象的属性,最后返回一个不可变的对象。这有助于确保对象在创建后不会被修改,提高了线程安全性。
- 常见的使用场景包括
StringBuilder
、StringBuilder
、DateTimeFormatter.Builder
等。
StringBuilder builder = new StringBuilder();
builder.append("Hello").append(" ").append("World");
String result = builder.toString();
- “Buffer” 通常用于缓存数据,特别是在处理 I/O 操作或大量数据时。它是一块内存区域,可以用来临时存储数据。通常与 I/O 操作(如文件读写、网络通信)或处理大型数据集合时结合使用。
- 常见的使用场景包括
ByteBuffer
(用于处理二进制数据)、CharBuffer
(用于处理字符数据)、StringBuffer
(StringBuilder
的线程安全版本)等。
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 将数据写入缓冲区
buffer.put("Hello, World".getBytes());
// 从缓冲区读取数据
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
总之:
- “Builder” 用于构建不可变对象,支持链式方法调用,返回最终不可变对象。
- “Buffer” 用于临时存储数据,通常用于 I/O 操作和数据处理。
- 它们在概念上不同,没有直接的联系,因为它们用于不同的用途和场景。