集合 理论

集合

集合: 集合和数组不一样,数组的元素可以是基本数据类型,也可以是对象(实际上保存的是对象的引用变量)。
集合是只能存储对象(存储的也是对象的引用变量)。

Iterator

Iterator 隐藏了各种Collection实现类的底层细节。向应用程序提供了遍历集合的统一编程接口。
Iterator 接口中定义的方法:
​ + HasNext() 如果仍有元素可以迭代,则返回 true。
​ + next() 返回迭代的下一个元素
​ + remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

注意: Iterator 是依赖于集合存在的,离开和集合Iterator是没有什么用的。
在JDK1.2 之后使用迭代器替换了Enumeration.(添加remove()方法,修改方法名。)

	Collection collection = new ArrayList();
    	collection.add("Hello");
        collection.add(123);
        collection.add('s');
        collection.add(123.45);
       Iterator  it = collection.iterator();
       //hasNext()方法带有判断功能 所以使用while循环更方便。
       while(it.hasNext()){
       Object obj = it.next();
       System.out.println(onj);
       }

Collection

Collection是集合的根接口,存储数据,允许有重复的,不重复的。可以允许null元素,也有不允许null元素。
Collection还提供了一些操作集合的方法

  • add() 像集合中添加元素
    • addAll(Collection collection) 将传递的集合中所有元素添加到集合的末尾
    • size() 集合中元素的个数
    • remove() 移除元素
    • contains() 是否包含某个元素
    • clear() 清除集合中的元素
    • isEmpty() 判断集合是否为空
    • equals() 判断集合对象是否想到
    • hashCode() 返回集合的哈希码
    • iterator() 返回集合的迭代器

List

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。此集合允许有重复的元素(equals()判断相等的对象),允许有多个null元素。

List集合在Collection集合接口提供的方法之上,添加了一些其他的方法:

+ get() 通过下标访问集合元素
+ indexOf() 返回元素在集合中第一次出现的索引。
+ lastIndexOf() 返回元素在集合中最后一次出现的索引。
+ listIterator() 返回list集合的列表迭代器。
+ set(int index,Element e) 替换下标为的元素
+ subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

List集合的四种遍历方式:

	List list = new ArrayList();
        list.add("HelloWorld");
        list.add(123);
        list.add('a');
        list.add(1234.44);
        list.add(new Object());
    //普通for循环遍历
    for(int i =0;i<list.size();i++){
    	System.out.println(list.get(i));
    }
    //增强for循环
    for(Object obj : list){
    System.out.println(obj);
    }
    //iterator 迭代器遍历
      Iterator  it = collection.iterator();
       //hasNext()方法带有判断功能 所以使用while循环更方便。
       while(it.hasNext()){
       Object obj = it.next();
       System.out.println(onj);
       }
       //listIterator 遍历
        ListIterator  it = collection.listIterator();
       //hasNext()方法带有判断功能 所以使用while循环更方便。
       while(it.hasNext()){
       Object obj = it.next();
       System.out.println(onj);
       }
ArrayList

List 接口的大小可变数组的实现。底层是数组结构

ArrayList的特点:

+ 底层是数组结构
+ 有序的列表,如何添加的顺序,如何获取
+ 线程不安全,不同步
+ 增删慢,查询快
+ 允许元素重复,允许多个null元素

ArrayList list = new ArrayList();
		list.add("HelloWorld");
        list.add(123);
        list.add('a');
        list.add(1234.44);
        list.add(new Object());
        //["HelloWorld",123,'a',123.44,java.lang.Object@23e4e5]
     System.out.println(list);
     for(Object obj : list){
     System.out.println(obj);
     }

//使用remove方法一处元素

 ListIterator  it = list.listIterator();
       //hasNext()方法带有判断功能 所以使用while循环更方便。
       while(it.hasNext()){
       Object obj = it.next();
       //使用集合对象移除元素会发生:ConcurrentModificationException 并发修改异常 不能同时对集合元素操作
		//list.remove();
        //使用迭代器来进行移除元素,同一个对象进行操作就可以
        it.remove();
       System.out.println(onj);
       }
泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)

	ArrayList <Object> list = new ArrayList<Object>();
		list.add("HelloWorld");
        list.add(123);
        list.add('a');
        list.add(1234.44);
        list.add(new Object());
        //["HelloWorld",123,'a',123.44,java.lang.Object@23e4e5]
     System.out.println(list);
     for(Object obj : list){
     System.out.println(obj);
     }

     //添加泛型以后再添加其他数据类型的数据就会出现错误
     ArrayList<String> list = new ArrayList<String>();
     	list.add("HelloWolrd");
        list.add("admin");
        list.add("joke");
        list.add("Java");

        //迭代器没有添加泛型 取出的元素就是Object 在使用时就要强转。
          Iterator it = list.iterator();
       		 while(it.hasNext()){
       		 String ss = (String)it.next();
       		 System.out.println(ss);
        }

        //增强for循环遍历
        for(String str : list){
        	System.out.println(str);
        }

        //迭代器遍历  迭代器指定泛型
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
        String ss = it.next();
        System.out.println(ss);
        }

 			//添加自定义类的对象
			ArrayList<Person> list = new ArrayList<Person>();
				list.add(new Person(12,"admin"));
				list.add(new Person(23,"java"));
                list.add(new Person(44,"joke"));
                //增强for循环
            for(Person person : list){
            System.out.println(person);
            }
            //迭代器遍历
            Iterator<Person> it = list.iterator();
            while(it.hasNext()){
            Person pserson = it.next();
            System.out.println(person);
            }
LinkedList

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

  • 底层的数据结构是链表
  • 线程不安全的,不是同步的
  • 增删快,查询慢。
  • 有序的链表,怎么添加,怎么取出

LinkedList 的特点:

LinkedList<String> list = new LinkedList<String>();
        list.add("HelloWorld");
        list.add("Java");
        list.add("admin");
        list.add("joke");
//["HelloWorld","Java","admin","joke"]
System.out.println(list);
// 普通for循环遍历
for(int i =0;i<list.size();i++){
	System.out.println(list.get(i));
}

Set

Set集合特点

  1. 输出值无序的(存储和读取的顺序不一样)
  2. 不允许重复,要求元素唯一。
  3. 没有索引
  4. add:方法 添加元素
         public boolean add(E e) {
                return map.put(e, PRESENT)==null;
            }

HashSet

底层是哈希表:实际上是一个 HashMap 实例
无序的。
不允许元素重复,
最多只有一个null值。
不是同步的。不安全。

	public class SetTest {//创建集合对象
    public static void main(String[] args) {
        //method1();
        //method2();
    }
   public static  void method1(){
        Set<Person> set = new HashSet<Person>();
            set.add(new Person(12,"admin"));
            set.add(new Person(12,"admin"));
            set.add(new Person(12,"admin"));
            //[Person{age=12, name='admin'}, Person{age=12, name='admin'}, Person{age=12, name='admin'}]
         System.out.println(set.toString());
       //可以去除重复元素呀?为什么还是三个?怎么解决重复?
       //重写equals()  和 hashCode()
       //[Person{age=12, name='admin'}]
    }
    //几种遍历方式? 2种  增强for循环   迭代器
    public static  void method2(){
            Set<Integer>  set = new HashSet<Integer>();
                set.add(123);
                set.add(223);
                set.add(2323);
                set.add(26523);
        //为什么不行?
        /*for (int i = 0; i < set.size(); i++) {
            System.out.println(set.);
        } */
        for (Integer integer : set) {
            System.out.println(integer);
        }
        Iterator<Integer> iterator = set.iterator();
            while(iterator.hasNext()){
                //自动拆箱
                int num = iterator.next();
                System.out.println(num);
        }
    }
}

TreeSet

基于 TreeMap 的 NavigableSet 实现(二叉树)。使用元素的自然顺序对元素进行排序,
​ 或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
​ 1. 自然排序
​ Comparable
​ * 自定义类实现自然排序。
​ ​ 2.比较器排序
​ ​ TreeSet(Comparator<? super E> comparator)
​ 构造一个新的空 TreeSet,它根据指定比较器进行排序。
​ 匿名内部类实现。
​ ​ 原则:
​ ​ 使用排序的时候首先定义主要的规则。
​ ​ 然后再根据主规则定义其他的规则。

public class TreeSetTest {
    public static void main(String[] args) {
        //method1();
        method2();
    }
    public static  void  method1(){
        TreeSet<Person> treeSet =new TreeSet<>();
        treeSet.add(new Person(23,"admin"));
        treeSet.add(new Person(13,"joke"));
        treeSet.add(new Person(13,"set"));
        treeSet.add(new Person(35,"java"));
        treeSet.add(new Person(45,"java"));
        // com.hdrj.set.Person cannot be cast to java.lang.Comparable
        System.out.println(treeSet);
        主规则  按年龄
        //[Person{age=13, name='joke'}, Person{age=23, name='admin'},
        // Person{age=35, name='java'}, Person{age=45, name='java'}]
        //年龄相等看名字
         /*   [Person{age=13, name='joke'}, Person{age=13, name='set'}, Person{age=23, name='admin'},
            Person{age=35, name='java'}, Person{age=45, name='java'}]*/
    }
    //比较器排序
    public static void method2(){

        TreeSet<Student>  treeSet = new TreeSet<>(
                //匿名内部类
                new Comparator<Student>() {
                    @Override
                    public int compare(Student student1, Student student2) {
                        //  count
                        // address
                        //price
                        int num =  student1.getCount()-student2.getCount();
                        int num2 = num==0 ? student1.getAddress().compareTo(student2.getAddress()):num;
                        return num2==0? (int)(student1.getPrice()-student2.getPrice()):num2;
                    }
                }
        );
        treeSet.add(new Student(23,"西安",2200.00));
        treeSet.add(new Student(43,"北京",2200.00));
        treeSet.add(new Student(77,"上海",456.00));
        treeSet.add(new Student(89,"兰州",99.00));
        treeSet.add(new Student(23,"西安",333.00));
       //Student{count=23, address='西安', price=2200.0},
        System.out.println(treeSet);
    }
}

HashSet

底层是哈希表:事实上是一个HashMap实例

  • 无序的
  • 不允许重复
  • 最多只有一个null值
  • 不是同步的,不安全

TreeSet

基于TreeMap的NavigableSet实现(二叉树),使用元素的自然顺序对元素进行排序,或许根据创建set时提供的Comoarator进行排序,具体取决于使用的构造方法

1.自然排序

​ Comparable

​ 自定义类实现自然排序

2.比较器排序

​ TreeSet(Comparator<?super E>comparator)

​ 构造一个新的空TreeSet,它根据指定比较器进行排序。

​ 匿名内部类实现。‘

原则:

​ 使用排序的时候首先自定义主要的规则

​ 然后再根据主规则定义其他的规则

Map

将键映射到值得对象,一个映射不能包含重复得键

每一键最多只能映射到一个值

允许以键集,值集或键-值映射关系集得形式查看某个映射得内容

Set keySet() 获取键得Set视图

get(key)通过键获取值

values();获取键得Set视图

Set<Map.Entey<K,V>>entrySet();获取Map集合得键值对映射关系

Map集合的遍历方式;

常用的有俩种:

1.获取键的Set视图,在通过get(key)获取键对应的值

Set<Integer> set = map.keySet();
	Iterator<Integer> iterator = set.iterator();
		while(iterator.hasNext()){
            int key = iterator.next();
            String value = map.get(key);
            System.out.println(value);
		}

2.获取集合的键值映射关系视图Map.Entry<K,V>再通过

getKey()获取键,getValue()获取值

Set<Map.Entry<Integer,String>> set = map.entrySet();
	Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
	while(iterator.hasNext()){
        //键值映射关系
        Map.Entry<Integer,String> en = iterator.next();
        int key = en.getKey();
        String value = en.getValue();
      System.out.println("key=="+key+"----value="+value);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值