
Java从入门到放弃
文章平均质量分 85
主要介绍Java的一些相关知识
ThetaarSofVenice
System.out.println(“Java”)
展开
-
【Java从入门到放弃 之 ConcurrentModificationException】
这种情况下,Java 的集合框架为了保证数据的一致性和安全性,会抛出 ConcurrentModificationException 来阻止潜在的并发修改问题。我们做foreach循环的时候,返回了Iterator对象,这个对象的modCount是新建立这个对象时候的modCount值。下面是Itr的源码,我们明显看到expectedModCount是取得新建这个对象的时候modCount的值,导致后面集合修改了modCount值之后,就出现不一致的问题。修改集合用的是Collection对象通信导致的。原创 2024-12-08 14:09:04 · 3176 阅读 · 3 评论 -
【Java从入门到放弃 之 HashMap 和 HashSet】
概述定义:HashMap 是一种以哈希表为基础的实现,提供了常数时间复杂度 O(1) 的基本操作(如 get 和 put),假设哈希函数分布均匀。特点:线程不安全:与 Hashtable 不同,HashMap 不是同步的,因此在多线程环境中需要额外的同步机制。允许一个 null 键和多个 null 值:可以包含一个 null 键和任意数量的 null 值。无序:不保证元素的迭代顺序;如果需要有序,可以考虑使用 LinkedHashMap 或 TreeMap。内部工作原理。原创 2024-12-12 20:40:29 · 1513 阅读 · 3 评论 -
【Java从入门到放弃 之 LinkedList 和 ArrayDeque】
概述定义:LinkedList 是一个可以动态调整大小的双向链表实现,允许在列表两端快速添加或移除元素,并且支持按位置插入和删除。特点:线程不安全:与 ArrayList 类似,LinkedList 也不是同步的,多线程环境下需要额外的同步机制。允许重复元素:可以包含多个相同的元素。允许空值:支持存储 null 值,甚至可以存储多个 null。双端队列功能:除了作为普通列表使用外,LinkedList 还提供了双端队列的功能,如在头部或尾部添加/移除元素。内部工作原理。原创 2024-12-12 15:17:30 · 1403 阅读 · 0 评论 -
【Java从入门到放弃 之 ArrayList】
概述定义:ArrayList 是一个可以动态增长和缩小的数组实现,允许存储任意数量的对象。特点:线程不安全:ArrayList 不是同步的,如果多个线程同时修改同一个 ArrayList 实例,则必须显式地进行同步。允许重复元素:与 Set 不同,ArrayList 允许存储重复的元素。允许空值:支持存储 null 值,甚至可以存储多个 null。内部工作原理ArrayList 内部使用一个对象数组来存储元素。原创 2024-12-11 22:53:53 · 1296 阅读 · 3 评论 -
【Java从入门到放弃 之 通用容器类】
Collection 接口概述定义:Collection 是一个代表一组对象(称为元素)的容器的接口。它是所有集合类的顶级接口,但不包括映射(Map)。特点:提供了基本的集合操作方法,如添加、删除、遍历等。不保证元素的顺序,也不保证元素是否唯一(这些特性由具体实现决定)。可以包含重复元素(取决于具体实现),并且允许 null 元素(同样取决于具体实现)List 接口概述定义:List 是一个有序集合,其中每个元素都有一个对应的索引位置。你可以通过索引来访问、插入或删除元素。原创 2024-12-15 21:00:39 · 2551 阅读 · 8 评论 -
【Java从入门到放弃 之 关键字】
byte大小:8位(1字节)范围:-128 到 127用途:适合存储小整数值。默认值:0short大小:16位(2字节)范围:-32,768 到 32,767用途:适合存储较小的整数值。默认值:0int大小:32位(4字节)范围:-2³¹ (-2,147,483,648) 到 2³¹-1 (2,147,483,647)用途:最常用的整数类型。默认值:0long大小:64位(8字节)原创 2024-12-05 22:33:45 · 1260 阅读 · 0 评论 -
【Java从入门到放弃 之 从字节码的角度异常处理】
如果大家对与java的异常使用还有问题或者还不太了解,建议先看一下我之前写的了解一下基本 的异常处理知识,再看这篇文章。原创 2024-12-04 13:04:27 · 1600 阅读 · 3 评论 -
【Java从入门到放弃 之 类加载器】
除了使用JVM提供的默认类加载器外,开发人员还可以根据需要自定义类加载器。自定义类加载器通常需要继承java.lang.ClassLoader类,并重写其中的findClass()方法或loadClass()方法。通过自定义类加载器,可以实现一些特殊的功能,如从网络加载类、从数据库加载类等。原创 2024-12-03 17:24:11 · 1403 阅读 · 2 评论 -
【Java从入门到放弃 之 Stream API】
Lambda 表达式是 Java 8 引入的一个强大特性,它使代码更加简洁、易读,并且促进了函数式编程风格的应用。通过 Lambda 表达式,你可以更方便地处理集合、并发编程等问题。希望这些介绍和示例能帮助你更好地理解和使用 Lambda 表达式。如果有任何具体问题或需要进一步的帮助,请随时提问!原创 2024-11-30 21:00:12 · 1655 阅读 · 5 评论 -
【Java从入门到放弃 之 反射】
Java程序中的对象有两种类型,编译时类型 和 运行时类型,而很多时候编译时类型与运行时类型是不一致的。String sex;上面代码输出结果 :Man shout编译类型时Person ,运行时实际时Man;如果我们有一个方法传入的是一个Person,到底传入的Person具体是哪个类,只有运行的时候才知道,可能是Person类或它的子类。所以如果现在想要运行的时候知道到底传入的是哪一个类,怎么办?这个问题就引入了反射这个概念,反射指的是运行期拿到一个对象的所有信息。原创 2024-11-15 23:09:54 · 990 阅读 · 0 评论 -
【Java 反射应用 之 动态代理】
静态代理是可以解决增强的问题,也可以实现代理类帮助被代理类做一些额外的事情。但是这里有一个问题,不知道你发现没有,如果采用静态代理的话,每个静态类都要自己写,这样是不是非常繁琐。有没有更好的方式,有---->那就是动态代理。原创 2024-11-18 20:57:46 · 1148 阅读 · 0 评论 -
【Java从入门到放弃之 IO (一)】------- 绝对看的懂,看不懂欢迎私信
我们都知道,计算机的底层是识别二进制数据的,即通过高低电平代表0 和 1。所有的文件本质上也都是一堆0和1组成的。但是我们观察我们的计算机上面的文件,会发现,文件有很多种类型,我们会有word文件 ppt文件 pdf文件等等。WORD文件以.doc结尾;PPT文件以.ppt结尾。每一种文件的内容都是有特定的格式。文件类型与内容的格式都是一一匹配的。而后缀比如.doc是干什么的呢?实际上这个后缀是告诉操作系统,这个文件是一个word文件,使用word相关应用打开。** 那改后缀名?**原创 2024-11-20 21:57:31 · 1682 阅读 · 3 评论 -
【Java从入门到放弃之 IO (二)】------- 绝对看的懂,看不懂欢迎私信
因为我们知道磁盘网络这种外部设备的速度是比较慢的,导致如果我们有数据要写入就直接写的话,会有性能问题。还记得上一盘文章我们写的内容吗?与速度慢的设备打交道,能少打交道就少打交道,接触一次就尽可能多地传输数据,以均摊开销。所以我们写入数据的时候,实际上写入的地方是缓冲区,缓冲区满了之后,再一次性写入磁盘或者网络。FileOutputStream没有缓冲,没有重写flush()方法,调用flush()方法没有任何效果,数据只是传给了操作系统,操作系统什么时候落盘,不确定。** 后序内容之后补充**原创 2024-11-20 23:50:20 · 586 阅读 · 0 评论 -
【Java从入门到放弃之 IO (三)】------- 绝对看的懂,看不懂欢迎私信
所以当我们使用JavaIO的时候,不关JVM做了特定的处理,操作系统 也做了对应的支持。用完IO之后,JVM的内存,有垃圾回收器进行回收,但是JVM是运行在操作系统上的,它没有权限回收操作系统的内存资源。还有一个问题我们增加的这些功能很多是通用的对于IO来说,其他的InputStream的子类可能也有类似的需求,这样的话,其实我们需要加的子类就更多了。这样我们首先使用提供基础数据的InputStream提供数据流来源,然后在使用我们需要的额外功能的InputStream包装InputStream。原创 2024-11-21 15:27:47 · 1016 阅读 · 0 评论 -
【Java从入门到放弃 之 函数式编程】
函数式编程强调函数的纯粹性和不可变性,函数的返回值只取决于输入参数,不会受外部状态的影响,并且函数执行过程中不会对外部状态产生副作用。函数式编程还提倡使用高阶函数,即函数可以作为参数传递给其他函数,或者作为返回值返回给其他函数。(要注意我们Lambda表达式处理的是函数到函数的变换,如果我们现在要处理的是有理数集合,我们简单的之前的容器就承载不了,就比较适合使用容器)这个看起来是不是脑袋都大了,我也看的有点迷了,我的理解就是函数式编程就是,允许我们传入一个函数本身,经过处理之后,返回一个函数。原创 2024-11-25 21:45:37 · 1375 阅读 · 1 评论 -
【Java从入门到放弃 之 泛型】
但是有时候我们不知道某些变量的具体类型是什么,只能用公共父类Object类型,这就是容器或者上面代码ArrayList里面为啥使用Object[]数组存储元素,因为我们不知道具体要存储的数据类型。所以实际上Java的泛型是由编译器在编译时实行的,编译器泛型视为Object处理,在需要转型的时候,编译器会根据T的类型自动为我们实行安全地强制转型。动物类是人类的父类, 装动物类的汽车类不是装人类的汽车类的父类。这个是我们写的泛型类,编译器看到的就是我们写的源代码,就是下面这个案例写的这样,原创 2024-11-19 22:39:15 · 1452 阅读 · 2 评论 -
【Java从入门到放弃 之 线程池】
我们前面介绍了线程池,我们要把执行的任务提交到线程池。那我们的任务怎么创建呢?实现Runable接口实现Callable接口。原创 2024-11-24 12:31:25 · 1162 阅读 · 0 评论 -
【Java从入门到放弃 之 多线程 一】
我们在现在操作系统上进行一系列操作的时候,通常感觉很多是同时发生的,比如说,我可以一边听歌,一边发电子邮件。这两个操作好像是同时进行的。实际上操作系统是通过CPU分片,轮流执行这些程序,只不过CPU分片的大小太小了。以至于我们人感觉好像在同时发生一样。原创 2024-11-21 22:50:21 · 413 阅读 · 0 评论 -
【Java从入门到放弃 之 多线程 二】
我们上一篇引入的案例与这一篇引入的案例实际上代表多线程的两个大问题。竞态条件内存可见性另外,使用多线程也不是银弹。使用多线程有优点也有缺点,我们要分析我们遇到的问题 ,分情况使用。之所以使用多线程,实际上是因为CPU运行速度比IO速度快很多,当处理IO的时候,CPU空闲了下来。这个时候我们通过使用多线程技术,就可以多利用CPU空闲时间。但是使用多线程也是有开销的,创建多线程,操作系统会为每一个线程创建必要的数据结构,栈,程序计数器等资源,另外线程切换调度也是需要消耗资源的,这个过程称之为上下文切换。原创 2024-11-22 18:36:28 · 999 阅读 · 0 评论 -
【Java从入门到放弃 之 多线程 三】
其实我们要的是,读的时候如果里面没有就把锁放弃掉,不然就一直写入不了。之前我们使用synchronized 是Java语言原生支持的,所以Object有协同用的方法。现在我们使用的是可重入锁或者读写锁,那么线程协同,我们应该怎么解决?可以看到wait()方法与notify() 和notifyAll() 这三个就是来实现我们说的协同效果的。Java5之后,引入了java.util.concurrent,提供了更多的并发的能力。** 使用可重入锁**(读写锁使用方法与可重入锁是类似的,代码就只展示可重入锁了)原创 2024-11-23 16:51:09 · 483 阅读 · 0 评论 -
【Java从入门到放弃 之 多线程 四】
前面的读写锁,已经在原有的临界资源的上,放开了多个线程同时读。但是如果写入的时候,有线程正在读的话,写的线程就必须要等待读线程完成,不然就会导致不一致。我们写线程可以乐观不用等读线程结束。CyclicBarrier类,相当于是一个栅栏,所有线程在到达该栅栏后都需要等待其他线程,等所有线程都到达后再一起通过,它是循环的,可以用作重复的同步。实际上,使用可重入锁的时候我们就可以明显感知到,其实是有优化的地方的。所以当我们面对的是改动不是很频繁,但是读取很频繁的场景的时候,实际上我们就可以考虑使用读写锁了。原创 2024-11-23 23:15:13 · 512 阅读 · 0 评论 -
【Java从入门到放弃 之 异常】
try/catch/finally语法中,catch不是必需的,也就是可以只有try/finally,表示不捕获异常,异常自动向上传递,但finally中的代码在异常发生后也执行。可以看一下上面的案例,里面我们catch了好几个异常,异常处理机制是将抛出的异常根据异常类型进行匹配,匹配到第一个catch块就执行对应 catch块内的代码,不再执行其他catch块。,其他的都是受检异常。在catch块内处理的时候也可以重新抛出异常,这个异常可以是之前的,也可以new一个新的异常。还有一些错误是偶发性的。原创 2024-11-14 22:32:03 · 1058 阅读 · 0 评论 -
【Java从入门到放弃 之 注解】
简单理解,注解就是放在Java源码中类, 方法,字段等等的一种特殊注释,之所以说它特殊,是因为注释会被编译器忽略,注解可以打进class文件中去。换个方式理解注解就是代码中的特殊标记,这些特殊标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。自定义注解一般只需要使用@Target和@Retention,@Retention一般设置为RUNTIME。原创 2024-11-18 23:43:17 · 456 阅读 · 0 评论 -
【Java从入门到放弃 之 枚举类】
简单讲解一下,Enum 是一个抽象类,里面又一个name 和ordinal 属性。name是枚举的名称,ordinal相当于顺序,这个Enum还实现了Comparable接口,这个接口就是用ordinal这个值进行比较,如果我们调整Enum定义的顺序,ordinal会跟着改变。上面给了一个 我们定义了一Enum,它实际上相当于编译器帮我们编译出一个下面的东西。,为什么我们需要枚举类。首先我们先看一下源码 Enum的源码,我删除了一部分注释。也可以解决我们的问题,但是这样会有什么问题呢?原创 2024-11-14 20:15:27 · 436 阅读 · 0 评论 -
【Java从入门到放弃 之 Java程序基础】
比较操作符有大于(>)、大于等于(>=)、小于(<)、小于等于(原创 2024-11-26 22:38:53 · 1050 阅读 · 0 评论 -
【Java从入门到放弃 之 内存映射文件】
它将文件的内容映射到进程的虚拟地址空间,使得读写文件就像访问内存一样简单高效。内存映射的还有一个特点是,因为各个应用程序共用内存,这个多个程序映射一个文件到一个内存区域就可以很方便地实现程序之间的通信。内存映射也有局限性,因为它是按页分配内存的,所以如果是小文件的话,会造成浪费的情况。内存映射是一种按需加载的方式,这样使得我们可以通过内存映射更加方便高效地处理大文件。应用程序写到内存映射的区域,这个写完之后的结果取决于操作系统的调度,然后同步到硬盘文件上去。原创 2024-12-04 19:47:36 · 683 阅读 · 0 评论 -
【Java从入门到放弃 之 条件判断与循环】
break 关键字:用于立即退出当前所在的循环或 switch 语句。执行 break 后,程序会跳转到循环或 switch 语句之后的第一条语句继续执行。continue 关键字:用于跳过当前循环的剩余部分,并直接开始下一次循环迭代。不会完全退出循环,只是跳过当前迭代的剩余部分。原创 2024-11-28 23:20:49 · 592 阅读 · 0 评论