Java学习之路 —— 异常、集合、Stream

文章目录

  • 1. 异常
  • 2. 集合
    • 2.1 遍历
      • 2.1.1 迭代器
      • 2.1.2 增强for循环
      • 2.1.3 Lambda
    • 2.2 List
    • 2.3 Set
      • 2.3.1 HashSet
      • 2.3.2 LinkedHashSet
      • 2.3.3 TreeSet
    • 2.4 Map
  • 3. Stream

1. 异常

Exception:叫异常,是程序员可以捕捉的。异常又分为了2类:

  • 运行时异常:运行时出现的异常(数组索引越界),继承自RuntimeException
  • 编译时异常:编译阶段出现错误提醒(日期解析异常)

解决异常有2种方式:

  • 在方法上使用throws关键字,可以讲方法内部出现的异常跑出去给调用者处理
  • 捕获异常(try…catch)

自定义异常类

同样,也分为两大类,自定义运行时异常继承自RuntimeException;自定义编译时异常继承自Exception

// 继承自runtimeexception
public class AgeillegalRuntimeException extends RuntimeException{public AgeillegalRuntimeException() {}public AgeillegalRuntimeException(String message) {super(message);}
}
public class Main2 {public static void main(String[] args) {try {saveAge(160);System.out.println("底层执行成功");} catch (Exception e) {e.printStackTrace();System.out.println("底层出现了bug");}}public static void saveAge(int age) {if(age > 0 && age < 150)System.out.println("年龄成功保存: " + age);else {// 用一个异常对象封装这个问题// 抛出异常throw new AgeillegalRuntimeException("age is illegal, your age is " + age);}}
}

这里记得区分throws是用在方法上的,throw是用在函数体中的。

2. 集合

这一部分是重点内容,在学习的时候,最好搭配力扣食用,学以致用才能最好的掌握。

在Java中,集合分为了2大类,分别是Collection和Map,而Collection又分为了List和Set等。

  • List系列集合:添加的元素是有序、可重复、有索引
  • Set系列集合:添加的元素是无序、不重复、无索引
    • HashSet:无序、不重复、无索引(对应unordered_set)
    • LinkedHashSet:有序、不重复、无索引
    • TreeSet:按照大小默认升序排序、不重复、无索引(对应set)
      在这里插入图片描述
      由于Collection是相当于祖宗类,所以Collection有的一些方法,它的子类都有,比如isEmptyadd等等

2.1 遍历

2.1.1 迭代器

Java的迭代器主要有2个常用方法:

  • boolean hasNext():询问当前位置是否有元素存在
  • E next():获取当前位置的元素,并将迭代器对象指向下一个元素处
Iterator<Integer> it = c.iterator();while(it.hasNext()) {System.out.println(it.next());
}

2.1.2 增强for循环

这个就和C++11的for循环一样,很好理解,数组和集合都可以。

2.1.3 Lambda

JDK8开始有了Lambda,就有了这个遍历方式。用到的是forEach,但本质其实还是增强for循环。

public static void test2() {Collection<Integer> c = new ArrayList<>();c.add(1);c.add(2);c.add(3);c.add(5);c.forEach(System.out::println);}

2.2 List

List集合特点:有序、可重复、有索引

ArrayList和LinkList底层采用的数据结构不同,应用场景不同

  • ArrayList:C++的vector,动态数组,添加第一个元素时数组大小为10,后续1.5倍扩容
  • LinkList:C++的list,双向链表,不是连续存储的
    • LinkList有一些特有方法
    • 我们一般也是用LinkList来实现队列、栈的。
      在这里插入图片描述

2.3 Set

  • Set系列集合:添加的元素是无序、不重复、无索引
    • HashSet:无序、不重复、无索引(对应C++的unordered_set)
    • LinkedHashSet:有序、不重复、无索引
    • TreeSet:按照大小默认升序排序、不重复、无索引(对应C++的set)

无序说明不能通过get方法获取元素。


2.3.1 HashSet

JDK8之前,HashSet都是:数组 + 链表。

JDK8之后的HashSet是由:数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的
当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树。

2.3.2 LinkedHashSet

是由数组 + 链表(哈希冲突)+ 红黑树(链表修改)组成的
每个元素都额外多了一个双链表机制记录了他前后元素的位置。

相当于是LinkedList多了一个HashSet,LRU就是基于此。

2.3.3 TreeSet

是由红黑树实现的。

自定义排序,采用Lambda:

Set<Student> st = new TreeSet<>((o1, o2)->Double.compare(o1.height, o2.height));

2.4 Map

  • HashMap:无序、不重复、无索引(用的最多)(C++的unordere_map)
  • LinkedHashMap:有序、不重复、无索引
  • TreeMap:按照大小默认升序排序、不重复、无索引(C++的map)

关于用法,基本都和Set的差不多。
在这里插入图片描述
Map的遍历方式

// 1. 获取全部的键
for(String key : keys) {double val = map.get(key);System.out.println(key + "_____" + val);
}// 2. entrySet()获取键值对
Set<Map.Entry<String, Double>> set = map.entrySet();for(Map.Entry<String, Double> entry : set) {String key = entry.getKey();Double value = entry.getValue();System.out.println(key + "___" + value);
}
// 3, Lambda JDK8之后才有,非常简单,推荐使用
map.forEach((k, v) -> {System.out.println(k + "--" + v);
});

3. Stream

java.util.stream.*中,可以用于操作集合或者数组的数据。

优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更强大、更简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names, "jehan", "rio", "Kong", "keyl", "jiahan");List<String> list = new ArrayList<>();for(String name : names) {if(name.startsWith("j"))list.add(name);}System.out.println(list);// streamList<String> list2 = names.stream().filter(s -> s.startsWith("j")).filter(a -> a.length() == 5).collect(Collectors.toList());System.out.println(list2);}

Stream流代表以跳流水线,并能与数据源建立连接。通过调用流水线的各种方法对数据进行处理、计算。最后,将获取的结果进行遍历、统计、收集到一个集合中。

如何获取
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

pytorch框架学习(tensorboard的使用)

什么是tensorboard&#xff1f; tensorboard是一个可视化工具&#xff0c;它可以把训练过程中的数据变化以图像的形式绘制出来&#xff0c;或者记录训练过程中使用的图片 tensorboard的安装&#xff1a; 在pycharm的终端中输出安装命令后自动安装—— pip install tensorbo…

IP地址查询在社交行业中的崭新应用

在社交媒体蓬勃发展的今天&#xff0c;IP地址查询技术IP66_ip归属地在线查询_免费ip查询_ip精准定位平台正在成为社交行业中的一项强大工具。这项技术不仅为社交平台提供了更多个性化服务的可能&#xff0c;还在用户安全和内容管理等方面发挥了关键作用。本文将深入探讨IP地址查…

什么是集成测试?集成的方法有哪些?

前言 综合测试整合测试非常复杂&#xff0c;需要一些开发和逻辑技能。的确如此&#xff01;那么把这个测试整合到我们的测试策略中的目的是什么呢&#xff1f;这个问题我们先不着急回答&#xff0c;让我们一步步往下看你就知道了。 为什么要进行集成测试&#xff1f; 以下是一…

UE4动作游戏实例RPG Action解析四:装备系统

导语: 以加血道具为例,详细分析拆解ActionRPG的装备系统,包含装备系统需求和数据结构设计,以及实现 一、装备系统需求: 装备槽: 已获取装备和未获取装备: 当已经装备一个道具时,再次捡到道具,会把道具放在装备库,不会放在装备槽中, 当没有装备道具时,会拾取道具…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

别试错了,是该关注一下软件内在质量了

太多这种例子了&#xff0c;老板们早上出的新想法&#xff0c;恨不得第二天就能上线。。每个互联网公司都试图突破固定领地&#xff0c;不断地尝试新的业务&#xff0c;一旦发现不行&#xff0c;就立刻砍掉&#xff0c;名曰“试错”。 研发部门&#xff0c;为了应对压力&#…

vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

根据数据长度动态设定元素的animation 先看看效果&#xff0c;是一个纯原生div标签加上css实现的表格纵向滚动动画&#xff1a; 目录 根据数据长度动态设定元素的animationHTMLjs逻辑1、判断是数据长度是否达到滚动要求2、根据数据长度设置滚动速度 Demo完整代码 HTML 1、确…

【机试题】LazyIterator迭代器懒加载问题

将下面这个未完成的Java工具类补充完成&#xff0c;实现懒加载的功能&#xff0c;该类需要实现Iterable接口&#xff0c;能够遍历所有数据。具体要求如下&#xff1a; 工具类提供了一个ValueLoader接口&#xff0c;用于获取数据&#xff0c;其中ValueLoader的接口定义为&#x…

【Python】一文带你掌握数据容器之集合,字典

目录&#xff1a; 一、集合 思考&#xff1a;我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: &#xff08;1&#xff09;列表可修改、支持重复元素且有序 &#xff08;2&#xff09;元组、字符…

asp.net图书管理系统

asp.net图书管理系统 基本操作图书管理 读者管理 借书 修改资料 修改密码 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 图书管理 读者管理 借书 修改资料 修改…

JavaScript概述

一、JavaScript简介&#xff1a; JavaScript是互联网上流行的脚本语言&#xff0c;可用于HTML和web&#xff0c;可广泛应用于服务器、PC、笔记本、平板电脑和智能手机等设备。 JavaScript是一种轻量级的编程语言&#xff0c;可插入HTML页面的编程代码&#xff0c;插入HTML页面后…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的&#xff0c;但是一测试发现只有200M&#xff0c;把电信叼了过来&#xff0c; 一测试发现宽带没问题&#xff0c;网线正常&#xff0c;网卡正常&#xff0c;只有可能是路由器的问题了&#xff0c;尴尬了&#xff0c;赶紧给满意好评放他走。回头好好研究一…

Springboot项目返回数据统一封装

Springboot项目返回数据统一封装,支持swagger。 正常swagger会根据数据库表的注释显示对应的参数释义等。但当我们使用统一接口返回map时&#xff0c;部分注释等信息会被掩盖消失。在此提供三个java类即可满足统一封装返回接口&#xff0c;也可显示对应的swagger释义等。 1.Er…

包教包会:Mysql主从复制搭建

笑小枫的专属目录 一、无聊的理论知识1. 主从复制原理2. 主从复制的工作过程3. MySQL四种同步方式 二、docker下安装、启动mysql1. 安装主库2. 安装从库 三、配置Master(主)四、配置Slave(从)五、链接Master(主)和Slave(从)六、主从复制排错1. 错误&#xff1a;error connectin…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

linux 信号

信号的定义 在计算机科学中&#xff0c;信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制&#xff0c;用来提醒进程一个事件已经发生。当一个信号发送给一个进程&#xff0c;操作系统中断了进程正常的控制流程&#xff…

五、nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

自然语言处理(NLP)-spacy简介以及安装指南(语言库zh_core_web_sm)

spacy 简介 spacy 是 Python 自然语言处理软件包&#xff0c;可以对自然语言文本做词性分析、命名实体识别、依赖关系刻画&#xff0c;以及词嵌入向量的计算和可视化等。 1.安装 spacy 使用 “pip install spacy" 报错&#xff0c; 或者安装完 spacy&#xff0c;无法正…

【差旅游记】启程-新疆哈密(1)

哈喽&#xff0c;大家好&#xff0c;我是雷工。 最近有个新疆罗布泊的项目要去现场&#xff0c;领导安排我过去&#xff0c;这也算第一次到新疆&#xff0c;记录下去新疆的过程。 01、天有不测风云 本来预定的是11月2号石家庄飞成都&#xff0c;成都转机到哈密&#xff0c;但…