麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

java list去重操作實現方式

2019-11-26 16:16:39
字體:
來源:轉載
供稿:網友
Java中的List是可以包含重復元素的(hash code 和equals),那么對List進行去重操作有兩種方式實現:
方案一:可以通過HashSet來實現,代碼如下:
復制代碼 代碼如下:

class Student {
private String id;
private String name;
public Student(String id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Student other = (Student) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
return true;
}
}

必須實現hashCode和equals兩個方法,一會我們會看為啥必須實現
具體的操作代碼如下:
復制代碼 代碼如下:

private static void removeListDuplicateObject() {
List<Student> list = new ArrayList<Student>();
for (int i = 0; i < 10; i++) {
Student student = new Student("id", "name");
list.add(student);
}
System.out.println(Arrays.toString(list.toArray()));
Set<Student> set = new HashSet<Student>();
set.addAll(list);
System.out.println(Arrays.toString(set.toArray()));
list.removeAll(list);
set.removeAll(set);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(set.toArray()));
}

調用代碼:
復制代碼 代碼如下:

public static void main(String[] args) {
removeListDuplicateObject();
}

利用HashSet進行去重操作,為啥必須覆蓋hashCode和equals兩個方法呢?
我們查看HashSet的add操作源碼如下:
復制代碼 代碼如下:

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

調用了HashMap進行操作的,我們看HashMap的put操作:
復制代碼 代碼如下:

public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}

需要注意的是:
復制代碼 代碼如下:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
......
}

也就是說hash code相等且equals(==)。
復雜度:一邊遍歷即可,O(n)
方案二:直接遍歷一遍List進行通過contains和add操作實現
代碼如下:
復制代碼 代碼如下:

private static void removeListDuplicateObjectByList() {
List<Student> list = new ArrayList<Student>();
for (int i = 0; i < 10; i++) {
Student student = new Student("id", "name");
list.add(student);
}
System.out.println(Arrays.toString(list.toArray()));
List<Student> listUniq = new ArrayList<Student>();
for (Student student : list) {
if (!listUniq.contains(student)) {
listUniq.add(student);
}
}
System.out.println(Arrays.toString(listUniq.toArray()));
list.removeAll(list);
listUniq.removeAll(listUniq);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(listUniq.toArray()));
}

其他等同上面。
復雜度:
一邊遍歷,同時調用了contains方法,我們查看源碼如下:
復制代碼 代碼如下:

public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

可以看到又對新的list做了一次遍歷操作。也就是1+2+....+n這樣復雜度為O(n*n)
結論:
方案一效率高,即采用HashSet的方式進行去重操作
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 性片网站 | 国产精品18久久久久久久 | 一级色毛片 | 91av资源在线 | 久久国产精品免费视频 | 精品亚洲夜色av98在线观看 | 国产91精品久久久久久久 | 久久国产精品免费视频 | 竹内纱里奈和大战黑人 | 极品大长腿啪啪高潮露脸 | 久久精品国产99久久久古代 | 欧美国产免费 | 亚洲精品wwww | 欧美色视频免费 | 成人国产精品一区二区毛片在线 | 午夜伦情电午夜伦情电影 | 19禁国产精品福利视频 | 牛牛视频在线 | 黄色片网站在线播放 | 日本不卡一区二区在线观看 | 国产日韩a| 亚洲一区二区中文字幕在线观看 | xxxx69hd一hd72 | 欧美乱码精品一区 | 久草在线网址 | 爱逼av | 天天夜天天操 | 免费毛片小视频 | 国产免费成人 | 毛片免费一区二区三区 | 欧美1区2区在线观看 | 久久99亚洲精品 | 国产91亚洲精品一区二区三区 | 91看片在线观看视频 | 成人国产精品一区二区毛片在线 | 久久9久久 | 一级毛片在线观看免费 | 极品五月天 | 国产免费大片视频 | 91精品免费在线 | 国产精品久久久久久影院8一贰佰 |