Java中List、Set、Map区别--小记

来源:互联网 发布:淘宝 clarks小公主 编辑:程序博客网 时间:2024/05/21 15:39

三者异同

  • List,Set都是继承自Collection接口;

  • List特点:元素有放入顺序,元素可重复;
    Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的);
    Map特点:元素按键值对存储,无放入顺序 (应该知道什么是键值对吧!) ;

  • List接口有三个实现类:LinkedList,ArrayList,Vector;
    LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢;
    ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低;
    Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet;
    SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
    Query接口有一个实现类:LinkList
    Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
    HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
    SortedMap有一个实现类:TreeMap
    其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
    set 一般无序不重复.map kv 结构 list 有序

  • Map相当于和Collection一个级别的;Map

去重的问题

package yn;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;/** * 类描述:set集合针对String类型和8大基础数据类型过滤掉重复数据,如果存放的是其他类型对象, * 则需要重写hashCode方法和equals方法,当equals比较相等时, * 则会去比较hashCode值 hashCode的值 如果一致的话,则不会存进set * @author yxx */public class ListSetMap {      public static void main(String[] args) {          Set<String> nameSet = new HashSet<String>();          nameSet.add("张三");          nameSet.add("李四");          nameSet.add("王五");          nameSet.add("张三");          // 输出结果 张三  李四  王五          for(String name : nameSet){              System.out.print(name + "\t");          }          System.out.println();        // List集合去除重复基础数据          List<String> nameList = new ArrayList<String>();          nameList.add("张三");          nameList.add("李四");          nameList.add("王五");          nameList.add("赵六");          nameSet.addAll(nameList);          // 输出结果 张三  李四  王五  赵六          for(String name : nameSet){              System.out.print(name + "\n");          }          // 去除编号和用户名一样的 对象,需要重写 equals 方法 和 hashCode方法          User admin = new User(1, "admin");          User user = new User(2, "user");          User user1 = new User(2, "user");          User admin1 = new User(3, "admin");          Set<User> userSet = new HashSet<User>();          userSet.add(admin);          userSet.add(user);          userSet.add(admin1);          userSet.add(user1);          // 输入结果 admin1  admin3  user2          for(User u : userSet){              System.out.print(u.username + u.id + "\t");          }          System.out.println(user.equals(null));      }  }  class User{      protected Integer id;      protected String username;      public User(Integer id, String username){          this.id = id;          this.username = username;      }      /**      * 如果对象类型是User 的话 则返回true 去比较hashCode值      */      @Override      public boolean equals(Object obj) {          if(obj == null) return false;          if(this == obj) return true;          if(obj instanceof User){               User user =(User)obj;  //          if(user.id = this.id) return true; // 只比较id              // 比较id和username 一致时才返回true 之后再去比较 hashCode              if(user.id == this.id && user.username.equals(this.username)) return true;              }          return false;      }      /**      * 重写hashcode 方法,返回的hashCode 不一样才认定为不同的对象      */      @Override      public int hashCode() {  //      return id.hashCode(); // 只比较id,id一样就不添加进集合          return id.hashCode() * username.hashCode();      }  }  

运行截图

这样一来基本就明白了重写equal是干什么的,也知道了set集合针对String类型和8大基础数据类型过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,则不会存进set

0 0
原创粉丝点击