这段代码为什么要用LinkedHashMap而不是HashMap?
时间: 2024-08-09 18:00:55 浏览: 100
这段代码选择使用LinkedHashMap而不是HashMap,是因为LinkedHashMap维护了元素的插入顺序。在需要保留原有顺序的情况下,HashMap的自然顺序并不保证,而LinkedHashMap可以保证迭代元素时按照添加的顺序。
当我们要按照指定的新顺序(如题目所述,先放key=1的值,再按顺序放其他key)操作时,LinkedHashMap能够保持这种顺序一致性。如果使用HashMap,虽然不影响元素查找的性能,但在迭代过程中可能会得到不同的顺序。所以,在追求有序性的场景下,LinkedHashMap是一个更好的选择。
相关问题
hashMap 转linkedHashmap 排序
在 Java 中,HashMap 是一个无序的键值对集合,而 LinkedHashMap 则是一个有序的键值对集合,其中元素按照插入顺序或者访问顺序进行排序。如果你想要将 HashMap 转换为有序的 LinkedHashMap 并按照某种排序规则进行排序,可以使用以下代码:
```java
// 创建一个 HashMap
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 5);
hashMap.put("banana", 2);
hashMap.put("orange", 4);
hashMap.put("grape", 3);
// 将 HashMap 转换为 LinkedHashMap 并按照值排序
Map<String, Integer> sortedMap = hashMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
// 打印有序的 LinkedHashMap
System.out.println(sortedMap);
```
这段代码将会输出以下结果:
```
{banana=2, grape=3, orange=4, apple=5}
```
这里使用了 Java 8 中的流式 API,首先通过 `entrySet()` 方法将 HashMap 转换为键值对的集合,然后使用 `sorted()` 方法对其进行排序,最后使用 `collect()` 方法将其转换为 LinkedHashMap 并按照值进行排序。
这段代码存在以下问题: 在导出到Excel中时,将所有数据都写入同一个Sheet中,如果数据量很大,可能会导致Excel文件过大或者导出失败。应该考虑将数据分成多个Sheet导出。 在合并父级相同的行时,使用了HashMap来存储合并的区域,但是HashMap并不能保证顺序,可能会导致合并后的行顺序错乱。应该使用LinkedHashMap来保证顺序。 导出时,将Excel文件写入OutputStream中,但是写入后没有关闭OutputStream。应该在写入完成后,及时关闭OutputStream。根据你这个优化下代码
好的,根据您的建议,我对代码进行了优化,以下是优化后的代码:
```
public static void main(String[] args) throws FileNotFoundException {
ArrayList<Node> nodes = new ArrayList<Node>();
Node node0 = new Node(0, "1", null);
Node node1 = new Node(1, "2", "0");
Node node2 = new Node(2, "3", "1");
Node node3 = new Node(3, "4", "1");
Node node4 = new Node(4, "5", "2");
Node node5 = new Node(5, "6", "2");
Node node6 = new Node(6, "7", "0");
nodes.add(node0);
nodes.add(node1);
nodes.add(node2);
nodes.add(node3);
nodes.add(node4);
nodes.add(node5);
nodes.add(node6);
OutputStream outputStream = new FileOutputStream("D:\javaTools\project\TestProject-dd\tree_data.xlsx");
exportToExcel(nodes, outputStream, 2);
}
public static void exportToExcel(List<Node> nodeList, OutputStream outputStream, int pageSize) {
Workbook workbook = new XSSFWorkbook();
int totalSize = nodeList.size();
int totalPage = (totalSize % pageSize == 0) ? (totalSize / pageSize) : (totalSize / pageSize + 1);
for (int i = 0; i < totalPage; i++) {
Sheet sheet = workbook.createSheet("Tree Data - Page " + (i + 1));
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
headerRow.createCell(2).setCellValue("Parent ID");
// 计算当前页起始位置和结束位置
int startIndex = i * pageSize;
int endIndex = Math.min((i + 1) * pageSize, totalSize);
// 创建数据行
int rowIndex = 1;
for (int j = startIndex; j < endIndex; j++) {
Node node = nodeList.get(j);
Row row = sheet.createRow(rowIndex++);
row.createCell(0).setCellValue(node.getId());
row.createCell(1).setCellValue(node.getName());
row.createCell(2).setCellValue(node.getParentId());
}
// 合并父级相同的行
Map<String, CellRangeAddress> mergedRegions = new LinkedHashMap<>();
for (int k = 1; k < rowIndex; k++) {
Row row = sheet.getRow(k);
String parentId = row.getCell(2).getStringCellValue();
if (mergedRegions.containsKey(parentId)) {
CellRangeAddress mergedRegion = mergedRegions.get(parentId);
int lastRow = mergedRegion.getLastRow();
if (lastRow == k - 1) {
mergedRegions.put(parentId, new CellRangeAddress(lastRow, k, 2, 2));
} else {
mergedRegions.put(parentId, new CellRangeAddress(lastRow + 1, k, 2, 2));
}
} else {
mergedRegions.put(parentId, new CellRangeAddress(k, k, 2, 2));
}
}
for (CellRangeAddress mergedRegion : mergedRegions.values()) {
sheet.addMergedRegion(mergedRegion);
}
}
// 输出Excel
try {
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
```
优化后的代码实现了将数据分成多个Sheet导出,每个Sheet包含指定数量的数据行,避免了导出过大的Excel文件。同时使用LinkedHashMap来存储合并的区域,保证了合并后的行顺序不会错乱。在写入完成后,及时关闭OutputStream,避免内存泄漏。
阅读全文