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

三者异同

  • 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

时间: 2024-10-01 18:43:30

Java中List、Set、Map区别--小记的相关文章

java 文件输入输...-关于JAVA中文件的map写入操作

问题描述 关于JAVA中文件的map写入操作 想实现一个功能,首先有个map,不过只有一条数据.判断在指定路径是否有文件存在,如果没有则先创建再将map写入,如果指定路径有文件存在则直接写入或者,追加记录.谢谢了 解决方案 File.isFile方法可以判断文件是否存在: 写入的追加可以在申明输出流的时候加标志: 例如new FileOutputStream(File or filename, append) append为true表示追加写入: 如果要直接写入map,可以用序列化. 解决方案二

字符串-java中String str1…的区别,详细见内容

问题描述 java中String str1-的区别,详细见内容 String str1,str2; str1 = "we are friends"; str2 = "we are friends"; 和 String str1 = "we are friends"; String str2 = "we are friends"; 在内存上的区别是什么? 是否有区别? 解决方案 没有区别,他们指向同一个对象 解决方案二: 就最后

java类的问题-关于java中的方法的区别

问题描述 关于java中的方法的区别 我是java菜鸟,想问一个问题关于 public static void main (String [] args){} 和static public void main (String [] args){} 的区别是什么?在jvm中是如何执行的? 解决方案 应该是没区别的吧 你要看区别 先分别编译后 后看看编译后的内容的区别吧 很多代码经过编译后效果是一样的

c#与java中byte字节的区别及转换方法

原文:c#与java中byte字节的区别及转换方法在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时候 要先把java的byte数组转换成在[0,255]范围内的int型数组a[];再把a[]进行加密得到字符串str, 把字符串传到web服务上. 转换方法: int data[] = new int[bytes.length]; for(int i=0;i    data[i] = bytes[i]

java中”==”和”Equal”的区别

对于一些基本数据类型,int,long,bool,还有char!,"=="都是表示值相等的意思,没有equal方法. equal方法是object对象里面的方法,java中String不是基本数据类型,而是一个类,它们都是继承object类,还有Integer和int的区别也是Integer是一个类! 在object类中,equal方法与"=="是等同的,"=="不是表示值相等,而是比较对象的地址是否相等!Integer和String都重写了(没

Java中的==和equals区别

中软国际电子政务部Jeff Chi总结,转载请说明出处. 概述:        A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.        B.对于String a = "a"; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的.        C.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true).        D.一个类如果没有定义equa

Java中StringBuffer和StringBuilder区别_java

早先用Java的时候,知道有个类叫StringBuffer,用来拼接较长的字符串.转到C#之后,也有一个似类功能的类叫作StringBuilder,简写都是sb,非常好记. 再后来转移回Java的时候,发现Java也有了StringBuilder,于是就好奇了一下为什么在StringBuffer之后又推出了StringBuilder. 原来Java的StringBuilder(和C#一样)是非线程安全的,而早先的StringBuffer具有一定的线程安全属性.当然,推出StringBuilder

java中equals和==的区别

[LeetCode]–155. Min Stack 在这个问题中,我遇到了==和equals的问题,虽然试一下就能得出结果,但是我想弄明白. java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的

Java 中Comparable和Comparator区别比较_java

Comparable 简介Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序.此外,"实现Comparable接口的类的对象"可以用作"有序映射(如Tre

java中equals和==的区别介绍

示例一.  代码如下 复制代码 public class Demo {     public static void main(String args[]) {         String str="soka";         String str2 = "soka";         System.out.println("soka".equals(str));         System.out.println(str==str2);