最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java list去重操作實(shí)現(xiàn)方式

 更新時(shí)間:2012年12月05日 15:57:46   作者:  
Java中的List是可以包含重復(fù)元素的(hash code 和equals),接下來(lái)將介紹兩種方式實(shí)現(xiàn)java list去重操作,感興趣的朋友可以參考下
Java中的List是可以包含重復(fù)元素的(hash code 和equals),那么對(duì)List進(jìn)行去重操作有兩種方式實(shí)現(xiàn):
方案一:可以通過(guò)HashSet來(lái)實(shí)現(xiàn),代碼如下:
復(fù)制代碼 代碼如下:

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;
}
}

必須實(shí)現(xiàn)hashCode和equals兩個(gè)方法,一會(huì)我們會(huì)看為啥必須實(shí)現(xiàn)
具體的操作代碼如下:
復(fù)制代碼 代碼如下:

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()));
}

調(diào)用代碼:
復(fù)制代碼 代碼如下:

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

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

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

調(diào)用了HashMap進(jìn)行操作的,我們看HashMap的put操作:
復(fù)制代碼 代碼如下:

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;
}

需要注意的是:
復(fù)制代碼 代碼如下:

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

也就是說(shuō)hash code相等且equals(==)。
復(fù)雜度:一邊遍歷即可,O(n)
方案二:直接遍歷一遍L(zhǎng)ist進(jìn)行通過(guò)contains和add操作實(shí)現(xiàn)
代碼如下:
復(fù)制代碼 代碼如下:

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()));
}

其他等同上面。
復(fù)雜度:
一邊遍歷,同時(shí)調(diào)用了contains方法,我們查看源碼如下:
復(fù)制代碼 代碼如下:

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;
}

可以看到又對(duì)新的list做了一次遍歷操作。也就是1+2+....+n這樣復(fù)雜度為O(n*n)
結(jié)論:
方案一效率高,即采用HashSet的方式進(jìn)行去重操作

相關(guān)文章

  • Jackson反序列化@JsonFormat 不生效的解決方案

    Jackson反序列化@JsonFormat 不生效的解決方案

    這篇文章主要介紹了Jackson反序列化@JsonFormat 不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解

    springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解

    本文主要介紹了springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • maven搭建spring項(xiàng)目(圖文教程)

    maven搭建spring項(xiàng)目(圖文教程)

    下面小編就為大家?guī)?lái)一篇maven搭建spring項(xiàng)目(圖文教程)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java中InetAddress類(lèi)的使用

    Java中InetAddress類(lèi)的使用

    InetAddress類(lèi)是Java中用于表示IP地址的類(lèi),本文就來(lái)介紹一下Java中InetAddress類(lèi)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見(jiàn)問(wèn)題

    java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見(jiàn)問(wèn)題

    BigDecimal是Java在java.math包中提供的線(xiàn)程安全的API類(lèi),用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見(jiàn)問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • Java的原子類(lèi)無(wú)鎖并發(fā)利器詳解

    Java的原子類(lèi)無(wú)鎖并發(fā)利器詳解

    這篇文章主要介紹了Java的原子類(lèi)無(wú)鎖并發(fā)利器詳解,原子類(lèi)同樣能夠解決互斥性問(wèn)題、原子性問(wèn)題除此之外,因?yàn)樵宇?lèi)是無(wú)鎖操作,沒(méi)有用互斥鎖解決帶來(lái)的加鎖解決性能消耗,這種絕佳方案是怎么做到的呢,需要的朋友可以參考下
    2023-12-12
  • RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟

    這篇文章主要介紹了RabbitMQ的安裝和配置可視化界面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Java集合框架之Collection接口詳解

    Java集合框架之Collection接口詳解

    這篇文章主要為大家詳細(xì)介紹了Java集合框架之Collection接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java集合之LinkedHashSet類(lèi)詳解

    Java集合之LinkedHashSet類(lèi)詳解

    這篇文章主要介紹了Java集合之LinkedHashSet類(lèi)詳解,LinkedHashSet 是 Java 中的一個(gè)集合類(lèi),它是 HashSet 的子類(lèi),并實(shí)現(xiàn)了 Set 接口,與 HashSet 不同的是,LinkedHashSet 保留了元素插入的順序,并且具有 HashSet 的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • 值得收藏的SpringBoot 實(shí)用的小技巧

    值得收藏的SpringBoot 實(shí)用的小技巧

    最近分享的一些源碼、框架設(shè)計(jì)的東西。我發(fā)現(xiàn)大家熱情不是特別高,想想大多數(shù)應(yīng)該還是正兒八經(jīng)寫(xiě)代碼的居多;這次就分享一點(diǎn)接地氣的: SpringBoot 使用中的一些小技巧 ,需要的朋友可以參考下
    2018-10-10

最新評(píng)論

汨罗市| 西贡区| 肇州县| 阿拉尔市| 临泉县| 社旗县| 眉山市| 奉节县| 夏邑县| 绥滨县| 永春县| 青田县| 龙泉市| 汽车| 山西省| 阿拉善盟| 延寿县| 泗阳县| 安图县| 新晃| 泸西县| 金川县| 乳山市| 绍兴市| 镇远县| 齐河县| 晋州市| 南木林县| 炎陵县| 上栗县| 和静县| 永康市| 遵义市| 丰县| 雷州市| 大石桥市| 乌鲁木齐县| 南开区| 宜宾市| 德令哈市| 寿宁县|