Java是在JVM所虚拟出的内存环境中运行的。内存分为栈(stack)和堆(heap)两部分。我们将分别考察这两个区域。 栈 栈的基本概念参考纸上谈兵: 栈 (stack)。 Java的普通对象存活在堆中。与栈不同,堆的空间不会随着方法调用结束而清空。因此,在某个方法中创建的对象,可以在方法调用结束之后,继续存在于堆中。 在Java中,对象的是通过引用使用的(把对象相像成致命的毒物,引用就像是用于提取毒物的镊子)。如果不再有引用指向对象,那么我们就再也无从调用或者处理该对象。 当垃圾回收启动时,Java程序暂停运行。JVM从根出发,找到可到达对象,将可到达对象复制到空白区域中并紧密排列,修改由于对象移动所造成的引用地址的变化。 另一方面,Java本身并没有规定JVM的GC实施方式。GC依然是JVM发展的一个热点方向。我们可以预期JVM的GC机制在未来会发生许多变化。
global a # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量 a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在视图改全局变量 print("里面的打印",a) func() print("外面的打印", a) a = 10 def func(): global a # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量 a += 10 # ?? , global找全局 a += 10 # a = a + 10 python不让这么干 print("func2", a) func2() print( # 局部 def func2(): nonlocal a # 不找全局, global找全局 a += 10 # a = a + 10
:12', 50), (1001, 9002, '2020-01-02 09:01:01', '2020-01-02 09:06:00', 58), (1002, 9001, '2021-05-02 10 :01:01', '2021-05-02 10:05:58', 60), (1002, 9002, '2021-06-02 19:01:01', '2021-06-02 19:05:01', 54), 02', null, null); 输出: 1|1001|9001|2020-01-01 22:11:12|2020-01-01 23:16:12|50 3|1002|9001|2021-05-02 10 :01:01|2021-05-02 10:05:58|60 5|1003|9001|2021-09-05 19:01:01|2021-09-05 19:40:01|49 6|1003|9001|2021 :01:01|2021-05-02 10:06:58|60 6|1003|9001|2021-09-05 19:01:01|None|None 7|1003|9001|2021-09-05 19:01:
Java基础 Java入门时我们都是学了什么? Java集合 ArrayList源码解析 Vector源码解析 CopyOnWriteArrayList源码解析 LinkedList源码解析 HashMap源码解析 ConcurrentHashMap 源码解析 LinkedHashMap源码解析 TreeSet源码解析 HashSet源码解析 LinkedHashSet源码解析 Java 多线程 线程的状态 线程的使用 Synchronized 线程通信 ThreadLocal Lock Java并发级别 Java内存模型 线程协作 Jdk并发包 锁优化 synchronized 关键字原理 多线程的三大核心 对锁的一些认知 ReentrantLock 新版本特性 QQ、新浪微博、码云和百度的第三方登录 如何将自己的jar包发布到mavan中央仓库 使用Java类加载SpringBoot、SpringCloud配置文件 Java8 Optional Lambda
到 Java 8 为止 Java SE 提供了 11 个内置注解( 5 个是基本注解,来自于 java.lang 包。 注:函数式接口是为 Java 8 的 Lambda 表达式准备的,Java 8 允许使用 Lambda 表达式创建函数式接口的实例,因此 Java 8 专门增加了 @FunctionalInterface class Test { public static void main(String[] args) { // 传递可变参数,参数是泛型集合 display(10 , 20, 30); // 传递可变参数,参数是非泛型集合 display("10", 20, 30); // 会有编译警告 } public static :10 java.lang.Integer:20 java.lang.Integer:30 java.lang.String:10 java.lang.Integer:20 java.lang.Integer
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能。有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常。 在本文中,我们将对如何在Java应用中使用及处理Checked Exception进行简单地介绍。 Java异常简介 在详细介绍Checked Exception所导致的问题之前,我们先用一小段篇幅简单介绍一下Java中的异常。 在Java中,异常主要分为三种:Exception,RuntimeException以及Error。这三类异常都是Throwable的子类。 天使变恶魔 既然Java中的Checked Exception能够提高用户代码质量,为什么还有那么多人反对它呢?原因很简单:它太容易被误用了。
String[]args){//创建集合对象Collection<String>c=newArrayList<>();//添加元素c.add("hello");c.add("world");c.add("java publicclassTreeSetDemo01{publicstaticvoidmain(String[]args){//创建集合对象TreeSet<Integer>ts=newTreeSet<Integer>();//添加元素ts.add(10
int 该构造方法可能拋出的异常类型为: name=Java 教程 id=10 price=0 ============================= 查看是否允许带可变数量的参数:false )的返回值为:" + method.invoke(book, 10)); } else if (method.getName().equals("protectedMethod ")) { // 调用两个参数的方法 System.out.println("protectedMethod(\"10\",15)的返回值为:" + method.invoke (book, "10", 15)); } else if (method.getName().equals("privateMethod")) { // 调用可变数量参数的方法 ("10",15)的返回值为:25 ============================= 3、访问成员变量 1)访问成员变量的方法 getFields():获取所有public修饰的成员变量 -
函数能够作为变量,进行赋值 package main import "fmt" //全局变量 var number = 20 //定义函数 func testGlobal() { number := 10 // 先在自己函数中进行查找,找到了自己的函数中的变量 // 函数中没有找到就往外层找,即找全局变量 fmt.Println("变量number", number) //变量number 10 //变量i只在for语句块中生效 for i := 0; i < 10; i++{ fmt.Println(i) } //fmt.Println(i) 外层不能访问内部for语句中的变量 int, op func(int, int) int) int{ return op(x, y) } func main(){ //函数作为参数传递给另一个函数 r1 := calc(10,20 , add) //30 fmt.Println(r1) r2 := calc(20,10, sub) //10 fmt.Println(r2) }
(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)
Java常见的运行时异常以及解决方案 运行时异常在Java中是RuntimeException及其子类的实例,它们通常是由程序逻辑错误引起的,而不是外部错误。 5.2 代码示例 int divisor = 0; int quotient = 10 / divisor; // 这里会抛出ArithmeticException 5.3 解决方案 避免除以零或处理除数为零的情况 = 0) { int quotient = 10 / divisor; } 06 NumberFormatException 6.1 异常描述 当尝试将字符串转换为数字,但字符串不符合数字格式时抛出 此外,某些安全策略可能由Java安全管理层(如Java Security Manager)控制,如果启用了安全管理器,那么任何违反安全策略的操作都可能导致SecurityException。 10 UnsupportedOperationException 10.1 异常描述 当尝试执行不支持的操作时抛出,如在不可变的集合上执行添加或删除操作。
今天我要分享的是java里面比较常见的数据结构队列的源码分析,队列,先进先出模式,即FIFO的特点,日常生活中队列的特点也随处可见,超市购物排队,餐厅排队买饭等一系列都满足了队列的先进先出的特点,java ,写到了内存空间的分配的字样,想到了自己学习c语言的模样,那个拿着大部书《C语言程序设计》前往机房的少年,由于兴趣使然,逐渐走上了javaWeb的开发了,不过这里说明一点,学习c语言对于你理解高级语言java 何况java作为一门高级语言呢,顺势而为成就了这个语言令人喜欢的特点吧。 四,队列既然有入队,想必就会想到队列出队的方法,即poll方法,接下来我们继续看下队列出队的方法时间吧。
话接上回,继续Java集合框架的学习,这次主要介绍Map接口。 import java.util.HashMap; //导包 import java.util.Iterator; import java.util.Scanner; public class MapDemo ; //导包 import java.util.Map; public class HashMapDemo1 { public static void main(String[] args){ ; //导包 import java.util.Iterator; import java.util.Map; public class HashMapDemo1 { public static HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
Java的GUI编程有相对比较好的可移植性。然而,随着GUI的重心向移动端转移,Java的GUI部分地位有些尴尬。无论如何,我们还是可以通过Java来了解GUI编程的一些基本内容。 一个简单的GUI Java的GUI功能主要集中在awt和swing两个包中。awt是GUI底层包。swing包是高层的封装,更容易移植。这里将更侧重于swing包。 .*; import java.awt.*; public class HelloWorldSwing { private static void createAndShowGUI() { 匿名类是Java的一种嵌套类,它是在使用new创建对象时,使用一个{}来直接包含类的定义。在匿名类定义中,我们不需要说明类名。 更多的Java布局方式 图形元素 除了按钮之外,我们还可以在GUI中增加更多的元素,这些元素大都是JComponent的衍生类。
Java中有一些对象被称为容器(container)。容器中可以包含多个对象,每个对象称为容器中的一个元素。容器是用对象封装的数据结构(data structure)。 Java中的容器也是这样。我们要选择适当的容器,以应对变化的需求。 (关于数据结构更多的内容,可参考纸上谈兵: 算法与数据结构) 数组 数组(array)是最常见的数据结构。 Java支持数组这一数据结构。我们需要说明每个数组的类型和大小。 由于Java中的所有类都继承自Object类,这样的容器实际上可以放入任意类型的对象。 在上面的程序中,容器为String类型。 这给了Java程序员更大的选择自由,当然,也为编程增加了难度。 接口为我们提供了合法的操作。在效果层面上看,不同的实施都有相同的效果。当然,不同的情境下,实施的细节将决定运行效率。
❌ 问题代码:无同步机制public class TicketSeller { private int tickets = 10; // 初始票数 public void sellTicket ✅ 正确实现:public class TicketSeller { private int tickets = 10; public void sellTicket() { 六、解决方案四:显式锁(Lock 接口)Java并发包提供了比 synchronized 更灵活的锁机制。 ✅ 使用 ReentrantLockimport java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock 掌握以下关键点:问题根源 → 共享资源 + 并发修改解决方案 → synchronized / Lock锁类型 → 对象锁 vs 类锁高级技巧 → Lock + Condition风险防范 → 死锁避免策略 进阶学习路径
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。 当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。 ? Class类更多的方法可查询官方文档: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html Class类的加载 当Java 创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。 如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。
最近在学习过程中,发现了很多以前没有用到过的语法以及随着JDK的更新出现的新特性,所以之后会进行分享自己觉得有必要记录的一些“进阶语法”。 List<String> list = List.of("a","b"); 自 Java 9 开始,JDK里面为集合(List、Set、Map)都添加了of和copyOf方法,它们两个都用来创建不可变的集合 ② filter函数 其中涉及到了两个filter函数,一个是自己写的,另一个是使用java.util.stream.Stream下的filter函数。 关于自己编写的filter函数,这是一个泛型方法,接收一个集合和一个断言(即一个可以接受集合中元素并返回布尔值的函数),然后通过流API(java.util.stream.Stream)从集合中过滤出满足断言的元素 关于java.util.stream.Stream下的filter函数,用于筛选出满足特定条件的元素,创建一个包含这些元素的新流。
; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets 示例3 import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo3 FileOutputStream("C:\\Users\\ASUS\\Desktop\\project1\\src\\fos.txt",true); // 写数据 for(int i=0;i<10 特点:被finally控制的语句一定会执行,除非JVM退出 示例4 import java.io.FileOutputStream; import java.io.IOException; public 返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1 案例1 import java.io.FileInputStream; import java.io.IOException; public
话接上回,继续java IO部分的学习。上一次说完了字节流的读写数据,这次介绍一下字符流的读写数据。 Java 内部采用此编码。 示例(使用字符流复制java文件) 用转换流InputStreamReader和OutputStreamWriter实现字符流复制java文件 转换流作用:将字节流转换为字符流 import java.io ; import java.io.FileWriter; import java.io.IOException; // FileReader和FileWriter类分别为InputStreamReader ; import java.io.IOException; import java.io.OutputStreamWriter; // OutputStreamWrite类:将字节输出流转换为字符输出流