zoukankan      html  css  js  c++  java
  • 黑马程序员——集合框架知识点总结

    -*-*-------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------*-*-



    集合框架(集合类)
     java集合框架是指导java的集合类。
      为什么有那么多的集合类的容器呢?
    以为每一个容器对数据存储方式都有不同,这个存储方式叫做:数据结构。
    集合框架
     集合框架分为两大派系
     |--单列集合 Coloection 接口
         |--List 接口 有序的,可重复,可根据角标操作元素,特有遍历元素方式ListIterator提供双向遍历next() previous(),可删除、替换、增加元素  
        |--ArrayList  底层数据结构是数组,查询速度快,增删稍慢,线程不同步的,
         |--LinkedList 底层数据结构是链表,增删速度快,查询稍慢,线程不同步的
         |--Vector 底层数据结构是数组,增删查都稍慢,线程同步的,jdk1.0出现的,那时候还没有集合框架,后来被ArrayList取代
     |--Set 接口  无序的,不可重复,因为底层是一个Map集合,只使用了Map的key,要保证键的唯一性
        |--HashSet 底层数据结构是哈希表,线程不同步的,无序,高效,必须保证元素的唯一性,是通过调用hashCode和equals方法来判断元素是否相同的
         |--TreeSet 底层数据结构是二叉树,线程不同步的,特点就是可以对集合中的元素进行排序,前提是要指定排序规则,有两种方式
    1,让元素自身具备比较性,如果元素自身不具备比较性,可以让元素实现Comparable接口,并覆盖compareTo方法来指定比较规则
    2,如果元素具备的比较性并不是我们所需要的,可以自己定义一个比较器,实现Comparator接口,并覆盖compare方法来指定比较规则,通过构造函数传递给集合即可
    |--要迭代以上集合都是通过迭代器来完成的,通过调用iterator方法来返回一个迭代器Iterator(接口);通过这个迭代器来迭代元素

      |--双列集合 Map
            |--Hashtable 底层是哈希表结构,线程同步的,不可以存储null键null值,jdk1.0出现,后来被HashMap所替代,
    |--HashMap   底层的数据结构是哈希表,线程不同步的,可以存储null键null值,
    |--TreeMap   底层是二叉树数据结构,线程不同步,特点是可以对键进行排序,排序方式同TreeSet相同,
       |-- Map 集合和Collection的不同点是,Map集合一次是存一对元素,键值对形式(键和值存在着眏射关系),而Collection一次只存一个元素
    |-- Map 集合自身并没有迭代方法,但是可以通过keySet和entrySet方法来讲Map集合转换成Set集合在进行迭代,
       keySet返回的是集合中所有的键,在通过Map集合中的get(key)来获取对应的值,而entrySet方法返回的是Map.Entry这种数据类型,里面保存的是所有键值对的映射关系

    泛型:
    泛型其实就是为了限定集合中的输入类型,让编译器挡住程序的非法输入,避免了强制类型转换的问题
    泛型的上限 格式为<? extends T>表示输入的类型必须是T或者T的子类型
    泛型的下限 格式为<? super T>  表示输入的类型不许是T或者T的父类型


    Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则

    集合Collection接口基本操作:

    增加元素
    add(Object obj); 
    addAll(Collection c); 

    删除元素 
    remove(Object obj); 
    removeAll(Collection c); 

    求交集 
    retainAll(Collection c);  

    删除元素 
    remove(Object obj); 
    removeAll(Collection c); 

    求交集 
    retainAll(Collection c);  

    泛型:

    没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

    泛型的好处:
    在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。


    代码应用:

    package basic.method;
     
    import java.util.*;
    public class BasicMethodDemo {
        public static void main(String[] args) {
            //创建集合容器,使用ArrayList
            ArrayList al = new ArrayList();  //所有集合类都位于java.util包下
            ArrayList la = new ArrayList();
            //添加
            al.add("java01");
            al.add("java02");
            al.add("java03");
            al.add("java04");
             
            la.add("java01");
            la.add("java02");
            la.add("java03");
             
            //删除
    //      al.remove(1);
    //      al.remove("java3");
    //      al.removeAll(la);   //删除al中al和la公有的元素并保存于al中
    //      al.clear(); //清空容器
             
            //判断
    //      sop(al.contains("java05"));
    //      sop(al.contains(la));   //al中寻找la对象的引用,并非找对象中元素实体
    //      sop(al.isEmpty());  
             
            //获取长度
    //      sop(al.size());
    //      al.add(la); //删除al中的重复元素,并把la加到al剩下元素的后面
            al.add(1, la);  // 删除al中的重复元素,并把la加到al 剩下 元素的后面
            sop(al);
        }
        public static void sop(Object obj) {
            System.out.println(obj);
        }
    }

    编写一个类打印人员信息,按照加入人的姓名排序,不得有重复元素,代码实现:

    import java.util.*;
    class Person {
    	private String name;
    	private int age;
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	public boolean equals(Object obj) {
    		if(! (obj instanceof Person))
    			return false;
    		Person p = (Person)obj;
    		return this.name.equals(p.name) && this.age == age;
    	}
    	public String getName() {
    		return name;
    	}
    	public int getAge() {
    		return age;
    	}
    }
    public class SingleArrayList {
    	public static ArrayList<Person> singleP(ArrayList<Person> al) {
    		ArrayList<Person> temp = new ArrayList<Person>();
    		Iterator<Person> it = al.iterator();
    		while(it.hasNext()) {
    			Person p = (Person)it.next();
    			if(!(temp.contains(p)))
    				temp.add(p);
    		}
    		return temp;
    	}
    	public static void sop(Object obj) {
    		System.out.println(obj);
    	}
    	public static void main(String args[]) {
    		ArrayList<Person> al = new ArrayList<Person>();
    		al.add(new Person("张三01",20));
    		al.add(new Person("张三02",26));
    		al.add(new Person("张三03",22));
    		al.add(new Person("张三03",22));
    		al.add(new Person("张三01",20));
    		al.add(new Person("张三04",30));
    		al.add(new Person("张三01",20));
    		
    		al = singleP(al);
    		
    		for(Iterator<Person> it = al.iterator();it.hasNext();) {
    			Person p = (Person)it.next();
    			sop(p.getName()+"--"+p.getAge());
    		}	
    	}	
    }



    -*-*-------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------*-*-

    用心-细心-专心-决心 学习就像爬大山,一步一步向前走 -态度决定高度-
  • 相关阅读:
    CentOS7.6下安装qt-creator
    chromedriver下载地址
    selenium 基于Autolt工具对于Windows窗口上传文件操作
    Selenium+java
    jmeter删除历史打开的脚本记录
    echarts 各种特效图
    SpringBoot启动-问题解决:Could not locate executable nullinwinutils.exe in the Hadoop binaries
    pinyin4j
    JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法
    selenium自动化测试中升级chrome78版本带来的问题
  • 原文地址:https://www.cnblogs.com/xianyou-liang/p/8503368.html
Copyright © 2011-2022 走看看