Java堆和栈
在Java编程语言中,堆(Heap)和栈(Stack)是两种不同的内存区域,它们有着不同的用途和管理方式。 堆(Heap) 1. 定义与功能: 堆是Java程序运行时的一个内存区域,它主要负责存储对象实例。每当使用new关键字创建一个对象时,该对象的引用以及它的实际数据(成员变量)都会在堆中分配空间。堆内存的特点是可以动态地分配和回收,这意味着你不需要在编译时就知道需要多少内存,而是在运行时根据需要申请和释放。 2. 管理方式: Java虚拟机(JVM)通过垃圾回收机制自动管理堆内存。当一个对象不再被任何引用指向时,垃圾回收器会识别并回收这部分内存,以防止内存泄漏。由于垃圾回收的过程较为复杂,因此访问堆内存的速度相对栈来说较慢。 3. 存储内容: 堆上存储的是所有由new创建的对象和数组,包括基本类型包装类的对象实例。 栈(Stack) 1. 定义与功能: 栈是一种线程相关的内存区域,每个Java线程都有自己的栈空间。栈主要用于存储方法调用时的局部变量、方法参数、返回地址(即程序计数器PC寄存器的内容),以及中间计算结果等临时数据。每一个方法调用都会创建一个新的栈帧(Stack...
Java的异常的类型
Java异常的层次结构 Throwable有两个直接的子类: Error、Exception。 Error JVM内部的严重问题,比如资源不足等,无法恢复。 处理方式: 程序员不用处理 Exception JVM通过处理还可回到正常执行流程,即:可恢复。 分RuntimeException和其他Exception,或者说分为非受检异常(unchecked exception)和受检异常(checked exception)也可以称为运行时异常和编译时异常 1使用建议:将checked exceptions用于可恢复的情况,将unchecked exception用于编程的错误。 运行时异常RuntimeException(unchecked exception) 处理或者不处理都可以(不需try…catch…或在方法声明时throws) 编译时异常,其他Exception(checked exception) Java编译器要求程序必须捕获(try…catch)或声明抛出(方法声明时throws)这种异常。
List集合去重方法
在Java中,对List集合去重有多种方法,以下是一些常见的实现方式: 使用HashSet(无序去重): 123List<String> listWithDuplicates = ...; // 假设这是包含重复元素的列表Set<String> set = new HashSet<>(listWithDuplicates);List<String> distinctList = new ArrayList<>(set); 这种方法利用了HashSet自动去除重复元素的特性。先将List转换为HashSet,然后创建一个新的ArrayList来存储不重复的元素。 使用LinkedHashSet(有序去重): 123List<String> listWithDuplicates = ...;LinkedHashSet<String> linkedSet = new LinkedHashSet<>(listWithDuplicates);List<String>...
List集合进行排序
在Java中,对List集合进行排序可以使用多种方法,以下是几种常见的排序方式: 使用Collections.sort(): 12345import java.util.Collections;import java.util.List;List<Integer> numbers = Arrays.asList(5, 3, 2, 8, 1);Collections.sort(numbers); // 对整型列表进行自然排序(升序) 如果你的List里存储的是自定义对象,你需要确保该类实现了Comparable接口,并重写了compareTo()方法,这样Collections.sort()才能根据对象的自然顺序进行排序。 使用Comparator: 12345678910111213141516class User { String name; int age; // 构造函数、getter和setter省略...}List<User> users = ...; //...
Set接口及主要实现类
...
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...