javaSE第七章_<集合(1)>【泛型,collection,list】

总结

在这里插入图片描述

泛型

● 参数化类型,就是将类型由原来的具体的类型参数化。

package javaCollection;

import java.util.Date;

public class FanXing {
    /*
      泛型:参数化类型
            类型参数化
            type
     */
    public class Demo<T,E>{
        T name;
        E age;

        public T eat(T age){
            System.out.println(age);
            return null;
        }

        public void main(String[] args) {
            Demo<String,Integer> demo=new Demo();
                          demo.age=100;
        }
    }

    /*
    public static void main(String[] args) {
        //虽然可以使用Object表示任何的数据类型
        // 但实际操作时我们需要向下转型。带来不方便,不安全的隐患
        java.lang.Object[] objs={"a",new Date(),1,true};
        for(java.lang.Object obj:objs){
            //instanceof 左边对象是否为instanceof 右边类的实例
            if(obj instanceof String) {
                String s = (String) obj; //obj对象强制转换为String
                System.out.println(s.length());
            }
        }
    }*/
}

集合

概述: 集合/容器 类似于 数组 存储一组数据 空间连续 长度是固定的
java中为什么提供许多的集合类?

  • 1.数组长度不可变 实际中的数量是变化的.
  • 2.数据存储特征也不同 数据结构不同, 有的查询多,数组首选, 有的增删多 链表

集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中
集合体系:
在这里插入图片描述

Collection接口

定义了存取一组对象的方法,其子接口Set和List分别定义 了存储方式
● Set 中的数据对象没有顺序且不可以重复。
● List 中的数据对象有顺序且可以重复。

package javaCollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo1 {
    public static void main(String[] args) {
        /*
           Collection定义常用方法
           集合中只能存储引用类型
             int[] a={11,1}
             String[] string={};
         */
        //建议使用泛型明确数据类型
        Collection<Integer> c=new ArrayList();
                            int a=10;
                            c.add(10);
                            c.add(11);
                            c.add(a); //添加时会自动装箱
        //c.clear();
        //System.out.println(c.isEmpty()); //true 判断是否为空 为空-true 否则false
        System.out.println(c); //[]

        System.out.println(c.contains(11)); //[10, 11, 10]
        c.remove(11);
        System.out.println(c.size()); //2
        System.out.println(c);  //[10, 10]
    }
}

package javaCollection;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo2 {
    public static void main(String[] args) {
        Collection<Integer> c=new ArrayList<>();
                            c.add(1);
                            c.add(2);
                            c.add(3);
                            c.add(4);
        System.out.println(c); //[1, 2, 3, 4]

        Collection<Integer> c1=new ArrayList<>();
                            c1.add(4);
                            c1.add(5);
                            c1.add(6);
                            c1.add(7);
                            c.addAll(c1); //将c1集合元素添加到c中
        System.out.println(c.containsAll(c1)); //c里是否包含c元素 true
        System.out.println(c.removeAll(c1)); //删除指定集合中包含所有集合的元素
        System.out.println(c.retainAll(c1)); //保留两个集合中相同内容 c里移出c1 true
        System.out.println(c); //[1, 2, 3, 4, 4, 5, 6, 7] [1, 2, 3]
        System.out.println(c1); //[4, 5, 6, 7]
    }
}
package javaCollection;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo3 {
    public static void main(String[] args) {
        Collection<Integer> c=new ArrayList<>();
        c.add(1);
        c.add(2);
        c.add(3);
        c.add(4);
        //集合转数组
        /*Object[] objects=c.toArray();
        System.out.println(objects.length);*/
        Integer[] array=c.toArray(new Integer[c.size()]);
    }
}

List

List接口 继承Collection
有序的(按照插入元素的顺序排列),存储重复元素,值插入后会有索引,可以通过索引访问元素

  ArrayList
     底层是数组,查询块,从中间增删慢
  LinkList
     底层是双向链表,查询慢,从中间增删快
  Vector
     底层是数组,查询快,从中间增删慢,线程安全
ArrayList

实现了长度可变的数组,在内存中分配连续的空间。
ArrayList<String> list=new ArrayList<>();
匿名内部类 可以自己定义类,复制方法,接口实现
在这里插入图片描述ArrayList1:

package javaCollection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Predicate;

public class ArrayList1 {
    public static void main(String[] args) {
        /*
           ArrayList(); 默认不创建底层数组,当添加第一个元素时,创建一个长度为10的数组
           ArrayList(int length); 创建对象时,创建一个指定长度的数组
           ArrayList(Collection collection); 把一个实现了Collection接口的子类,构造成一个Arraylist

           add(E e)向列表末尾添加元素
           add(int index,E e)向指定位置添加元素
           add方法add方法底层数组扩容  当底层数组装满之后,会自动扩容为原来的1.5倍
		   public boolean add(E e) {
		        ensureCapacityInternal(size + 1);  // 检测是否还有位置
		        elementData[size++] = e;
		        return true;
		    }

		     if (minCapacity - elementData.length > 0)//判断是否可以放得下
                grow(minCapacity);扩容方法

		    private void grow(int minCapacity) {
		        // overflow-conscious code
		        int oldCapacity = elementData.length;
		        int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容1.5
		        if (newCapacity - minCapacity < 0)
		            newCapacity = minCapacity;
		        if (newCapacity - MAX_ARRAY_SIZE > 0) //判断数组索引是否大于Int的最大值
		            newCapacity = hugeCapacity(minCapacity);
		        // minCapacity is usually close to size, so this is a win:
		         *                            原数组              新长度
		        elementData = Arrays.copyOf(elementData, newCapacity);//进行数组赋值
		                           返回一个新数组
         */
        ArrayList<String> list=new ArrayList<>();
                          list.add("a"); //0="a" size=1
                          list.add("b");
                          list.add("c");
                          list.add(0,"x");
                          list.add("d");
                          list.add("e"); //0="a" 1="b" 2="c" 3="d" 4="e" size=5
        //[a,b,c,d,e,null,null,null,null,null]
                          list.add("e");
                          list.add("e");
                          list.add("e");
                          list.add("e");
                          list.add("e");
                          list.add("e");
                          /*
                            E elementData(int index){
                               return(E) elementData[index]
                            }
                           */
                  //System.out.println(list.get(2)); //查询快 直接返回指定位置的值 b
                  //System.out.println(list.remove(3)); //删除指定位置元素 c
                  System.out.println(list); //删除c之后输出的list [x, a, b, d, e, e, e, e, e, e, e]
        /*//条件删除
        list.removeIf(new Predicate<String>() { //new一个匿名内部类
            @Override
            public boolean test(String t) {
                return t.equals("e"); //条件满足删除元素
            }
        });*/
                          list.set(0,"w"); //替换指定位置的值 [w, a, b, c, d, e, e, e, e, e, e, e]
        System.out.println(list); //[x, a, b, d]


    }
}

FilterDemo:

package javaCollection;

import java.util.function.Predicate;

public class FilterDemo implements Predicate<String>{
    @Override
    public boolean test(String s) {
        return false;
    }
}

ArrayList2:

package javaCollection;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ArrayList2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>(7);
                          list.add("a");
                          list.add("b");
                          list.add("a");
                          list.add("c");
                          list.add("d");
                          list.add("e");
                          /*
                          list.sort(new Comparator<String>() { //排序 指定排序的规则
                              @Override
                              public int compare(String o1, String o2) {
                                  return o1.compareTo(o2);
                              }
                          });
                          System.out.println(list); //[a, a, b, c, d, e]
                          */
                           //匿名内部类可以自己定义类,复制方法,接口实现
                          //list.sort(new StringSort());

                          List<String> li=list.subList(0,4); //从原集合中复制一段返回新集合
                          System.out.println(list); //[a, a, b, c, d, e]
    }
}

StringSort:

package javaCollection;

import java.util.Comparator;

public class StringSort implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}

在这里插入图片描述
在这里插入图片描述


LinkList

底层双向链表

  • 传入一个索引,如果索引小于集合的一半,从头结点开始查找,知道找到这个位置的值
    如果大于一半,从尾结点开始查找,直到找到这个位置的值

LinkedList<String> list=new LinkedList<>();

package javaCollection;

import java.util.LinkedList;
public class LinkedList1 {
    public static void main(String[] args) {
        LinkedList<String> list=new LinkedList<>();
                           list.add("a");
                           list.add("b");
                           list.add("c");
                           list.add("d");
                           //list.remove(2); //[a, b, d] 移除第三个
        System.out.println(list.get(2)); //c
        System.out.println(list); //[a, b, c, d]
        /*  Node<E> node(int index) {
                // assert isElementIndex(index);
						        if (index < (size >> 1)) {
						            Node<E> x = first;
						            for (int i = 0; i < index; i++)
						                x = x.next;
						            return x;
						        } else {
						            Node<E> x = last;
						            for (int i = size - 1; i > index; i--)
						                x = x.prev;
						            return x;
						        }
						    }
                 传入一个索引,如果索引小于集合的一半,从头结点开始查找,知道找到这个位置的值
                            如果大于一半,从尾结点开始查找,直到找到这个位置的值
         */
    }
}

在这里插入图片描述


Vector

底层是数组 线程安全
public synchronized(同步锁) boolean add(E e)
Vector<String> v=new Vector<>();

package javaCollection;

import java.util.Vector;

public class VectorDemo {

    public static void main(String[] args) {
        Vector<String> v=new Vector<>();
                       v.add("a");
                       v.add("a");
                       v.add("b");
                       v.add("a");
                       v.add("a");
        System.out.println(v); //[a, a, b, a, a]
    }
        /*
		            底层也是数组 查询快,中间增删慢,是线程安全的
		      public synchronized(同步锁) boolean add(E e) {
			        modCount++;
			        ensureCapacityHelper(elementCount + 1);
			        elementData[elementCount++] = e;
			        return true;
			    }
		  */
}


list迭代

遍历:

  • 方式1: for循环遍历
    length(数组) length()(字符串) size()(集合)
    循环时允许删除元素,但是我们需要注意索引与集合长度之间的关系
  • 方式2:增强for循环
    循环时不允许删除元素
  • 方式3:迭代器遍历
    listIterator();只能用于list接口的集合
    ListIterator<Integer> lit=list.listIterator();
  • 方式4:Stream流遍历
    Stream s=list.stream();
package javaCollection;

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDiedai1 {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
                           list.add(1);
                           list.add(2);
                           list.add(3);
                           list.add(4);
                           list.add(5);
                           list.add(1);
        /* 遍历
           方式1: for循环 length(数组) length()(字符串) size()(集合)
            循环时允许删除元素,但是我们需要注意索引与集合长度之间的关系

           for(int i=0;i<list.size();i++){
             if(list.get(i)==1){
                 list.remove(i);
                 i--;
             }
            //System.out.println(list.get(i)); //1 2 3 4 5 1

        }
        System.out.println(list); //[2, 3, 4, 5]

         */
        /*
           方式2:增强for循环
           循环时不允许删除元素
           for(Integer item:list){
            if(item==1){
                list.remove(item);
            }
            System.out.println(item); //1 2 3 4 5 1
        }
         */
        /*
           方式3:迭代器遍历
         */
        Iterator<Integer> it= list.iterator();
             while (it.hasNext()){
                 //System.out.println(it.next()); //1 2 3 4 5 1
                 Integer item=it.next();
                 if(item==1){
                     it.remove();
                 }
             }
             System.out.println(list); //[2, 3, 4, 5]
    }
}

package javaCollection;

import java.util.ArrayList;
import java.util.ListIterator;
import java.util.stream.Stream;

public class ArrayListDiedai2 {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
                           list.add(1);
                           list.add(2);
                           list.add(3);
                           list.add(4);
                           list.add(5);
                           list.add(1);
        /*
           方式3:迭代器遍历
             listIterator();只能用于list接口的集合
         */
        /*
        ListIterator<Integer> lit=list.listIterator();
                   while (lit.hasNext()){
                       lit.next();
                       //lit.add(2); //[1, 2, 2, 2, 3, 2, 4, 2, 5, 2, 1, 2]
                       lit.remove(); //[]
                       //System.out.println(lit.next()); //1 2 3 4 5 1/
                   }
        System.out.println(list); */

        //从指定位置开始 从后向前遍历 list.size()
        ListIterator<Integer> lit=list.listIterator(list.size());
             while (lit.hasPrevious()){
                 System.out.println(lit.previous()); //1 5 4 3 2 1
             }
        /*
        Stream<Integer> s=list.stream();
        s.forEach(t-> System.out.println(t)); //1 2 3 4 5 1

         */
    }
}

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值