zoukankan      html  css  js  c++  java
  • 集合框架(02)List

    List的类型和特点

     

      ArrayList:底层的数据结构使用的是数组结构。特点:查询的速度很快,但是增删稍慢 线程不同步

      LinKedList:底层使用的链表数据结构。特点:增删的速度很快,查询稍慢

      Vector:底层是数组数据结构,线程同步,被ArrayList替代.特点:枚举是Vector特有的取出方式

    枚举

    .其实枚举和迭代是一样的,因为枚举的名称以及方法都过长,所以被迭代器取代了,枚举郁郁而终了

    LinkedList:

    LinkedList:特有的方法  addFirst(),addLast(), getFirst(), getLast(),. removeFirst(), removeLast()

    removeFirst():移除并返回第一个元素,如果此列表为空则抛出NoSuchElementException异常

    poolFirst():获取并移除此列表的第一个元素,如果此列表为空,则返回null,不抛异常

    JDK1.6出现了替代方法。

     

    offerFirst() , offerLast() , peekFirst() ,peekLast() , pollFirst () , pollLast()

    LinkedList方法代码:

    package sxy.List;
    
    import java.util.LinkedList;
    
    public class LinkedListDemo {
    
        public static void main(String[] args){
            
            LinkedList link1= new LinkedList();
            link1.addFirst("apple1");
            link1.addFirst("apple2");
            link1.addFirst("apple3");
            link1.addFirst("apple4");
            
            sop(link1);
            
            //“遍历”
            while(!link1.isEmpty()){
                System.out.println(link1.removeFirst());
            }
        }
        
        public static void sop(Object obj){
            System.out.println(obj);
        }
    
    }

     

    使用LinkedList模拟一个堆栈或者队列的数据结构。

    堆栈:先进后出

    队列:先进先出  First In First Out FIFO

    典型例子(熟记):

    package sxy.List;
    
    import java.util.LinkedList;
    
    class DuiLie{
        private LinkedList link;
        DuiLie(){
            link = new LinkedList();
        }
        public void myAdd(Object obj){
            link.addFirst(obj);
        }
        public Object myGet(){
            return link.removeLast();
        }
        public boolean isNull(){
            return link.isEmpty();
        }
        
    }
    public class LinkedListDemo2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DuiLie dl = new DuiLie();
            dl.myAdd("apple1");
            dl.myAdd("apple2");
            dl.myAdd("apple3");
            dl.myAdd("apple4");
            
            while(!dl.isNull()){
                System.out.println(dl.myGet());
            }
            
    
        }
        
    
    }

     去掉ArrayList的中重复的元素:

    package sxy.List;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class TestArrayList {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
        
            //去除ArrayList中的重复元素
            ArrayList al = new ArrayList();
            al.add("apple1");
            al.add("apple2");
            al.add("apple3");
            al.add("apple3");
            al.add("apple3");
            al.add("apple4");
            //打印原集合
            sop(al);
            //打印去重之后的集合
            al = SingleElement(al);
            sop(al);
    
        }
        public static  void sop(Object obj){
            System.out.println(obj);
        }
        
        public static ArrayList SingleElement(ArrayList al){
            ArrayList al2 = new ArrayList();
            Iterator it = al.iterator();
            
            while(it.hasNext()){
                Object obj = it.next();
                if(!al2.contains(obj)){
                    al2.add(obj);
                }
            }
            return al2;
        }
    
    }

     去除ArrayList中重复自定义对象:

    将自定义对象作为元素存到ArrayList集合中,并除去重复元素

    比如:存人对象。同姓名同年龄,视为同一个人。为重复元素

    思路:

    1. 对人描述,将数据封装进人对象
    2. 定义容器,将人存入。
    3. 取出 、
    package CollectionTest;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    class Person{
        private String name;
        private int 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;
        }
        Person(String name,int age){
            this.name=name;
            this.age=age;
        }
        Person(){
            
        }
        
        @Override
        public boolean equals(Object obj) {//重写equals方法
            Person per = (Person) obj;
            if (per.getName().equals(this.name) && per.getAge() == this.age) {
                return true;
            }
            return false;
        }
    }
    
    public class ArrayListDemo2 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ArrayList<Person> al = new ArrayList();
            al.add(new Person("lisi1",10));
            al.add(new Person("lisi2",20));
            al.add(new Person("lisi2",20));
            al.add(new Person("lisi3",30));
            al.add(new Person("lisi4",40));
            al.add(new Person("lisi4",40));
            
            al=SingleElement(al);
            Iterator it = al.iterator();
            while(it.hasNext()){
                //向下转型
                 Person p = (Person) it.next();
                 System.out.println(p.getName()+"::"+p.getAge());
            }
    
        }
        public static ArrayList SingleElement(ArrayList al){
            ArrayList arrNew = new ArrayList();
            Iterator it = al.iterator();
            while(it.hasNext()){
                Object obj = it.next();
                //在调用contains方法的时候调用equals方法
                if(!arrNew.contains(obj)){
                    arrNew.add(obj);
                }
            }
            return arrNew;
        }
    
    }

    equals和contains方法的区别:

    最近用到了equals和contains两个方法,两个都有对比的意思,但区别呢?在网上找了些资料,似乎大概能分清了。
    首先是文档上的内容:

    public boolean equals(Object ob指示其他某个对象是否与此对象“相等”。

    equals 方法在非空对象引用上实现相等关系:
      ● 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
      ● 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
      ● 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回true。
      ● 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
      ● 对于任何非空引用值 x,x.equals(null) 都应返回 false。
    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
    注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
    参数:
    obj - 要与之比较的引用对象。
    返回:
    如果此对象与 obj 参数相同,则返回 true;否则返回 false。
    contains
    public boolean contains(CharSequence s)
    当且仅当此字符串包含指定的 char 值序列时,返回 true。
    参数:
    s - 要搜索的序列
    返回:
    如果此字符串包含 s,则返回 true,否则返回 false
    抛出:
    NullPointerException - 如果 s 为 null
    似乎有些难懂,尤其是equals的解释,下面是网友的解释内容:
    equals是比较两个东西是否等同,这个适用于任何类别的对象
    contains是是否包含的意思,那肯定.左边的对象是一个容器了
    String现在也有一个contains,那是因为String是一个字符的容器
    equals只能判断两个变量的值是否相等。
    contains常用与集合中判断某个对象是否含有这个元素

     l

    List集合判断元素是否相同,依据的元素的equals方法

    频繁的增删操作是LinkedList

    Set:元素师无序的(存入和取出的顺序不一定一致),元素不可以重复

    Set集合的功能和Collection是一致的

     ------HashSet:底层数据结构是哈希表

                是如何保证元素的唯一性的呢?

                是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true,如果元素的HashCode的值不相同,不会调用equals

     ------TreeSet:

     

     

     

  • 相关阅读:
    Android Studio开发JNIproject
    POJ 3006 Dirichlet&#39;s Theorem on Arithmetic Progressions 快筛质数
    ZooKeeper是什么?
    android学习记录(十三)Task 和 Activity 回退栈操作。
    Java程序员的日常—— IOUtils总结
    sql基础知识:分页+排序
    Elasticsearch推荐插件篇(head,sense,marvel)
    sql基础知识:日期的常用用法
    [大数据之Spark]——Actions算子操作入门实例
    [大数据之Spark]——Transformations转换入门经典实例
  • 原文地址:https://www.cnblogs.com/sunxiaoyan/p/8647198.html
Copyright © 2011-2022 走看看