我无法理解HashMap的工作模式.请帮助理解它.
假设我们有两个对象Obj1和Obj2具有与1212相同的Hashcode .现在当我们运行"=="并且等于它时返回false.
现在我使用ValueObj1和Valueobj2作为HashMap中的值,分别使用Keys Obj1和Obj2.我相信两个值都将保存在与List相同的桶中.
我的问题是HashMap如何为Obj2选择Valueobj2而为Obj1选择 ValueObj1.假设有n ..这样的对象和值.这个键 - >值关联如何在内部工作,即使哈希码相同但值不同.
假设两个条件等于未被覆盖和覆盖.
我试图从 HashSet 中删除一个元素,但它不会。
调用 时.contains(obj),它返回 true,因此.contains知道对象在 中HashSet。但是当我调用 时.remove(obj),对象不会从 中删除HashSet,它返回false。
对象代码 - https://gist.github.com/rincew1nd/f97f11d21ba41d2f4197f9a9da02fea1
我有一个类生成一个String对象:
key = "K:" + this.hashCode();
Run Code Online (Sandbox Code Playgroud)
此类不从任何其他类继承,并且它不会覆盖hashCode().我有一个情况,我得到重复的键,所以一个对象的两个不同的实例返回完全相同的hashCode().
怎么会发生这种情况以及可以采取哪些措施来避免它呢?这个类是我正在使用的API的一部分,所以我无法控制它,但是如果有一些方法我可以在创建这个对象的实例时等待或者什么,那么类似的东西可以工作.
我有一个带有最终String的类作为唯一ID.当然我想重写equals所以比较只基于ID.那么只返回ID的哈希码是正确的做法,如下所示?
class ItemSpec{
final String name;
...
@Override
public boolean equals(Object o){
if(o != null && o instanceof ItemSpec){
return name.equalsIgnoreCase(((ItemSpec)o).name);
} else{
return false;
}
}
@Override
public int hashCode(){
if(name == null){
return 0;
} else{
return name.hashCode();
}
}
}
Run Code Online (Sandbox Code Playgroud) 在我的java代码中,我有一个结构Person:
public class Person {
String name;
String distance;
String address;
String field1;
String field2;
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个ArrayList<Person> people包含几个对象的东西.我还有另一个ArrayList<Person> otherPeople包含其他对象的东西.
我想生成一个第三个列表,其中包含people尚未包含的所有对象otherPeople.
但我只需要通过自己的比较对象name,distance并且address,我不在乎值的field1和field2.
我想过创建2 for循环:
for (Person newPerson: people) {
for (Person oldPerson: otherPeople) {
if(newPerson.getName().equals(oldPerson.getName()) &&
newPerson.getDistance().equals(oldPerson.getDistance()) &&
newPerson.getAddress().equals(oldPerson.getAddress()) {
Run Code Online (Sandbox Code Playgroud)
但我不知道如何继续,特别是因为我不能从我正在迭代的列表中删除元素......你能帮助我吗?
假设,我有一个班级,称之为学生.student类有一个元素,一个名为Id的int.我想覆盖equals,因此如果将Student与Integer进行比较,则该方法返回true.喜欢:
public class OverrideTest {
public static void main(String[] args) {
Student a = new Student();
a.setId(5);
System.out.println(a.equals(5));
}
public static class Student {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (o instanceof Student) {
Student a = (Student) o;
if (a.getId() == this.getId())
return true;
}
if (o == this)
return true;
if (o instanceof Integer) {
int id = …Run Code Online (Sandbox Code Playgroud) 我有一个类的哈希码实现,哈希码实现与eclipse生成的一致,也是这里讨论的最常被接受的实践
这是我的哈希码实现(此方法中使用的所有ID都构成了对象的键):
public int hashCode() {
final int prime = 31;
int hashCode = 1;
if(uId != null){
hashCode = prime * hashCode + uId.hashCode();
}
if(rId != null){
hashCode = prime * hashCode + rId.hashCode();
}
if(bId != null){
hashCode = prime * hashCode + bId.hashCode();
}
if(reId != null){
hashCode = prime * hashCode + reId.hashCode();
}
if(cId != null){
hashCode = prime * hashCode + cId.hashCode();
}
return hashCode;
}
Run Code Online (Sandbox Code Playgroud)
我遇到了一个使用非常大的数据集进行测试的场景,而且我的集合没有这个类的预期数量的对象.仔细观察下面两个数据集导致相同的哈希码:50268236873,因此一条记录被添加到集合中的最后一个替换,因为它们的哈希码是相同的.
Existing record :
Record@2c0781cd[uId=54046,rId=10967,bId=177,reId=1728,cId=50194] …Run Code Online (Sandbox Code Playgroud) 我有一个名为Stock的简单类,下面列出了代码,我的要求是创建一个Stock集合,其中字段StockId,Code和name的组合应该是唯一的,我通过实现自己的列表类来实现这一点.我想知道是否有更好的方法来做到这一点
public class Stock {
private Integer stockId;
private String stockCode;
private String stockName;
public Stock() {
}
public Stock(Integer stockId,String stockCode, String stockName) {
this.stockCode = stockCode;
this.stockName = stockName;
}
public Integer getStockId() {
return this.stockId;
}
public void setStockId(Integer stockId) {
this.stockId = stockId;
}
public String getStockCode() {
return this.stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
public String getStockName() {
return this.stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
} …Run Code Online (Sandbox Code Playgroud) 我正在获取json数据:
[
{
"name": "A",
"count": "2"
},
{
"name": "B",
"count": "1"
},
{
"name": "A",
"count": "3"
},
{
"name": "C",
"count": "10"
},
{
"name": "B",
"count": "2"
}
]
Run Code Online (Sandbox Code Playgroud)
所以我使用for循环,正常的东西迭代数据.但我想最终得到arraylist这样的结论:
Ç - > 7
A - > 5
乙 - > 3
请注意,list从最高到最低排序.到目前为止我尝试的是:
//create my arraylists
//has both name and count
ArrayList<String>namesWithCountList = new ArrayList<>();
//has only names
ArrayList<String>namesList = new ArrayList<>();
//get json array..
//iterate using for …Run Code Online (Sandbox Code Playgroud)