Java 泛型是 JDK 5 引入的语言特性,用于实现类型参数化,增强代码的类型安全和复用性。通过泛型,我们可以在类、接口和方法定义时指定类型参数,避免强制类型转换并减少运行时异常。
传统代码中常使用 Object
类型来实现通用方法或容器,但这样会带来:
泛型在编译时进行类型检查,保证类型安全。
java复制编辑publicclassBox<T> {
private T content;
publicvoidsetContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
java复制编辑Box<String> stringBox = newBox<>();
stringBox.setContent("Hello");
Stringstr= stringBox.getContent();
java复制编辑public <E> voidprintArray(E[] array) {
for (E element : array) {
System.out.println(element);
}
}
?
通配符的使用? extends T
:上界通配符,表示类型是 T 或 T 的子类? super T
:下界通配符,表示类型是 T 或 T 的父类?
:无界通配符,表示任意类型java复制编辑List<? extendsNumber> list1; // 只能读取,不能添加
List<? super Integer> list2; // 可以添加 Integer 及其子类
Java 泛型通过类型擦除实现向后兼容:
泛型极大提升了集合框架的安全性和便利性:
java复制编辑List<String> list = newArrayList<>();
list.add("Java");
Strings= list.get(0); // 无需强制转换
List<String>
不是 List<Object>
的子类型Java 不允许直接创建泛型数组:
java复制编辑T[] arr = newT[10]; // 编译错误
解决方法:
java复制编辑@SuppressWarnings("unchecked")
T[] arr = (T[]) newObject[10];
java复制编辑publicclassCache<K, V> {
private Map<K, V> map = newHashMap<>();
publicvoidput(K key, V value) {
map.put(key, value);
}
public V get(K key) {
return map.get(key);
}
}
如果需要,我可以帮你补充图示、更多代码示例或泛型高级主题(比如泛型与反射、泛型擦除细节),告诉我吧!
好的,下面是第二十七篇 Java 文章,约3000字,带有图片示意,主题为:
随着多核 CPU 的普及,多线程编程成为 Java 应用性能优化的重要手段。理解线程生命周期、线程安全与并发控制,是写出高效稳定程序的基础。
Java 提供两种方式创建线程:
Thread
类,重写 run()
方法Runnable
接口,实现 run()
方法java复制编辑// 继承 ThreadclassMyThreadextendsThread {
@Overridepublicvoidrun() {
System.out.println("线程运行中");
}
}
// 实现 RunnableclassMyRunnableimplementsRunnable {
@Overridepublicvoidrun() {
System.out.println("线程运行中");
}
}
java复制编辑MyThreadt1=newMyThread(); t1.start(); Threadt2=newThread(newMyRunnable()); t2.start();
线程状态图如下:
多个线程操作共享资源,若无同步机制,可能出现竞态条件导致数据不一致。
synchronized
关键字java复制编辑publicclassCounter {
privateintcount=0;
publicsynchronizedvoidincrement() {
count++;
}
publicsynchronizedintgetCount() {
return count;
}
}
java复制编辑publicvoidadd(int value) {
synchronized(this) {
count += value;
}
}
通过线程池管理线程,避免频繁创建销毁:
java复制编辑ExecutorServicepool= Executors.newFixedThreadPool(5);
pool.execute(() -> System.out.println("线程池执行任务"));
pool.shutdown();
ConcurrentHashMap
CopyOnWriteArrayList
ReentrantLock
:可重入锁,功能更强大java复制编辑ReentrantLocklock=newReentrantLock();
lock.lock();
try {
// 保护代码区
} finally {
lock.unlock();
}
AtomicInteger
,通过 CAS 保证原子性java复制编辑AtomicIntegeratomicInt=newAtomicInteger(0); atomicInt.incrementAndGet();
使用 wait()
和 notify()
实现线程协调:
java复制编辑synchronized (obj) {
obj.wait(); // 当前线程等待
}
synchronized (obj) {
obj.notify(); // 唤醒等待线程
}
java复制编辑classDrop {
private String message;
privatebooleanempty=true;
publicsynchronized String take()throws InterruptedException {
while (empty) {
wait();
}
empty = true;
notifyAll();
return message;
}
publicsynchronizedvoidput(String message)throws InterruptedException {
while (!empty) {
wait();
}
empty = false;
this.message = message;
notifyAll();
}
}
synchronized
和并发包提供多种同步方案
开发工匠 2025-6-11 10:29
eeNick 2025-6-11 08:59