集合 - Collection - 数据结构

集合:

JavaSE学习笔记-0225-ArrayList+案例_面如激雷而心有平湖的博客-CSDN博客集合与数组类似,也是一种容器,用来装数据的。数组的特点:数组定义完成并启动后,类型确定,长度固定然而:在处理个数不确定且要进行增删数据操作的时候,使用数组是不太合适的。这时集合的优点体现了出来,启动后可大小动态变化,类型也可以不固定,适合个数不确定且要进行增删操作的场景,也有着丰富的API。ArrayList集合是集合的一种AL集合支持索引构造器:public ArrayList()使用集合名.add(任何元素,这里数字直接输入,字符单引号,字符串双引号);直接将其shttps://blog.csdn.net/Ponnny/article/details/123133670

和数组都是容器

数组的特点在于:定义完之后类型确定,长度固定;

集合是Java中一种存储对象的容器(只能存储引用类型,存储基础类型时可以使用包装类),大小类型都可以不固定。

包装类

集合的优势在于:方便进行元素的增删操作

集合分类:

Collection单列集合,每个元素只有一个值

Map双列集合,每个元素包含两个值(键值对)

Collection:

package ThecollectionUseing;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;

/**
 * 目标:明确Collcetion集合体系的特点
 * */
public class demo1 {
    public static void main(String[] args) {
        // 有序 可重复 有索引(List)
        //多态的形式
        Collection list = new ArrayList();
        list.add("Java");
        list.add("Java");
        list.add("Mybatis");
        list.add(23);
        list.add(23);
        list.add(false);
        System.out.println(list);
        /**
         * 结果:[Java, Java, Mybatis, 23, 23, false]
         * */

        //无序,不重复,无索引(Set)
        Collection list1 = new HashSet();
        list1.add("Java");
        list1.add("Java");
        list1.add("Mybatis");
        list1.add(23);
        list1.add(23);
        list1.add(false);
        System.out.println(list1);
        /**
         * 结果:[Java, false, 23, Mybatis]
         * 既不按照输入顺序,也不重复;
         * */

        //无序,不重复,无索引(Set)
        Collection list2 = new LinkedHashSet();
        list2.add("Java");
        list2.add("Java");
        list2.add("Mybatis");
        list2.add(23);
        list2.add(23);
        list2.add(false);
        System.out.println(list2);
        /**
         * 结果:[Java, Mybatis, 23, false]
         * 按照输入顺序,但不重复;
         * */

    }
}

常用API:

package ThecollectionUseing;

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

public class demo2 {
    public static void main(String[] args) {
        //0.新建集合对象:
        Collection<String> list = new ArrayList<>();
        //1.添加元素
        list.add("Java");
        list.add("Html");
        list.add("C");
        list.add("C++");
        list.add("C#");
        System.out.println(list.add("上面这行添加成功返回true"));
        System.out.println(list);
        //2.清空集合元素
//        list.clear();
//        System.out.println(list);
        //3.判断集合是否为空
        System.out.print(list.isEmpty());
        System.out.println("\t←这里为空显示返回true,不空为false");
        //4.获取集合大小
        System.out.print(list.size());
        System.out.println("\t←这里返回数字就是元素个数");
        //5.检索元素
        System.out.print(list.contains("Java"));
        System.out.println("\t←含有检索的元素返回true,否则返回false");
        //6.删除元素,若有多个元素则返回第一个
        System.out.print(list.remove("java"));
        System.out.println("\t←删除成功(含有该元素并删除)返回true,否则false");
        //7.把集合转成数组
        Object[] arrs = list.toArray();
        System.out.println(Arrays.toString(arrs));
        System.out.println("------------------扩展------------------");
        //8.全部添加,为一个集合添加另一个集合的全部元素,添加过后另一个集合不变
        Collection<String> c1 = new ArrayList<>();
        c1.add("one");
        c1.add("two");
        Collection<String> c2 = new ArrayList<>();
        c2.add("一");
        c2.add("二");
        c1.addAll(c2);
        System.out.println(c1);
        System.out.println(c2);
        
    }
}

遍历方式一:迭代器

package ThecollectionUseing;

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

public class demo3 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);
        //1.得到当前集合的迭代器对象:
        Iterator<String> it = lists.iterator();
        //给ele赋第一个元素的值
//        String ele = it.next();
//        System.out.println(ele);
//        //打印下一个元素
//        System.out.println(it.next());
//        System.out.println(it.next());
//        System.out.println(it.next());
        //2.定义循环遍历:
        while(it.hasNext()){
            //细节,不要写it.next(),而是用一个String类变量代指,方便多次调用
            String ele = it.next();
            //多次调用
            System.out.println(ele+"+"+ele+"=?");
        }

    }
}

遍历方式二:foreach循环

package ThecollectionUseing;

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

public class demo4foreach {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("one");
        lists.add("two");
        lists.add("three");
        lists.add("four");
        System.out.println(lists);

        //foreach遍历:
        for(String ele : lists){
            System.out.println(ele);
        }

        //数组也可以使用:
        double[] scores = {99.3, 78.3, 59.5};
        for (double score : scores) {
            //在这里更改数组数据时,只对循环内生效,for循环之外的数组并不会改变
            if(score==59.5){
                score = 100.0;
            }
            System.out.println(score);
        }
        //这里依然是59.5
        System.out.println(scores[2]);
    }
}

遍历方式三:lambda表达式

lists.forEach(s -> {
            System.out.println(s);
        });

使用Collection集合存储自定义类型的对象

案例:将三部电影存进集合中

package DefineNewClassAndReInColl;

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

public class TestDemo1 {
    public static void main(String[] args) {
        //1.定义一个电影类
        Collection<Movie> movies = new ArrayList<>();
        //2.添加对象
        movies.add(new Movie("《你好,李焕英》",9.5,"张小斐,贾玲,沈腾,陈赫"));
        movies.add(new Movie("《唐人街探案》",8.5,"王宝强,刘昊然,美女"));
        movies.add(new Movie("《刺杀小说家》",8.6,"雷佳音,杨幂"));
        //3.遍历集合中的每个电影对象(forEach的方式)
        for(Movie movie:movies){
            System.out.println("电影名:"+movie.getName());
            System.out.println("得分:"+movie.getScore());
            System.out.println("主演:"+movie.getActors()+"\n");
        }
        //3.这种方式也可以
        movies.forEach(s->{
            System.out.print("电影名:"+s.getName()+"\t");
            System.out.print("得分:"+s.getScore()+"\t");
            System.out.println("主演:"+s.getActors());
        });
    }
}

常见数据结构:

数据结构是计算机底层存储数据的方式,是指数据之间是以什么方式排列在一起的

通常情况下,精心选择数据结构可以带来更高的效率

常见的数据结构:

1.栈:

后进先出,先进后出。一端开口一端封闭。(类似于弹夹)

数据存入:压栈或者进栈;

数据离开:弹栈或者出栈;

2.队列:


先进先出,后进后出,单向流动。(类似于排队)

3.数组:

索引快,增删慢的数据类型

内存中的一块连续区域;

查询速度快:查詢數據通過地址值索引和定位,查詢任意數據耗時相同;

删除、添加元素效率低;

4.链表:

链表中的元素在内存中不连续,每个节点包括数据值下一个元素的地址

查询速度慢

增删相对快(但是很多情况下要先找到再增删)

单向链表:中间节点包括下一个节点地址

双向链表:中间节点既包括上一个节点地址也包括下一个节点地址(增删首尾节点元素速度快)

5.二叉树:
 

 二叉查找树:小的元素在左边,大的元素在右边,一样的不存

左子树所有值都小于根节点,右子树所有值都大于根节点

提高检索数据的性能

6.平衡二叉树:

二叉树存在问题:

如果一组数据已经按照顺序排好,存入二叉树,二叉树就成了链表。

所以我们希望这个树上的数据尽可能的平衡。

要求:任意节点左右两个子树高度差不超过1,任意节点左右两个字数都是一个平衡二叉树

7.红黑树:(基于红黑规则实现自平衡的排序二叉树)

不能两个红色相连。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值