Java- 集合

集合
    概念:
        集合是与数组类似,也是一种容器,用于装数据的。
        数组的特点:
            数组定义完成并启动后,类型确定、长度固定。
            问题:在个数不能确定,且要进行增删改查数据操作的时候,数组是不太合适的。
        集合的特点:
            集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
            集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
            集合提供了许多丰富、好用的功能,而数组的功能很单一。
    集合类体系结构
        集合
            Collection
                单列集合
                    每个元素(数据)只包含一个值。
                        Collection集合体系
                            Collection:集合祖宗接口
                                list接口
                                    ArrayList
                                    LinkedList 
                                Set接口
                                    HashSet
                                        LinkedHashSet
                                    TreeSet
                            Collection集合特点:
                                List系列集合:添加的元素是有序、可重复、有索引。
                                    ArrayList、LinekdList:有序、可重复、有索引
                                Set系列集合:添加的是无序、不重复、无索引。
                                    HashSet:无序、不重复、无索引
                                    LinkedHashSet:有序、不重复、无索引
                                    TreeSet:按照大小的默认升序排序、不重复、无索引。
            Map
                双列集合
                    每个元素包含两个值(键值对)。
        集合对于泛型的支持:
            集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型。
                Collection<String>list = new ArrayList<String>();
Collection<String>list = new ArrayList<>();//JDK1.7开始后面的泛型类型申明可以省略不写。 
            注意: 集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。(也可称为对象容器)
                如果集合中要存储基本类型的数据怎么办?
                    存储基本类型使用包装类
Collection<Integer> list = new ArrayList<>();
Collection<Double> list = new ArrayList<>();
Collection<String> list = new ArrayList<>();
        Collection集合常用API
            Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
            Collection API如下:
                方法名称
                    说明
                public boolean add(E e)
                    把给定的对象添加到当前集合中
                public void clear()
                    清空集合中所有的元素
                public boolean remove(E e)
                    把给定的对象在当前集合中删除
                public boolean  contains(Object obj)
                    判断当前集合中是否包含给定的对象
                public boolean isEmpty()
                    判断当前集合是否为空
                public int size()
                    返回集合中元素的个数
                public Object [] toArray()
                    把集合中的元素,存储到数组中
            Collection集合的遍历方式:
                方式一:迭代器
                    概述:
                        迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式。
                    Collection集合获取迭代器
                        方法名称
Iterator<E> iterator()
                            说明
返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0 索引
                        Iterator中的常用方法
                            boolean hasNext()
                                询问当前位置是否有元素存在,存在返回true,不存在返回false
                            E next()
                                获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。
                        总结:
                            1.迭代器的默认位置在哪里?
                                Iterator<E> iterator(): 得到迭代器对象,默认指向当前集合的索引0
                            2.迭代器如果取元素越界会出现 NOSuchElementException异常。
                方式二:foreach/增强for循环
                    概述:
                        既可以遍历集合也可以遍历数组。
                        JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。
                        实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了Iterable接口。
                    格式:
                        for(元素数据类型  变量名 : 数组或者Collection集合){
    //在此处使用变量即可,该变量就是元素
}
                            Collection<String> list2 = new ArrayList<>();
        list2.add("小明");
        list2.add("小王");
        list2.add("小花");
        list2.add("小草");
        System.out.println(list2);

        for(String s : list2){
            System.out.println(s);
                                double [] scores = {100,56,67,78,89,49};
        for (double score : scores) {
            System.out.println(score);
                方式三:
                    lambda表达式
        ArrayList集合
            概念:
                ArrayList是集合中的一种,它支持索引。(暂时先学习这个,后期学习整个集合体系)
                面试:ArrayList底层是一个数组;这个数组初始化容量是10;如果数据的添加超过10,会进行自动扩容,底层代码是一个叫grod的方法在进行扩容,新数组扩容是原来容量的1.5倍。右移几位表示除以2的几次方(备注:JDK8对ArrayList无参构造方法进行了改进是一个空的数组,不再是直接将数组的长度赋值为10;因为这种方式有可能浪费空间,改变为当第一次去添加数组的时候才将数组长度赋值为10)
                    ArrayList特征:
增删慢:
1.可能会涉及到数组的扩容,需要牵扯到数组的复制。
2.增加一个数据或者删除一个数据,牵涉到数组的右移或者左移。
查询快:【底层】
用索引进行查询底层是数组,一般使用数组名字 + 索引进行直接定位(类似于书的目录)  时间复杂度是1;一次就可以吧某一个元素给查询出来
            ArrayList类是如何创建集合对象的?
                ArrayList  a = new ArrayList(); 
            ArrayList集合的对象获取
                构造器
                    public ArrayList()
                说明:
                    创建一个空的集合对象
            ArrayList集合添加元素的方法
                1.将指定的元素追加到此集合的末尾
                    public boolean add(E e)
                2.在此集合中的指定位置插入指定的元素
                    public void add(int index , E element)
                3. 获取某个索引位置处的元素值
                    public E get(int index)
                4. 获取集合的大小(元素个数)
                    public int size()
                5. 完成集合遍历
                    见代码
                6.删除某个索引位置处的元素值,并返回被删除的元素值
                    public E remove(int index)
                7.直接删除元素值,删除成功返回true;删除失败返回false
                    public boolean remove(Object o)
                8.修改某个索引位置处的元素值
                    public E set(int index, E element)
                代码演示:
                    //目标:掌握ArrayList集合的常用API
public class Test3 {
    public static void main(String[] args) {
        ArrayList<String>list = new ArrayList<>();
        list.add("JAVA");
        list.add("JAVA");
        list.add("MySQL");
        list.add("MyBatis");
        list.add("HTML");

       //1.public E get(int index):获取某个索引位置处的元素值
//        String e =list.get(3);
//        System.out.println(e);//获取索引为3的元素 MyBatis
//        System.out.println(list.get(3));//打印索引为3的元素 MyBatis

//     //2.public int size();获取集合的大小(元素个数)
//        System.out.println(list.size());//5

       //3.完成集合遍历
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println(list.get(i));
//        }

        //4.public E remove(int index):删除某个索引位置处的元素值,并返回被删除的元素值
//         System.out.println(list);// [JAVA, JAVA, MySQL, MyBatis, HTML]
//         //list.remove(2);//删除MySQL这个元素
//         String e2 =list.remove(2);//声明变量接收被删除的元素值
//         System.out.println(e2);//MySQL
//         System.out.println(list); //[JAVA, JAVA, MyBatis, HTML]

       //5.public boolean remove(Object o):直接删除元素值,删除成功返回true;删除失败返回false
                 //测试删除MyBatis
//        System.out.println(list.remove("MyBatis")); //返回值 true
//        System.out.println(list);//[JAVA, JAVA, HTML]
//                //当前集合里面有2个JAVA
//        list.remove("JAVA");//元素重复的情况下,默认删除前面的那个,后面的不删除
//        System.out.println(list);//[JAVA, HTML]

       //6.public E set(int index, E element):修改某个索引位置处的元素值。
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("小明");
        list1.add("小明");
        list1.add("Java");
        list1.add("Java");
        String e2 = list1.set(1,"小米");
        System.out.println(e2);//返回被修改的元素 小明
        System.out.println(list1);//[小明, 小米, Java, Java]
    }
                        案例:
                            public class Test4 {
    /**
     *    案例: 遍历并删除元素值
     *    需求:某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100
     *    现在需要先把成绩低于80分以下的数据去掉。
     *
     *    分析:定义ArrayList几个存储多名学员的成绩。
     *    遍历集合每个元素,如果元素值低于80分,去掉它。
     */
    public static void main(String[] args) {
        ArrayList<Integer> scores = new ArrayList<>();
        scores.add(98);
        scores.add(77);
        scores.add(66);
        scores.add(89);
        scores.add(79);
        scores.add(50);
        scores.add(100);
        System.out.println(scores);

//        //bug写法 逻辑没错  结果出错
//        for (int i = 0; i < scores.size(); i++) {
//            int score = scores.get(i);
//            if(score < 80 ){
//                scores.remove(i);
//            }
//        }
//        System.out.println(scores);

        for (int i = scores.size() -1; i > 0 ; i--) {
            int score = scores.get(i);
            if(score < 80 ){
               scores.remove(i);
            }
        }
        System.out.println(scores);
    }
}
            LinkedList集合(开发不用,面试问)
                概念:
                    LinkedList 底层是双向链表,并且实现了一个接口队列(先进先出)
    查找慢:因为底层是采用的二分法查找的算法  时间复杂度是n/2   不是一下就找到的
    增删快:直接找到要插入的前置节点和后置节点,来进行插入或删除,其他元素不用
    和ArrayList刚好相反
                    在需要遍历LinkedList结构的时候,不要使用for循环用get来获取元素,因为每次获取一个对应的元素,都需要找到它相邻的那个元素,以此类推。
            LinkedList和ArrayList的区别:
                1.数据结构不同
                    ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
                2.效率不同
                    当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
                3.自由性不同
                    ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
                4.主要控件开销不同
                    ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。
        Vector集合
            概念:
                也属于一个集合,同样是List的实现类,和ArrayList结构方法等 都一致。
            Vector和ArrayList的区别:
                相同点:都属于集合,都实现List接口;有序的 可以重复;基于Object数据的。
                不同点:
1.Vector是线程安全的;ArrayList是非线程安全的。
2.ArrayList是在JDK8进行改性后不再是调用无参构造就初始化容量,而是在第一次添加数据的时候;Vector是只要调用无参构造,就初始化10个容量。
3.ArrayList扩容是原来的1.5倍,Vector是2倍。
4.Vector从JDK1.0就存在,ArrayList是从JDK1.2。


 Set 集合:无序 不可重复 

引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。

如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true

该集合中没有特有的方法,直接继承自Collection。

 Map集合:V put(K key, V value)

向map集合中添加Key为key,Value为value的元素,当添加成功时返回null,否则返回value。

就是说Map集合中的Key是不能重复的,这就类似于Set集合中元素不能重复,但是Map集合中的Value是可以重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值