gpt4 book ai didi

java - 高效的对象初始化

转载 作者:行者123 更新时间:2023-11-30 08:02:35 25 4
gpt4 key购买 nike

我正在创建一个模拟 Twitter 项目,该项目从一个较大的文本文件中加载用户数据,该文本文件包含约 360 万行格式如下:

0 12
0 32
1 9
1 54
2 33
etc...

第一个字符串标记是 userId第二个是 followId .

这个辅助方法的前半部分接收当前用户的 ID,检查它是否存在,并在必要时创建一个新用户。之后,followId已添加到此新用户或现有用户的以下类型列表中 ArrayList<Integer> .

需要读取约 360 万行,这不会花费很长时间(9868 毫秒)。

现在下半部分创建或找到关注的用户 ( followId ) 并添加 userId添加到他们的关注者列表中,但是这个额外的代码以指数方式延长了读取文件的时间(172744 毫秒)。

我尝试使用相同的 TwitterUser整个方法中的对象。所有添加方法( followaddFollower )都很简单 ArrayList.add()方法。我可以做些什么来提高这种方法的效率吗?

请注意:虽然这与学校有关,但我并不是要我的解决方案得到答案。我的教授允许这种缓慢的对象初始化,但我想了解如何让它更快。

private Map<Integer, TwitterUser> twitterUsers = new HashMap<Integer, TwitterUser>();

private void AddUser(int userId, int followId){
TwitterUser user = getUser(userId);
if (user == null){
user = new TwitterUser(userId);
user.follow(followId);
twitterUsers.putIfAbsent(userId, user);
} else{
user.follow(followId);
}
//adding the code below, slows the whole process enormously
user = getUser(followId);
if (user == null){
user = new TwitterUser(followId);
user.addFollower(userId);
twitterUsers.putIfAbsent(followId, user);
} else{
user.addFollower(userId);
}
}

private TwitterUser getUser(int id){
if (twitterUsers.isEmpty()) return null;
return twitterUsers.get(id);
}

最佳答案

如果 putIfAbsent(int, User) 做了您期望它做的事情,即:在插入之前检查它是否存在,为什么要在一个if block 的条件已经检查用户是否在那里?

换句话说,如果获取用户返回了一个 null 值,您可以放心地假设该用户不存在。

现在我不太确定 *putIfAbsent* 方法的内部工作原理(可能它会遍历 map 中的键集),但直觉上我希望正常put(int, User) 执行得更好,当扫描输入文件时, map 会变得和您的 map 一样大。

因此我建议尝试类似的方法:

user = getUser(followId);
if (user == null){
user = new TwitterUser(followId);
user.addFollower(userId);
twitterUsers.put(followId, user);
} else{
user.addFollower(userId);
}

这也适用于上半年。

关于java - 高效的对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com