zoukankan      html  css  js  c++  java
  • 集合

    集合,集合是java中提供的一种容器,可以用来存储多个数据。

    集合和数组既然都是容器,它们有啥区别呢?

    数组的长度是固定的。集合的长度是可变的。

    集合中存储的元素必须是引用类型数据

    集合继承关系

    Collection接口为最顶层集合接口~

    Collecton接口常用的子接口有:

    List接口、Set接口 

    List接口常用的子类有:ArrayList类、LinkedList类
    Set接口常用的子类有:HashSet类、LinkedHashSet类

                                  Collection 接口     
                                       |
         ----------------------------------------------------------------
         |                                                              |
        List接口                                                       Set接口
         |                                                              |
     ----------------                                             -------------
     |              |                                             |            |
    ArrayList类    LinkedList类                                 HashSet类     LinkedHashSet类

    所有继承List接口的集合都是有序且可重复的集合并且先进后出。ArrayList是数组,LinkedList底层是链表

    ArrayList:查询快,增删慢。
    因为ArrayList中的数据在内存中是连续的,成块的,查找的时候直接顺序遍历内存就可以了。
    插入删除的时候,就要把修改的那个节点之后的所有数据都向后移动,或者向前移动。所以就慢了。

    LinkedList:查询慢,增删快
    因为LinkedList是使用类似于链表来存储的,c与arraylist相反,增删只要添加一个连接就可以了,
    不要移动后面的所有元素,查询的时候每一个节点都有一个指针指向下一个节点,这样查找起来就比较慢了。

     数组,采用该结构的集合,对元素的存取有如下的特点:

    n  查找元素快:通过索引,可以快速访问指定位置的元素

    n  增删元素慢:

    u  指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。如下图

    u  指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。如下图

    l  链表,采用该结构的集合,对元素的存取有如下的特点:

    n 多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。

    n 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

    n 增删元素快:

    u 增加元素:操作如左图,只需要修改连接下个元素的地址即可。

    u 删除元素:操作如右图,只需要修改连接下个元素的地址即可。

    set:所有继承Set接口的集合都是无序不可重复的集合并没有索引,其他和list基本相同。

     

    HashSet:无序,不可重复,底层是哈希表,通过重写对象中的hashCode和equals方法,
    建立自己的比较方式,可保证HashSet集合中的对象唯一.

    HashSet:集合自身的特点:底层数据结构,哈希表

      查询快,增删也快

      线程不安全,运行速度快

      有一点,哈希表存的数据越多,查询越慢

    证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。

    如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

    比如String str   = new String(123);

      String str2 = new String(123);

    先调一个查询哈希值得方法,然后在对比equest方法。

    HashSet :存储自定义类型元素,保证对象的唯一性。

    创建自定义对象Student
    public class Student {
    	private String name;
    	private int age;
    	public Student(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "Student [name=" + name + ", age=" + age + "]";
    	}
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + age;
    		result = prime * result + ((name == null) ? 0 : name.hashCode());
    		return result;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if(!(obj instanceof Student)){
    			System.out.println("类型错误");
    			return false;
    		}
    		Student other = (Student) obj;
    		return this.age ==  other.age && this.name.equals(other.name);
    	}
    }
    
    	创建HashSet集合,存储Student对象。
    public class HashSetDemo {
    	public static void main(String[] args) {
    		//创建HashSet对象
    		HashSet hs = new HashSet();
    		//给集合中添加自定义对象
    		hs.add(new Student("zhangsan",21));
    		hs.add(new Student("lisi",22));
    		hs.add(new Student("wangwu",23));
    		hs.add(new Student("zhangsan",21));
    		//取出集合中的每个元素
    		Iterator it = hs.iterator();
    		while(it.hasNext()){
    			Student s = (Student)it.next();
    			System.out.println(s);
    		}
    	}
    }
    输出结果如下,说明集合中不能存储重复元素:
    Student [name=lisi, age=22]
    Student [name=zhangsan, age=21]
    Student [name=wangwu, age=23]

     

    LinkedHashSet:它是HashSet的一个子类,它是链表和哈希表组合的一个数据结构。

     

    演示代码如下:
    public class LinkedHashSetDemo {
    	public static void main(String[] args) {
    		Set<String> set = new LinkedHashSet<String>();
    		set.add("bbb");
    		set.add("aaa");
    		set.add("abc");
    		set.add("bbc");
    Iterator it = set.iterator();
    		while (it.hasNext()) {
    			System.out.println(it.next());
    		}
    	}
    }
    输出结果如下,LinkedHashSet集合保证元素的存入和取出的顺序:
    bbb
    aaa
    abc
    bbc

    list集合给自定义对象排序:

    Student学生类:

    package com;
    
    public class Student {
        private int studentId;
        private String studentName;
        private int age;
        public Student(int studentId , String studentName, int age){
            this.studentId=studentId;
            this.studentName=studentName;
            this.age=age;
        }
        public int getStudentId() {
            return studentId;
        }
        public void setStudentId(int studentId) {
            this.studentId = studentId;
        }
        public String getStudentName() {
            return studentName;
        }
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
            
    }

    排序类:

    package com;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    
    public class main {
            public static void main(String[] args) {
                Comparator<Student> comparator = new Comparator<Student>() {
                    public int compare(Student s1, Student s2) {
                        // 先排年龄
                        if (s1.getAge() != s2.getAge()) {
                            return s1.getAge() - s2.getAge();
                        } else if (!s1.getStudentName().equals(s2.getStudentName())) {
                            // 年龄相同则按姓名排序
                            return s1.getStudentName().compareTo(s2.getStudentName());
                        } else {
                            // 姓名也相同则按学号排序
                            return s1.getStudentId() - s2.getStudentId();
                        }
                    }
                };
                
                 Student stu1 = new Student (1,"zhangsan",28);
                 Student stu2 = new Student (2,"zhagnsan",19);
                 Student stu3 = new Student (3,"wangwu",19);
                 Student stu4 = new Student (4,"wangwu",19);
                 Student stu5 = new Student (5,"zhaoliu",18);
    
                  ArrayList<Student> list = new ArrayList<Student>();
                  list.add(stu1);
                  list.add(stu2);
                  list.add(stu3);
                  list.add(stu4);
                  list.add(stu5); 
                  //这里就会自动根据规则进行排序
                  Collections.sort(list,comparator);
                  for(int i=0;i<list.size();i++){
                      Student stu=list.get(i);
                      System.out.println("年龄:"+stu.getAge()+"   姓名:"+stu.getStudentName()+"   学号:"+stu.getStudentId());
                  }
    
            }
            
    }

    迭代器的代码实现

     public class IteratorDemo {
            public static void main(String[] args) {
              Collection<String> coll = new ArrayList<String>();
              coll.add("abc1");
              coll.add("abc2");
              coll.add("abc3");
              coll.add("abc4");
              //迭代器,对集合ArrayList中的元素进行取出
              
              //调用集合的方法iterator()获取出,Iterator接口的实现类的对象
              Iterator<String> it = coll.iterator();
              //接口实现类对象,调用方法hasNext()判断集合中是否有元素
              //boolean b = it.hasNext();
              //System.out.println(b);
              //接口的实现类对象,调用方法next()取出集合中的元素
              //String s = it.next();
              //System.out.println(s);
              
              //迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false
              while(it.hasNext()){
                String s = it.next();
                System.out.println(s);
              }
              
             
              
            }
          }
  • 相关阅读:
    [编程题-网易]小易的升级之路
    [腾讯编程题]微信红包
    [编程题]生成格雷码
    [编程题]二叉树-网易
    安装wepack
    css选择器
    宽和高
    配置环境变量
    offsetLeft在各浏览器的值
    容易忘记的css属性和动画属性
  • 原文地址:https://www.cnblogs.com/lixiangyang521/p/7873967.html
Copyright © 2011-2022 走看看