亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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的方式進行去重操作
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩三级影视基地| 国产性色av一区二区| 久久久精品一区二区三区| 亚洲男人第一网站| 色哟哟亚洲精品一区二区| 欧美性猛交xxxx免费看久久久| 九九精品视频在线观看| 亚洲欧洲第一视频| 欧美日韩国产页| 国产精品一区久久久| 亚洲一区二区三区四区在线播放| 精品一区电影国产| 欧美成aaa人片在线观看蜜臀| 欧美精品18videos性欧| 国产精品电影久久久久电影网| 日本在线观看天堂男亚洲| 91九色国产社区在线观看| 欧美最猛性xxxxx亚洲精品| 亚洲综合精品伊人久久| 亚洲成人网av| 中文字幕精品一区二区精品| 精品亚洲一区二区| 久久成年人免费电影| 国产小视频91| 91免费看视频.| 亚洲美腿欧美激情另类| 亚洲无限乱码一二三四麻| 日韩午夜在线视频| 国产精品国模在线| 亚洲精品大尺度| 国产第一区电影| 一本色道久久综合狠狠躁篇怎么玩| 久久久成人的性感天堂| 欧美激情视频一区| 成人激情视频在线播放| 亚洲热线99精品视频| 久久久久久有精品国产| 亚洲最大的免费| 国产精品久久一区主播| 亚洲第一区在线| 亚洲乱码国产乱码精品精| 日韩福利伦理影院免费| 亚洲成av人片在线观看香蕉| 久久久91精品国产一区不卡| 热re99久久精品国产66热| 久久中文字幕在线| 久久久999精品视频| 久久婷婷国产麻豆91天堂| 亚洲欧美日韩精品| 国产精品亚洲精品| 亚洲影院色无极综合| www.久久久久| 欧美一级淫片丝袜脚交| 美女国内精品自产拍在线播放| 国产精品欧美风情| 久久久精品电影| 在线电影中文日韩| 亚洲成人a**站| 亚洲精品电影久久久| 欧美激情一区二区三级高清视频| 色偷偷888欧美精品久久久| 欧美在线观看视频| 亚洲福利在线视频| 亚洲视频视频在线| 久久久久久久久91| 97精品欧美一区二区三区| 欧美视频第一页| 97在线视频国产| 精品日韩中文字幕| 欧美成人精品h版在线观看| 日韩专区在线观看| 亚洲美女性生活视频| 成人一区二区电影| 91精品视频在线看| 国产精品久久色| 久久精品精品电影网| 国产成人在线精品| 久久精品国产96久久久香蕉| 国产成人综合一区二区三区| 亚洲欧美自拍一区| 日韩欧美在线免费| 成人av电影天堂| 在线观看国产精品91| 国产精品精品一区二区三区午夜版| 高清一区二区三区日本久| 国产区精品视频| 精品香蕉在线观看视频一| 国产成人精品午夜| 国产精品精品久久久| 亚洲午夜精品视频| 精品久久久中文| 久久99国产精品自在自在app| 欧美性xxxx极品hd欧美风情| 伊人久久大香线蕉av一区二区| 国产69精品99久久久久久宅男| 中文字幕欧美国内| 国内精品中文字幕| 久久成人这里只有精品| 久久在线免费观看视频| 国产在线不卡精品| 国产成人av在线播放| 日韩欧美中文字幕在线播放| 日韩av大片免费看| 精品精品国产国产自在线| 亚洲色图偷窥自拍| 日韩精品在线播放| 在线播放日韩专区| 国产成人在线精品| 亚洲最大成人网色| 国产一区二区三区在线观看视频| 日韩精品免费在线视频观看| 久久久久久久久网站| 国产精品第1页| 一本大道亚洲视频| 亚洲欧美激情精品一区二区| 国产精品久久久久久久电影| 成人久久精品视频| 97碰在线观看| 亚洲一级一级97网| 日本精品在线视频| 亚洲视频电影图片偷拍一区| 欧美一级淫片videoshd| 国产成人综合精品在线| 亚洲黄一区二区| 欧美限制级电影在线观看| 欧美一级bbbbb性bbbb喷潮片| 亚洲欧洲国产伦综合| 成人福利视频网| 日韩美女免费观看| 欧美精品午夜视频| 色播久久人人爽人人爽人人片视av| 91美女片黄在线观| 国产v综合v亚洲欧美久久| 午夜剧场成人观在线视频免费观看| 亚洲天堂av电影| 最近2019免费中文字幕视频三| 中文字幕日韩欧美在线视频| 免费91在线视频| 2023亚洲男人天堂| 欧美性猛交丰臀xxxxx网站| 96pao国产成视频永久免费| 国产一区二区三区日韩欧美| 96sao精品视频在线观看| 亚洲精品视频中文字幕| 国产主播喷水一区二区| 九色精品免费永久在线| 黑丝美女久久久| 亚洲精品视频网上网址在线观看| 日韩在线视频免费观看| 国产亚洲激情在线| 欧美激情视频在线| 日韩av中文在线| 精品福利视频导航| 欧日韩不卡在线视频| 色哟哟亚洲精品一区二区| 欧美大荫蒂xxx| 亚洲精品电影网在线观看| 欧美激情极品视频| 欧洲日本亚洲国产区| 久久免费视频观看| 日韩精品视频在线观看网址| 97视频免费在线观看| 国内精品久久久久久中文字幕| 久久精品青青大伊人av|