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.hqwc.cn/news/177577.html

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

相关文章

吊椅在欧盟做EN581报告认证

什么是EN 581标准&#xff1f; EN 581标准是欧洲标准化委员会制定的关于户外家具机械物理性能要求的标准。该标准主要涉及耐候性、抗静态载荷、耐磨性、抗腐蚀性等方面的要求。 5.2 如何提高家具的抗静态载荷性能&#xff1f; 提高家具的抗静态载荷性能可以通过增加家具结构的…

无烟火焰:探索酒精壁炉的魅力

随着技术的不断发展&#xff0c;现代生活的很多方面都发生了变化&#xff0c;包括我们如何取暖和装饰我们的家。酒精壁炉是一个迅速崭露头角的家居装饰方式&#xff0c;为家庭带来了一种别具一格的现代化火焰体验。 过去&#xff0c;我们可能依赖于传统的木材壁炉或煤气取暖系统…

.pcd文件格式

更详细的格式介绍可以查看我的这篇博客 『Open3D』安装与点云格式通识_open3d安装_NNNNNathan的博客-CSDN博客文章浏览阅读1.9k次。介绍了open3d的安装和当前适用与存储点云信息的文件格式&#xff0c;并详细介绍了pcd与ply两种格式。_open3d安装https://blog.csdn.net/qq_413…

职场新人,如何提高自我管理能力?

作为职场新人&#xff0c;一定要学会个人管理。 入职三个月多&#xff0c;我总结了一个经验&#xff0c;作为职场新人&#xff0c;我越加觉得自我管理重要性。 在职场一个普遍的现象&#xff1a;在领导眼里&#xff0c;同样的问题在老职员身上不是问题&#xff0c;在新员工身…

CFCA国密证书

CFCA是中国金融认证中心的缩写&#xff0c;即China Financial Certification Authority。它是一家经过中国人民银行和国家信息安全机构批准成立的国家级权威安全认证机构&#xff0c;也是国际CA浏览器联盟组织&#xff08;CA/Browser Forum&#xff09;的成员&#xff0c;遵循全…

后端接口性能优化分析-数据库优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

智能财务管理,明细筛选一目了然,轻松掌握个人财务状况!

你是否曾经因为复杂的个人财务状况而感到困扰&#xff1f;你是否曾经因为无法快速筛选财务明细而感到烦恼&#xff1f;现在&#xff0c;我们为你带来了一款全新的智能财务管理工具&#xff0c;可以轻松解决你的这些问题&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账…

系统之家重装Win10系统教程图解

系统之家官网给用户们提供了不同品牌系统的下载&#xff0c;帮助更多的用户完成Win10系统的重新安装&#xff0c;从而解决自己Win10系统所遇到的问题。如果有用户不清楚详细的重装系统步骤&#xff0c;那么可以参考下面小编分享借助系统之家装机大师软件重装Win10系统教程图解介…

每天学习一点点之从 SonarQube Code Smell 看 Serializable

相关文章&#xff1a; 每天学习一点点之从 SonarQube Bug 看对线程中断异常的处理 昨天组内同学在进行代码合并的时候发现了一个 SonarQube 异常&#xff1a; 其实我之前也遇到过这个异常&#xff0c;但觉得“这种异常很无聊”&#xff0c;毕竟让 Spring Bean 去序列化&…

WebSocket网络协议

二十六、WebSocket 26.1 介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 HHTP协议和WebSocket协议对比&#xff…

Canvas—从入门到案例实现

文章目录 Canvas—从入门到案例实现一、设置canvas环境1.1 <canvas>元素1.2 渲染上下文context 二、形状与路径的绘制2.1 形状绘制2.2 路径绘制2.3 绘制一个笑脸 三、使用样式和颜色四、绘制文本五、使用图像5.1 图片源5.2 获取页面内的图片5.3 缩放Scaling5.4 切片Slici…

应急响应练习2

目录 1. 请提交攻击者的ip与系统版本 2. 攻击者通过某个组件漏洞获得服务器权限&#xff0c;请提交该组件的名称 3. 请提交攻击者首次攻击成功的时间 4. 请提交攻击者上传的webshell文件绝对路径 5. 请提交攻击者使用的webshell管理工具 6. 攻击者进一步留下的免杀的webs…