String不可变的含义、原因、好处
String不可变的含义 String不可变的含义是:将一个已有字符串"123"重新赋值成"456",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 也就是说:不可变的含义是内部数据不可变,而不是说引用不可变。 String为什么不可变 String的内部数据是一个char数组,是对字符串数组的封装,并且是被final修饰的,创建后不可改变。 123456789101112package java.lang;public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; //...
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(); }} 并发容器 (如...