首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java集合:Collection接口

二、Collection 接口 Collection是一个高度封装的集合接口,它提供了所有集合要实现的默认方法接口。 我们看一下接口源码,了解它有哪些接口和默认实现。...jdk不对这个接口提供任何直接的实现,但是再一些直接子接口例如Set和List有实现了某些接口方法。...*如果集合保证是有序的,那么通过迭代器返回数组有相同顺序 *返回的数组是安全的,也就是说集合有自己的引用,数组开辟新的堆内存,也有自己的引用。...并且这个集合不允许null元素存在,那么抛出NullPointerException异常(可选的限制条件) */ boolean containsAll(Collection<?...当集合接口没有Object.hashCode方法的一般协议做任何规定,编程 *人员应该注意在重写equals方法时必须重写hashCode方法,以便满足一般协议这个 *Object.hashCode

41610
您找到你想要的搜索结果了吗?
是的
没有找到

在Java中如何优雅地判空

一般的,在面向对象语言中,对对象调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。 空对象模式的一种典型实现方式如下图所示(图片来自网络): ?...public interface Nullable { boolean isNull(); } 这个接口定义了业务对象的行为。...; } @Override public boolean isNull() { return false; } } 这是空对象原有对象的行为进行了空实现...其可以根据现有对象,便捷快速生成其空对象模式需要的组成成分,其包含功能如下: 分析所选类可声明为接口方法; 抽象出公有接口; 创建空对象,自动实现公有接口部分函数进行可为空声明; 可追加函数进行再次生成...对象,否则调用 Test的 getTest3方法; flatMap(Test3::getTest2)同上调用 Test3的 getTest2方法; map(Test2::getInfo)同 flatMap

1.4K31

是时候跟你的空指针说再见了

一般的,在面向对象语言中,对对象调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。 空对象模式的一种典型实现方式如下图所示(图片来自网络): ?...示例代码如下(命名来自网络,哈哈到底是有多懒): Nullable是空对象的相关操作接口,用于确定对象是否为空,因为在空对象模式中,对象为空会被包装成一个Object,成为Null Object,该对象会对原有对象的所有方法进行空实现...… public interface Nullable { boolean isNull(); } 这个接口定义了业务对象的行为。...; } @Override public boolean isNull() { return false; } } 这是空对象原有对象的行为进行了空实现...其可以根据现有对象,便捷快速生成其空对象模式需要的组成成分,其包含功能如下: 分析所选类可声明为接口方法; 抽象出公有接口; 创建空对象,自动实现公有接口部分函数进行可为空声明; 可追加函数进行再次生成

96830

是时候跟你的空指针说再见了

一般的,在面向对象语言中,对对象调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。 空对象模式的一种典型实现方式如下图所示(图片来自网络): ?...示例代码如下(命名来自网络,哈哈到底是有多懒): Nullable是空对象的相关操作接口,用于确定对象是否为空,因为在空对象模式中,对象为空会被包装成一个Object,成为Null Object,该对象会对原有对象的所有方法进行空实现...… public interface Nullable { boolean isNull(); } 这个接口定义了业务对象的行为。...; } @Override public boolean isNull() { return false; } } 这是空对象原有对象的行为进行了空实现...其可以根据现有对象,便捷快速生成其空对象模式需要的组成成分,其包含功能如下: 分析所选类可声明为接口方法; 抽象出公有接口; 创建空对象,自动实现公有接口部分函数进行可为空声明; 可追加函数进行再次生成

58620

从一个 NullPointerException 探究 Java 的自动装箱拆箱机制

test(value); } } main 方法里的代码实际上相当于调用 test(null);,为什么不直接这样写呢?...抛出问题 运行时提示 test(value); 这一行抛出 NullPointerException,但是看着以上代码会有些许困惑:以上代码里一个对象方法都没有调用啊,NullPointerException...基本数据类型 包装类型 装箱方法 拆箱方法 boolean Boolean Boolean.valueOf(boolean) Boolean.booleanValue() byte Byte Byte.valueOf...2.java.lang.NullPointerException 尝试一个值为 null 的包装类对象进行自动拆箱,就有可能造成 NullPointerException。...null : 1; // NullPointerException } } 这实际上还是一个值为 null 的 Long 类型进行自动拆箱,反汇编代码: Compiled from "Test.java

48720

在 Java 中如何优雅地判空

一般的,在面向对象语言中,对对象调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。   空对象模式的一种典型实现方式如下图所示(图片来自网络): ?...public interface Nullable { boolean isNull(); }   这个接口定义了业务对象的行为。...; } @Override public boolean isNull() { return false; } }   这是空对象原有对象的行为进行了空实现...,更具体的内容大家也可以多找一找资料,上述只是NullObject的简单介绍,但是,今天我要推荐的是一款协助判空的插件NR Null Object,让我们来优雅地进行判空,不再进行一顿操作来定义繁琐的空对象接口与空独享实现类...其可以根据现有对象,便捷快速生成其空对象模式需要的组成成分,其包含功能如下: 分析所选类可声明为接口方法; 抽象出公有接口; 创建空对象,自动实现公有接口部分函数进行可为空声明; 可追加函数进行再次生成

2.3K20

equals() ? ==? hashCode()? 今天就把你们都认识清楚

2.引用类型(类、接口、数组) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址, 对象是放在堆中的,栈中存放的是对象引用(地址)。...由此可见'=='在比较的对象引用类型时,是栈中的地址值进行比较的。...如果根据 equals(Object) 方法,两个对象是相等的,那么这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。...如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么这两个对象中的任一对象调用 hashCode 方法 不要求 一定生成不同的整数结果。...(例如,String类equals方法的重写就是逐个比较字符) 不重写的情况下,对象的equals方法 调用的是Object类中equals方法,在条件左边为Null时会报空指针,使用Objects.equals

42450

JUC线程池服务ExecutorService接口实现源码分析

首先,假设我们定义了一个动作函数式接口Action: // 带泛型的动作接口,可以返回一个泛型结果 public interface Action{ V doAction(); } 我们可以尝试实现一下...finishCompletion(); } } // 完成任务后的通知方法,最要作用是移除和唤醒所有的等待结果线程,调用钩子方法done()和设置任务实例callable为null...boolean runAndReset() { // 如果状态不为NEW(0)或者CAS(null,当前线程实例)更新runner-真正的执行Callable对象的线程实例失败,那么直接返回...set()方法,也就是没有调用finishCompletion()方法,它内部持有的Callable任务引用不会置为null,等待获取结果的线程集合也不会解除阻塞。...= null) { // 目标等待节点的线程引用置为空 node.thread = null; // 这里循环标记用于因为此方法执行的竞态条件需要重试的起点

63540

Java 8中 Optional 类源码实现与分析

Hoare选择null引用这种方式,“只是因为这种方法实现起来非常容易”。...虽然他的设计初衷就是要“通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的”,他还是决定为null引用开个绿灯,因为他认为这是为“不存在的值”建模最容易的方式。...主要是为了存在或缺失的变量值建模,这样一来,不管变量有没有值,都可以统一使用 Optional 来表示,它可以减少 null 值的判断逻辑,使得代码结构更加简单,同时也可以减少 NullPointerException...(5)map() map() 方法主要是 Optional 封装的值执行 mapping 函数,如果值存在,就该值执行提供的mapping函数调用,如果值不存在,则直接返回空的 Optional 对象...Optional 封装的值执行 mapping 函数,如果值存在,就该值执行提供的mapping函数调用,返回一个 Optional 类型的值,否则就返回一个空的 Optional 对象,其定义如下

6610

Java自动拆箱空指针异常,救火队员上线

接口返回的userId为null时,强转这块就抛出空指针异常: Exception in thread "main" java.lang.NullPointerException at com.choupangxia.box.BoxTest.main...原因分析 最初大家可能会疑惑,抛出异常的代码都没有对象方法调用,怎么会出现空指针呢? 这中间主要涉及到的就是一个自动拆箱操作。是否是拆箱导致的呢?我们来通过字节码看一下。...装箱时通常会调用包装类的valueOf方法,而拆箱时通常会调用包装类的xxxValue()方法,其中xxx为类似boolean/long/int等。...Integer value1 = (Integer) null; Double value2 = (Double) null; Boolean value3 = (Boolean) null; 答案:可以正常执行...在Java中null是一个特殊的值,可以赋值给任何引用类型,也可以转化为任何引用类型。

1.4K30

使用“空”对象替代引用是否为空判断

使用Null对象替代引用是否为空判断 编程语言中最常见运行时异常非NullPointerException莫属,只要程序依赖于外部的输入数据,比如说http请求传递的查询字符串参数、关系数据库连接、磁盘文件读取...比如说,原本我们调用一个方法,这个方法会执行连接数据库操作并返回一个数据库连接对象。...然而,由于某种原因导致连接失败,这个方法并没有照常返回数据库连接对象而是返回一个null值,当我们使用对象时假如不进行是否为空检测,程序就会抛出NullPointerException,但是假如进行检测的话代码又会变得极其丑陋...而且这种对象是否为空的判断还会传播,在一系列函数调用的过程中,其中某一个调用返回一个null值, 这个函数调用栈中所有的调用都有可能受到波及,直到最外层的调用。...继承来的IsNull方法,并返回为true,这种利用多态来面向接口编程的方式,正好满足了我们的需求。

7.6K80

ThreadPoolExecutor源码分析

Executor接口 public interface Executor { void execute(Runnable command); } Executor接口只有一个方法execute,...); return ftask; } 流程步骤如下 调用submit方法,传入Runnable或者Callable对象 判断传入的对象是否为null,为null则抛出异常,不为null继续流程...将传入的对象转换为RunnableFuture对象 执行execute方法,传入RunnableFuture对象 返回RunnableFuture对象 流程图如下 ?...下面是整个流程的详细步骤 调用execute方法,传入Runable对象 判断传入的对象是否为null,为null则抛出异常,不为null继续流程 获取当前线程池的状态和线程个数变量 判断当前线程数是否小于核心线程数...Worker对象 Worker是定义在ThreadPoolExecutor中的finnal类,其中继承了AbstractQueuedSynchronizer类和实现Runnable接口,其中的run方法如下

37010

高并发之——P8级别架构师带你深度解析线程池中那些重要的顶层接口和抽象类

AbstractExecutorService抽象类:派生自ExecutorService接口,实现了几个非常实现的方法,供子类进行调用。...无超时时间设置的invokeAll方法总体逻辑为:将所有任务封装成RunnableFuture对象调用execute方法执行任务,将返回的结果数据添加到futures集合,之后futures集合进行遍历判断...invokeAll方法调用Executor接口的execute方法来提交任务。...); return ftask; } 从源码中可以看出submit方法提交任务时,本质上还是调用的Executor接口的execute方法。...综上所述,在非定时任务类的线程池中提交任务时,本质上都是调用的Executor接口的execute方法。至于调用的是哪个具体实现类的execute方法,我们在后面的文章中深入分析。

47510

Java 多线程(7)----线程池(下)

在文章最后,我们还看了一下 Future 接口和其中对应的方法,如果你这些不熟悉,建议先去看一下上一篇文章。有了前面的知识作为基础之后,我们来正式看一下 Java 中的线程池。...这个就是本源接口了,这个接口就声明了一个 execute 方法,参数是一个 Runnable 对象,这个方法其实就是向线程池中提交任务的核心方法,command 参数即为要执行的任务的 Runnable...(); /** * 判断线程池中所有的任务是否被完全终止, * 只有在调用了 shutdown 或者 shutdownNow 方法之后这个方法才可能返回 true */ boolean isTerminated...接口中的方法,在其的 run() 方法中会调用创建 FutureTask 对象时传入的 Callable 对象的 call() 方法或者是 Runnable 对象的 run() 方法。...在这个方法中线程会不断从线程池的任务队列中取任务并执行执行任务,直到取出的任务对象为 ,此时证明线程池已经关闭或者任务队列为空,这样的话证明当前线程可以被尝试回收,接下来就会跳出 while 循环进入

49520
领券