代码while(true){ new ArrayList<>();}用java执行的结果是什么
时间: 2023-03-05 11:28:19 浏览: 73
这段Java代码会导致内存泄漏,并最终导致程序抛出OutOfMemoryError异常。当代码执行时,它会创建一个新的空ArrayList,但是由于while循环条件永远为true,所以这个新的ArrayList对象永远不会被垃圾回收器清理掉,最终导致程序占用的内存越来越多,直到程序耗尽所有可用的内存而导致崩溃。
相关问题
优化一下这段代码 import java.util.ArrayList; import java.util.Collections; import java.util.TreeSet; public class MyRun06 implements Runnable { ArrayList<Integer> list = new ArrayList<>(); public MyRun06(ArrayList<Integer> list) { this.list = list; Collections.shuffle(list); } @Override public void run() { TreeSet<Integer> arr = new TreeSet<>(); while (true) { synchronized (MyRun06.class) { if (list.size() == 0) { int sum=0; for (Integer integer : arr) { sum+=integer; } System.out.println(Thread.currentThread().getName() + arr+"最高奖为"+ arr.last()+"和为"+sum); break; } else { arr.add(list.remove(0)); } } /* try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } }
根据你提供的代码,我有以下优化建议:
1. 使用 LinkedList 替代 ArrayList
在这个代码中,你需要频繁地删除列表的第一个元素,使用 LinkedList 可以更有效地实现这个功能,因为 LinkedList 中的元素存储在节点中,删除一个元素只需要修改前一个节点的后继节点和后一个节点的前驱节点即可,不需要像 ArrayList 那样将后面所有元素向前移动。
2. 在构造函数中进行集合的初始化
在这个代码中,你在构造函数中将集合随机打乱,但是你可以在构造函数中直接创建一个已经打乱的集合,避免在运行时进行打乱操作。这可以通过将 ArrayList 改为 List 接口,然后在构造函数中使用 Collections.shuffle() 方法,将打乱后的集合转换为 ArrayList 来实现。
3. 优化同步块
在这个代码中,你使用同步块保证了对 list 的访问是线程安全的,但是这也意味着每个线程只能在获取到锁之后才能访问 list,这可能会导致线程的竞争和阻塞。为了避免这个问题,可以将同步块移到 else 子句中,这样只有在 list 不为空时才需要获取锁。
以下是优化后的代码:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
public class MyRun06 implements Runnable {
private List<Integer> list;
public MyRun06(List<Integer> list) {
this.list = new LinkedList<>(list);
Collections.shuffle(this.list);
}
@Override
public void run() {
TreeSet<Integer> arr = new TreeSet<>();
while (true) {
if (list.isEmpty()) {
int sum = arr.stream().mapToInt(Integer::intValue).sum();
System.out.println(Thread.currentThread().getName() + arr + "最高奖为" + arr.last() + "和为" + sum);
break;
} else {
synchronized (this) {
arr.add(list.remove(0));
}
}
}
}
}
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Map<String, List<Integer>> map = new HashMap(); int n = 0; List<String> lines = new ArrayList<>(); while (true) { String line = in.nextLine(); if (line.equals("!!!!!")) break; n++; lines.add(line); String[] words = line.split(" "); for (String word : words) { if (map.containsKey(word)) { if (map.get(word).contains(n)) continue; map.get(word).add(n); } else { List<Integer> index = new ArrayList<>(); index.add(n); map.put(word, index); } } } List<Map.Entry<String, List<Integer>>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, Comparator.comparing(Map.Entry::getKey)); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } while (true) { String[] keys = in.nextLine().split(" "); List<List<Integer>> index = new ArrayList<>(); for (int i = 0; i < keys.length; i++) { for (int j = 0; j < list.size(); j++) { if (list.get(j).getKey().equals(keys[i])) { index.add(list.get(j).getValue()); } } } if (index.size() == 0) { System.out.println("found 0 results"); continue; } List<Integer> result = index.get(0); if (keys.length >= 2) { for (int i = 1; i < index.size(); i++) { result.retainAll(index.get(i)); } if (result.size()==0){ System.out.println("found 0 results"); continue; } } System.out.println(result); for (int i : result) { System.out.println("line "+i+":"+lines.get(i-1)); } } } }
这是一段 Java 代码,它实现了一个简单的文本搜索功能。用户可以输入多行文本,程序会将每个单词与所在的行数存储在一个 HashMap 中。用户可以输入多个关键词,程序会返回包含所有关键词的行号。如果没有找到任何匹配,程序会输出 "found 0 results"。如果找到了匹配的行,程序会输出行号和具体的文本内容。
阅读全文