java 数组 集合 使用技巧

java 集合 的子类的区别,分别在什么场景下使用

在Java中,集合框架提供了多个实现了不同接口的集合类。这些集合类分为两个主要的接口:ListSet,以及一个继承自 Map 的接口。

1. List 接口的主要子类:

  • ArrayList:

    • 使用数组实现,支持快速随机访问。
    • 适合读取操作较多的场景,但不适合大量的插入、删除操作。
  • LinkedList:

    • 使用双向链表实现,对于频繁的插入、删除操作性能较好。
    • 适合在中间插入、删除元素的场景,但不适合大量随机访问。
  • Vector:

    • 是线程安全的,但性能相对较差,较少在现代Java开发中使用。
使用场景:
  • 使用 ArrayList:当需要快速随机访问元素,读取操作较多的情况下。
  • 使用 LinkedList:当需要频繁执行中间插入、删除操作,而不关心随机访问的性能。

2. Set 接口的主要子类:

  • HashSet:

    • 使用哈希表实现,元素无序。
    • 适合快速查找元素,但不关心元素的顺序。
  • LinkedHashSet:

    • 使用哈希表和链表实现,元素按插入顺序排序。
    • 适合需要保持插入顺序的场景。
  • TreeSet:

    • 使用红黑树实现,元素按照自然顺序或指定的比较器排序。
    • 适合需要有序集合的场景。
使用场景:
  • 使用 HashSet:当只关心元素的唯一性,而不关心顺序。
  • 使用 LinkedHashSet:当需要保持插入顺序的唯一性元素集合。
  • 使用 TreeSet:当需要有序的唯一性元素集合。

3. Map 接口的主要子类:

  • HashMap:

    • 使用哈希表实现,键值对无序。
    • 适合快速查找键值对,但不关心顺序。
  • LinkedHashMap:

    • 使用哈希表和链表实现,键值对按插入顺序排序。
    • 适合需要保持插入顺序的键值对集合。
  • TreeMap:

    • 使用红黑树实现,键值对按照键的自然顺序或指定的比较器排序。
    • 适合需要有序键值对的场景。
使用场景:
  • 使用 HashMap:当只关心键值对的唯一性,而不关心顺序。
  • 使用 LinkedHashMap:当需要保持插入顺序的唯一性键值对集合。
  • 使用 TreeMap:当需要有序的唯一性键值对集合。

综合考虑使用场景、性能需求和功能需求,选择适合的集合子类。

java 集合各种并发类 请提供示例代码

Java 提供了一些并发集合类,这些类通常用于在多线程环境中安全地操作集合。以下是一些常见的并发集合类及其示例代码:

1. ConcurrentHashMap:

ConcurrentHashMap 是线程安全的哈希表实现,适合在高并发环境中使用。

import java.util.concurrent.ConcurrentHashMap;

// 创建 ConcurrentHashMap
ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();

// 添加键值对
concurrentHashMap.put("Apple", 10);
concurrentHashMap.put("Banana", 5);

// 替换值
concurrentHashMap.replace("Apple", 15);

// 遍历 ConcurrentHashMap
concurrentHashMap.forEach((key, value) -> System.out.println(key + ": " + value));

2. CopyOnWriteArrayList:

CopyOnWriteArrayList 是一个线程安全的动态数组,适合在读操作远远多于写操作的场景。

import java.util.concurrent.CopyOnWriteArrayList;

// 创建 CopyOnWriteArrayList
CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();

// 添加元素
copyOnWriteArrayList.add("Apple");
copyOnWriteArrayList.add("Banana");

// 遍历 CopyOnWriteArrayList
for (String item : copyOnWriteArrayList) {
    System.out.println(item);
}

3. ConcurrentSkipListMap:

ConcurrentSkipListMap 是线程安全的有序映射表实现,基于跳表(SkipList)数据结构。

import java.util.concurrent.ConcurrentSkipListMap;

// 创建 ConcurrentSkipListMap
ConcurrentSkipListMap<String, Integer> concurrentSkipListMap = new ConcurrentSkipListMap<>();

// 添加键值对
concurrentSkipListMap.put("Apple", 10);
concurrentSkipListMap.put("Banana", 5);

// 获取键值对
int quantity = concurrentSkipListMap.get("Apple");

// 遍历 ConcurrentSkipListMap
concurrentSkipListMap.forEach((key, value) -> System.out.println(key + ": " + value));

4. BlockingQueue:

BlockingQueue 接口及其实现类,如 LinkedBlockingQueueArrayBlockingQueue,用于在多线程环境中进行阻塞式队列操作。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

// 创建 LinkedBlockingQueue
BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>();

// 添加元素
blockingQueue.put("Apple");
blockingQueue.put("Banana");

// 获取并移除元素
String item = blockingQueue.take();

// 获取队列大小
int size = blockingQueue.size();

5. ConcurrentLinkedQueue:

ConcurrentLinkedQueue 是线程安全的非阻塞式队列实现。

import java.util.concurrent.ConcurrentLinkedQueue;

// 创建 ConcurrentLinkedQueue
ConcurrentLinkedQueue<String> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();

// 添加元素
concurrentLinkedQueue.add("Apple");
concurrentLinkedQueue.add("Banana");

// 获取并移除元素
String item = concurrentLinkedQueue.poll();

// 获取队列大小
int size = concurrentLinkedQueue.size();

这些是一些常见的并发集合类及其示例代码。在多线程环境中,选择合适的并发集合类能够帮助你更安全地操作共享数据。

java 数组常见用法

在Java中,数组是一种常见的数据结构,它允许你在单个变量名下存储多个相同类型的元素。以下是一些 Java 数组的常见用法:

1. 声明和初始化数组:

// 声明和初始化数组
int[] intArray = new int[5]; // 创建一个包含5个整数的数组

// 直接初始化数组
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"Alice", "Bob", "Charlie"};

2. 访问数组元素:

// 访问数组元素
int value = intArray[2]; // 获取索引为2的元素值
System.out.println(value); // 输出:0,因为刚刚创建的数组所有元素默认初始化为0

// 修改数组元素
intArray[2] = 42;

3. 数组长度:

// 获取数组长度
int length = intArray.length;
System.out.println("数组长度:" + length);

4. 遍历数组:

// 使用 for 循环遍历数组
for (int i = 0; i < intArray.length; i++) {
    System.out.println(intArray[i]);
}

// 使用增强型 for 循环(for-each)遍历数组
for (int num : numbers) {
    System.out.println(num);
}

5. 多维数组:

// 声明和初始化二维数组
int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

// 访问二维数组元素
int element = matrix[1][2]; // 获取第二行第三列的元素值

6. 数组工具类:

Java提供了一些数组工具类方法,如Arrays类,可用于对数组进行排序、查找等操作。

import java.util.Arrays;

int[] arr = {4, 2, 7, 1, 9};

// 排序数组
Arrays.sort(arr);

// 在数组中查找元素
int index = Arrays.binarySearch(arr, 7);

7. 动态数组(ArrayList):

如果需要动态调整数组大小,可以使用 ArrayList 类。

import java.util.ArrayList;

// 创建 ArrayList
ArrayList<Integer> arrayList = new ArrayList<>();

// 添加元素
arrayList.add(10);
arrayList.add(20);

// 获取元素
int element = arrayList.get(0);

8. 数组拷贝:

// 使用 Arrays.copyOf 方法拷贝数组
int[] sourceArray = {1, 2, 3, 4, 5};
int[] destinationArray = Arrays.copyOf(sourceArray, sourceArray.length);

// 使用 System.arraycopy 方法拷贝数组
int[] destArray = new int[sourceArray.length];
System.arraycopy(sourceArray, 0, destArray, 0, sourceArray.length);

这些是 Java 数组的一些基本用法,根据具体需求,你可能会用到更多高级的数组操作。

java ArrayList 常见用法,请提供示例代码

ArrayList 是 Java 中 java.util 包下的动态数组实现,它提供了一种动态调整大小的数组结构。以下是一些常见的 ArrayList 用法及相应的示例代码:

1. 声明和初始化 ArrayList:

import java.util.ArrayList;

// 声明和初始化 ArrayList
ArrayList<String> list = new ArrayList<>();

// 直接初始化 ArrayList
ArrayList<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));

2. 添加和删除元素:

// 添加元素
list.add("Apple");
list.add("Banana");
list.add("Orange");

// 删除元素
list.remove("Banana");

3. 获取元素和遍历:

// 获取元素
String fruit = list.get(0);

// 使用 for-each 遍历 ArrayList
for (String item : list) {
    System.out.println(item);
}

// 使用 Java 8 Stream 遍历 ArrayList
list.forEach(item -> System.out.println(item));

4. 查找元素和判断是否包含:

// 查找元素的索引
int index = list.indexOf("Orange");

// 判断是否包含某元素
boolean contains = list.contains("Apple");

5. 获取 ArrayList 大小:

// 获取 ArrayList 大小
int size = list.size();

6. 清空 ArrayList:

// 清空 ArrayList
list.clear();

7. ArrayList 转为数组:

// ArrayList 转为数组
String[] array = new String[list.size()];
list.toArray(array);

8. ArrayList 排序:

// 对 ArrayList 进行排序
ArrayList<Integer> numbers = new ArrayList<>(List.of(5, 3, 1, 4, 2));
Collections.sort(numbers);

9. ArrayList 复制:

// 复制 ArrayList
ArrayList<String> copyList = new ArrayList<>(list);

10. 判断 ArrayList 是否为空:

// 判断 ArrayList 是否为空
boolean isEmpty = list.isEmpty();

这些是 ArrayList 的一些基本用法。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。请注意,ArrayList 是线程不安全的,如果在多线程环境中使用,应该考虑使用线程安全的替代类,例如 CopyOnWriteArrayList

java linkedlist常见用法,请提供示例代码

LinkedList 是 Java 中 java.util 包下的双向链表实现,它提供了对列表中元素的快速插入和删除操作。以下是一些常见的 LinkedList 用法及相应的示例代码:

1. 声明和初始化 LinkedList:

import java.util.LinkedList;

// 声明和初始化 LinkedList
LinkedList<String> linkedList = new LinkedList<>();

// 直接初始化 LinkedList
LinkedList<Integer> numbers = new LinkedList<>(List.of(1, 2, 3, 4, 5));

2. 添加和删除元素:

// 在末尾添加元素
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Orange");

// 在指定位置插入元素
linkedList.add(1, "Grapes");

// 在头部添加元素
linkedList.addFirst("Pineapple");

// 删除指定位置的元素
linkedList.remove(2);

// 删除指定元素
linkedList.remove("Banana");

// 删除头部元素
linkedList.removeFirst();

3. 获取元素和遍历:

// 获取头部元素
String firstElement = linkedList.getFirst();

// 使用 for-each 遍历 LinkedList
for (String item : linkedList) {
    System.out.println(item);
}

// 使用迭代器遍历 LinkedList
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

4. 查找元素和判断是否包含:

// 查找元素的索引
int index = linkedList.indexOf("Orange");

// 判断是否包含某元素
boolean contains = linkedList.contains("Apple");

5. 获取 LinkedList 大小:

// 获取 LinkedList 大小
int size = linkedList.size();

6. 清空 LinkedList:

// 清空 LinkedList
linkedList.clear();

7. LinkedList 转为数组:

// LinkedList 转为数组
String[] array = new String[linkedList.size()];
linkedList.toArray(array);

8. LinkedList 复制:

// 复制 LinkedList
LinkedList<String> copyList = new LinkedList<>(linkedList);

9. 在链表头部和尾部执行操作:

// 在头部添加元素
linkedList.addFirst("Head");

// 在尾部添加元素
linkedList.addLast("Tail");

// 获取头部元素
String headElement = linkedList.getFirst();

// 获取尾部元素
String tailElement = linkedList.getLast();

这些是 LinkedList 的一些基本用法。与 ArrayList 不同,LinkedList 在插入和删除元素方面有更好的性能,但在随机访问元素时性能较差。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。

java set常见用法,请提供示例代码

在Java中,Set 是一个接口,它表示不包含重复元素的集合。常用的实现类包括 HashSetLinkedHashSetTreeSet。以下是一些常见的 Set 用法及相应的示例代码:

1. HashSet 的基本用法:

import java.util.HashSet;
import java.util.Set;

// 创建 HashSet
Set<String> hashSet = new HashSet<>();

// 添加元素
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Orange");

// 元素不允许重复,添加重复元素不会产生影响
hashSet.add("Apple");

// 遍历 HashSet
for (String item : hashSet) {
    System.out.println(item);
}

// 判断元素是否存在
boolean contains = hashSet.contains("Banana");

2. LinkedHashSet 的基本用法:

LinkedHashSet 继承自 HashSet,它保留了元素插入的顺序。

import java.util.LinkedHashSet;
import java.util.Set;

// 创建 LinkedHashSet
Set<String> linkedHashSet = new LinkedHashSet<>();

// 添加元素
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");

// 遍历 LinkedHashSet,保留元素插入的顺序
for (String item : linkedHashSet) {
    System.out.println(item);
}

3. TreeSet 的基本用法:

TreeSet 是一个基于红黑树的 NavigableSet 实现,元素按照自然顺序或者指定的比较器顺序进行排序。

import java.util.Set;
import java.util.TreeSet;

// 创建 TreeSet
Set<String> treeSet = new TreeSet<>();

// 添加元素
treeSet.add("Apple");
treeSet.add("Banana");
treeSet.add("Orange");

// 遍历 TreeSet,元素按照自然顺序排序
for (String item : treeSet) {
    System.out.println(item);
}

4. 判断 Set 是否为空:

boolean isEmpty = hashSet.isEmpty();

5. 获取 Set 大小:

int size = hashSet.size();

6. 删除元素:

// 删除指定元素
hashSet.remove("Banana");

// 清空 Set
hashSet.clear();

7. Set 转为数组:

String[] array = new String[hashSet.size()];
hashSet.toArray(array);

8. 使用 Set 进行交集、并集和差集操作:

Set<String> set1 = new HashSet<>(List.of("Apple", "Banana", "Orange"));
Set<String> set2 = new HashSet<>(List.of("Banana", "Pineapple", "Grapes"));

// 交集
Set<String> intersection = new HashSet<>(set1);
intersection.retainAll(set2);

// 并集
Set<String> union = new HashSet<>(set1);
union.addAll(set2);

// 差集
Set<String> difference = new HashSet<>(set1);
difference.removeAll(set2);

这些是 Set 接口及其实现类的一些基本用法。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。

java list常见用法,请提供示例代码

在Java中,List 是一个接口,它表示有序、可重复的元素集合。常见的实现类有 ArrayListLinkedListVector。以下是一些常见的 List 用法及相应的示例代码:

1. ArrayList 的基本用法:

import java.util.ArrayList;
import java.util.List;

// 创建 ArrayList
List<String> arrayList = new ArrayList<>();

// 添加元素
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.add("Orange");

// 在指定位置插入元素
arrayList.add(1, "Grapes");

// 遍历 ArrayList
for (String item : arrayList) {
    System.out.println(item);
}

// 获取元素
String element = arrayList.get(2);

// 判断元素是否存在
boolean contains = arrayList.contains("Banana");

2. LinkedList 的基本用法:

import java.util.LinkedList;
import java.util.List;

// 创建 LinkedList
List<String> linkedList = new LinkedList<>();

// 添加元素
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Orange");

// 在指定位置插入元素
linkedList.add(1, "Grapes");

// 遍历 LinkedList
for (String item : linkedList) {
    System.out.println(item);
}

// 获取元素
String element = linkedList.get(2);

// 判断元素是否存在
boolean contains = linkedList.contains("Banana");

3. Vector 的基本用法:

Vector 是一个线程安全的动态数组,但在性能上不如 ArrayList

import java.util.List;
import java.util.Vector;

// 创建 Vector
List<String> vector = new Vector<>();

// 添加元素
vector.add("Apple");
vector.add("Banana");
vector.add("Orange");

// 在指定位置插入元素
vector.add(1, "Grapes");

// 遍历 Vector
for (String item : vector) {
    System.out.println(item);
}

// 获取元素
String element = vector.get(2);

// 判断元素是否存在
boolean contains = vector.contains("Banana");

4. 判断 List 是否为空:

boolean isEmpty = arrayList.isEmpty();

5. 获取 List 大小:

int size = arrayList.size();

6. 删除元素:

// 删除指定位置的元素
arrayList.remove(1);

// 删除指定元素
arrayList.remove("Banana");

// 清空 List
arrayList.clear();

7. List 转为数组:

String[] array = new String[arrayList.size()];
arrayList.toArray(array);

8. 子列表的操作:

List<String> subList = arrayList.subList(1, 3); // 获取索引1到2的子列表

9. 使用 Collections 工具类进行排序:

import java.util.Collections;

// 对 ArrayList 进行排序
List<Integer> numbers = new ArrayList<>(List.of(5, 3, 1, 4, 2));
Collections.sort(numbers);

这些是 List 接口及其实现类的一些基本用法。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。

java map常见用法,请提供示例代码

在Java中,Map 是一个接口,它表示键值对的集合。Map 的常见实现类包括 HashMapLinkedHashMapTreeMap 等。以下是一些常见的 Map 用法及相应的示例代码:

1. HashMap 的基本用法:

import java.util.HashMap;
import java.util.Map;

// 创建 HashMap
Map<String, Integer> hashMap = new HashMap<>();

// 添加键值对
hashMap.put("Apple", 10);
hashMap.put("Banana", 5);
hashMap.put("Orange", 8);

// 获取值
int appleQuantity = hashMap.get("Apple");

// 遍历 HashMap
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// 判断键是否存在
boolean containsKey = hashMap.containsKey("Banana");

2. LinkedHashMap 的基本用法:

LinkedHashMap 继承自 HashMap,它保留了插入顺序。

import java.util.LinkedHashMap;
import java.util.Map;

// 创建 LinkedHashMap
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

// 添加键值对
linkedHashMap.put("Apple", 10);
linkedHashMap.put("Banana", 5);
linkedHashMap.put("Orange", 8);

// 遍历 LinkedHashMap,保留插入顺序
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

3. TreeMap 的基本用法:

TreeMap 是基于红黑树的 NavigableMap 实现,它按照键的自然顺序或者通过比较器进行排序。

import java.util.Map;
import java.util.TreeMap;

// 创建 TreeMap
Map<String, Integer> treeMap = new TreeMap<>();

// 添加键值对
treeMap.put("Apple", 10);
treeMap.put("Banana", 5);
treeMap.put("Orange", 8);

// 遍历 TreeMap,元素按照自然顺序排序
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

4. 判断 Map 是否为空:

boolean isEmpty = hashMap.isEmpty();

5. 获取 Map 大小:

int size = hashMap.size();

6. 删除键值对:

// 删除指定键的键值对
hashMap.remove("Banana");

// 清空 Map
hashMap.clear();

7. 获取键集、值集和键值对集合:

// 获取键集
Set<String> keySet = hashMap.keySet();

// 获取值集
Collection<Integer> values = hashMap.values();

// 获取键值对集合
Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();

8. 使用默认值或函数进行操作:

// 获取指定键的值,如果键不存在则返回默认值
int quantity = hashMap.getOrDefault("Grapes", 0);

// 使用 compute 方法更新值
hashMap.compute("Banana", (key, value) -> value + 2);

这些是 Map 接口及其实现类的一些基本用法。在实际开发中,根据具体业务需求,你可能会使用到更多的方法和操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值