java stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 1234无状态:指元素的处理不受之前元素的影响;有状态:指该操作只有拿到所有元素之后才能继续下去。非短路操作:指必须处理所有元素才能得到最终结果;短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/O channel,...
java中==和equals区别
一个是运算符一个是方法 ==是运算符,当两个变量使用==号相比时,当变量为基本类型的时候比较的是变量的值,当变量为引用类型时比较的是变量的内存地址 equals方法比较的是对象的内容,此方法存在于Object类中,如果子类实现了此方法就使用子类的方法,如何没有则使用Object类中方法相当于==
java创建String对象的个数
示例1 字面量+字面量 以下语句创建几个对象? 1String s1 = "abc" + "def"; 答案 11个 编译期已经常量拼为"abcdef",放到常量池,变量s1获得是"abcdef"。 示例2 字面量+对象+字面量 以下语句创建几个对象? 12String s1 = "abc";String s2 ="abc"+s1+"def"; 答案 1创建3个对象。常量池中2个:abc,def;堆中1个:abcabcdef 解析 String s1 = “abc”;:创建1个对象:生成了一个String对象"abc"并放入常量池(其中的字符串池)中,定义了一个String引用变量s1并指向"abc"。 String s2...
java反射
反射机制是什么 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。 白话理解一下反射: 我们编译时知道类或对象的具体信息,此时直接对类和对象进行操作即可,无需使用反射(reflection) 如果编译不知道类或对象的具体信息,此时应该如何做呢?这时就要用到 反射 来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息 123456789101112131415161718192021public class Test { public static void main(String[] args) throws...
java面试题
搜罗所有的面试题准备面试
基本类型自动拆箱_装箱
为什么基本类型需要包装类 基本数据类型方便、简单、高效,但泛型不支持、集合元素不支持 不符合面向对象思维 包装类提供很多方法,方便使用,如 Integer 类 toHexString(int i)、parseInt(String s) 方法 Long 或 Integer 如何比较大小? 错误方法 使用==。 因为 Long 与 Ineger 都是包装类型,是对象。 而不是普通类型 long 与 int 使用 equals 方法。因为 equals 方法只能比较同类型的类,例如两个都是 Integer 类型。 正确方法 先使用 longValue()或 intValue()方法来得到他们的基本类型的值然后使用==比较也是可以的。 拆箱与装箱原理 装箱就是将基本数据类型转化为包装类型,那么拆箱就是将包装类型转化为基本数据类型。 12345678public class Demo{ public static void main(String[] args) { //自动装箱,底层其实执行了Integer...
字节流与字符流的区别
相同点 字符流和字节流都有缓冲的实现类,提高了读写的效率: 12字符流:BufferedReader、BufferedWriter字节流:BufferedInputStream、BufferedOutputStream 类层次图 区别 项 字节流 字符流 操作基本单元 字节 字符(Unicode 码元) 存在位置 可存在于文件、内存中。硬盘上的所有文件都是以字节形式存在的。 只存在于内存中。 使用场景 适合操作文本文件之外的文件。例:图片、音频、视频。 适合操作文本文件时使用。 Java 相关类 InputStream、OutputStream 等。 Reader、Writer 等。 正确用法是:Java 使用字符流读取文本文件,使用字节流读取非文本文件。 原因是: 字符流读文本文件时可以自动处理文件编码,确保正确地解析文件中的字符。 使用字符流读取非文本文件可能会导致一些问题。例如,字符流可能会将一些特定的字节序列(如 0x0A)视为文件的行结尾,从而导致数据丢失。所以在读取这些文件时使用字节流比字符流更好。
安全删除list的方法
在 Java 中,从List中安全删除元素主要指避免因遍历过程中修改集合内容导致的ConcurrentModificationException异常或其他未定义行为。以下是在多线程环境和单线程环境中确保安全删除元素的几种方法: 使用迭代器 (Iterator): 迭代器提供了remove()方法,它允许你在迭代过程中安全地删除元素。 1234567Iterator<E> iterator = list.iterator();while (iterator.hasNext()) { E element = iterator.next(); if (shouldRemove(element)) { // 自定义条件来判断是否删除元素 iterator.remove(); }} 并发容器 (如...
引入迭代器的主要原因
Java 中引入迭代器(Iterator)的主要原因包括以下几个方面: 统一访问接口: 不同类型的集合类(如 ArrayList、LinkedList、HashSet 等)虽然内部结构和实现方式各异,但通过 Iterator 接口,客户端代码可以采用统一的方式来遍历这些集合中的元素,而无需关心底层集合的具体实现。 封装与解耦: 迭代器模式将“遍历算法”从容器类中分离出来,这样既隐藏了容器的内部细节,也使得容器类专注于数据存储与管理,迭代器则专注在如何访问这些数据上。这增强了程序设计的模块化和低耦合度。 安全性与并发控制: 在多线程环境下,直接操作集合可能会引发并发修改异常(ConcurrentModificationException)。使用迭代器可以在迭代过程中安全地对集合进行修改,例如Iterator提供了remove()方法,在迭代过程中删除元素不会抛出异常。 灵活的遍历逻辑: 迭代器可以支持多种遍历策略,比如只读遍历、可移除遍历、有条件遍历等,可以根据需要定制不同的迭代行为。 简化编程模型: 由于 Java 语言提供的...
解决Hash冲突的方法
哈希冲突(Hash Collision)是指在使用哈希函数将不同的键映射到有限的哈希表槽位时,两个或多个不同的键计算出相同的哈希值。解决哈希冲突主要有以下几种方法: 开放定址法: 当发生冲突时,寻找下一个空闲的哈希地址来存储数据。具体策略包括线性探测、二次探测、双散列探测等。 线性探测:当碰撞发生时,顺序检查后续的桶直到找到一个空桶。 二次探测:与线性探测类似,但每次探测间隔按照固定的二次函数递增。 双重散列:使用两个或更多的散列函数来定位下一个可用位置。 链地址法(拉链法): 每个哈希表槽位上挂载一个链表或者其它动态结构(如红黑树),当多个元素映射到同一个槽位时,它们在该槽位对应的链表中按插入顺序链接起来。Java 中的HashMap正是采用这种方法,在 JDK 1.8...