当前位置: 首页 > news >正文

java-learn(9):常见算法,collection框架

常见算法

  • collection
    • 三种遍历的方式
      • 迭代器
      • 增强for循环
      • lambda表达式遍历
  • List集合
        • 五中遍历方法对比:
  • 数据结构
  • ArrayList集合
  • LinkedList集合
  • 泛型深入
  • set系列集合
  • hashset
  • linkedhashset
  • TreeSet
  • 综合案例,使用场景

collection

常用方法:
在这里插入图片描述

 Collection<String> cl = new ArrayList<>();//boolean add()cl.add("abc");cl.add("bbb");cl.add("ccc");System.out.println(cl);cl.remove("abc");System.out.println(cl);//size()System.out.println(cl.size());boolean result = cl.contains("abc");System.out.println(result);boolean result1 = cl.isEmpty();System.out.println(result1);cl.clear();System.out.println(cl);

三种遍历的方式

迭代器

迭代器的细节:
1.如果当前位置没有元素,还要进行获取,会报NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能使用集合的方法进行添加或者删除元素(如果实在要删除,只能使用迭代器的删除方法,添加还没有办法)

//获取迭代器对象Iterator<String> it = cl.iterator();//it.hasNext() 判断当前位置是否有元素while(it.hasNext()){//得到当前位置的元素String str = it.next();System.out.println(str);}

增强for循环

//语法
for(元素的数据类型 变量名:数组或者集合){}
// 修改增强for中的变量,不会改变集合中原本的数据
//但是如果是可变对象 修改对象的属性间接修改对象的内容

lambda表达式遍历

 coll.add("abc");coll.add("bcd");coll.add("fedg");//匿名内部类 coll.forEach(new Consumer<String>(){@Overridepublic void accept(String s){System.out.println(s);} });//lambda表达式coll.forEach(s->System.out.println(s));

三种表达式的使用场景:
当需要遍历删除元素时,可以使用迭代器的方式,当只需要遍历时,可以使用增加for循环,lambda表达式

List集合

在这里插入图片描述

        list.add(1);list.add(2);list.add(3);System.out.println(list);//当方法重载时,优先调用实参更形参类型完全一致的那个方法list.remove(1);Integer i = Integer.valueOf(1);list.remove(i);System.out.println(list);
五中遍历方法对比:

迭代器遍历:删除元素
列表迭代器:需要添加元素,修改元素,删除元素
普通for遍历:需要使用到索引
增强for循环,lambda表达式遍历:只需要遍历,书写方式简单

 //列表迭代器ListIterator<Integer> it1 = list.listIterator();
while(it1.hasNext()){Integer num = it1.next();if(num == 1){//迭代器添加元素是添加到当前位置的后一个位置,并指向添加后的那个元素it1.add(100);}else if(num == 10){//修改元素it1.set(1000);}if(num == 100){//删除元素it1.remove();System.out.println("遍历到了");}}

数据结构

ArrayList集合

在创建一个ArrayList的对象时,底层初始化的容量为0,当添加第一个元素的时候会进行扩容为10
在后面 如果容量不够会自动扩容为当前容量的1.5倍
但是还有就是可能会用到addAll去添加一个集合中的所有元素,这个时候就可能扩容1.5倍之后还不够,这个时候就会扩容为当前需要的容量

LinkedList集合

相当于双向连链表
在这里插入图片描述

泛型深入

在jdk5之前是没有泛型的,所有任意数据类型都可以存入到集合中,当遍历集合时,只能用object接受,但是这个不能使用子类特有的方法。在推出泛型之后,在指定的存入的数据类型之后就只能存入那种数据类型,避免了强制类型转化可能出现的异常

在指定泛型的具体类型之后,可以传入他对应的子类或者实现类的类型
没有指定泛型的时候,默认是object类型
泛型中不能写基本数据类型

泛型类:语法:
访问权限 class 类名<泛型>{}如果不知道类型 可以默认设置一个为E
泛型方法:
修饰符<类型>返回值类型 方法名(类型 变量名){}
例子:
public static<T> boolean addAll(ArrayList<T> list){};
泛型接口:
写法和泛型类一样泛型接口的使用:
1.实现类给出具体的类型
2.实现类延续泛型,创建对象时再确定泛型

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

package Mycollection;import java.util.ArrayList;public class demo7 {public static void main(String[] args) {//泛型不能继承,但是数据可以继承ArrayList<Ye> list = new ArrayList<>();Fu f = new Fu();list.add(f);method(list);}//?也表示不确定的类型// 在不确定需要传入的数据类型时,可以使用泛型类,泛型接口,泛型方法// 如果类型不确定,但是知道具体的继承体系,就可与使用泛型的通配符// 通配符: 可以限定类型的范围 如果是? super E的话 就能传入当前类型以及他的父类// 如果是? extends E的话,只能传入当前类或者他的子类public static void method(ArrayList<? super Ye> t){}}class Ye{}class Fu extends Ye{}class Zi extends Fu{}

set系列集合

在这里插入图片描述

Set<String> myset = new HashSet<>();myset.add("abcd");myset.add("bbb");myset.add("ccc");myset.add("ooo");System.out.println(myset.add("acbd"));System.out.println(myset.add("acbd"));// 增强for循环遍历for(String s : myset){System.out.println(s);}// containsSystem.out.println(myset.contains("acbd"));// removeSystem.out.println(myset.remove("acbd"));System.out.println(myset.size());System.out.println(myset);System.out.println(myset);// 迭代器的遍历Iterator<String> it = myset.iterator();while(it.hasNext()){String s = it.next();System.out.println(s);}//lambda表达式myset.forEach(new Consumer<String>(){@Overridepublic void accept(String s){System.out.println(s);}});//简略版myset.forEach(s-> System.out.println(s));myset.forEach(System.out::println);

hashset

数组+链表+红黑树
hashSet底层原理:
在jdk8之后,当链表长度大于八,而且数组长度等于64时,自动转化为红黑树
如果集合中储存的是自定义对象,必须重写hashCode和equals方法,重写hashCode是为了用对象的属性值去进行计算哈希值,重写equals是为了用对象的属性值进行比较。

linkedhashset

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

TreeSet

TreeSet的特点:可以排序,无索引,不重复
如果是String,Integer默认是从小到大排序
如果是自定义类型 需要重写compareTo方法
第一种比较方式

 @Overridepublic int compareTo(Student o) {//o代表的是已经存入到红黑树中的元素//结果返回负数代表需要存储在o的左边//为正数代表需要存入到o的右边//为0的话就代表有相同的对象,就不会存入到红黑树中return this.getAge() - o.getAge();}

第二种比较方式

  //比较器排序TreeSet<String> t = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int temp = o1.length() - o2.length();return temp == 0 ? o1.compareTo(o2) : temp;}});t.add("a");t.add("bc");t.add("ff");t.add("jfjf");System.out.println(t);

在这里插入图片描述

综合案例,使用场景

在这里插入图片描述

http://www.dtcms.com/a/561383.html

相关文章:

  • 海口网站建设维护网校 039 网站建设多少钱
  • 网站建设的频道是什么济南企业网站制作费用
  • 外卖餐饮小程序带商城系统餐桌预定点餐寄存排队等待在线点单程序
  • 广州市公司网站建设价格wordpress播放音乐
  • Onnxruntime源码解析
  • Typescript - type 类型别名(通俗易懂教程)
  • 专业建站lhznkj挂机宝做网站
  • 单位网站建设 管理制度wordpress中文视频插件下载
  • 【ComfyUI】混元3D 2.0 Turbo 多视图生成模型
  • 【SAM】eval_coco.py说明
  • 阜宁网站制作具体报价手机端网页设计尺寸规范
  • 青岛做网站和小程序的公司大连长建个人主页
  • [MySQL] JDBC
  • 从零开始学习Redis(六):Redis最佳实践(使用经验总结)
  • 秦皇岛建设网站西安百度seo代理
  • 备案 几个网站职业生涯规划
  • Ruby CGI Cookie 使用指南
  • 网站建设重要意义西部数码做跳转网站
  • X-plore安卓版(安卓手机文件管理器)
  • 【自然语言处理】基于生成式语言模型GPT
  • 广州网站建设方案案例用ps做网站画布一般建多大
  • 兰州网站搜索排名中国苏州网站
  • 【第二十周】自然语言处理的学习笔记05
  • 集成测试的分类
  • 上海网站建设百度推广公司wordpress 暂停前台访问
  • 微信网站建设哪家好企业网站分类举例
  • PyTorch 中 model.eval() 的使用与作用详解
  • Linux文件搜索:grep、find命令实战应用(附案例)
  • 搞一个卖东西的网站怎么做企业形象设计英文
  • WebStorm Deployment 实战:一键实时同步到腾讯云 ECS