![](https://img-blog.csdnimg.cn/direct/b9cf5dcc94a64778a2645b584f3c63c9.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java初级
文章平均质量分 76
通读Java入门后,需要了解一些JDK中的进阶用法,例如包装类、集合、泛型、反射、注解等功能,以及一些Java中的扩展知识
Carl·杰尼龟
一定要坚持,因为下次努力不知道要等到什么时候
展开
-
正则表达式
正则表达式(Regular Expression)是一种文本模式,包括普通字符和特殊字符(也称为元字符)。正则表达式使用单个字符串来描述、匹配某个句法规则的字符串。原创 2024-06-05 17:48:49 · 836 阅读 · 0 评论 -
SPI机制
SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用于启用框架扩展和替换组件如:java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现Java中SPI机制的主要思想就是将装配的控制权移到程序之外,在模块化设计中,这个机制尤其重要,其核心思想就是解耦。原创 2024-06-05 17:36:25 · 587 阅读 · 0 评论 -
Java--线程通信
生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处 取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如 果店中有产品了再通知消费者来取走产品。如果并发线程数量比较多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁的创建线程就会大大降低系统的效率,因为频繁的创建线程和销毁线程需要时间。原创 2024-06-05 17:31:42 · 819 阅读 · 0 评论 -
多线程死锁问题
死锁是不同线程分别占用对方需要的同步资源,都在等待对方放弃自己需要的资源,就形成了死锁死锁发生的情况–以下四种情况同时发生的情况下才会发生死锁互斥使用—不可破坏的条件占有且等待如果不能一次性申请所有资源就请等待(超时等待)不可抢占如果不能一次性申请所有资源,主动释放它占有的所有资源(超时放弃)循环等待先给资源排序,先申请资源序号小的,再申请资源序号大的,这样线性化后申请资源,解决循环等待解决死锁的方法预防死锁:,通过预先设置一些限定条件,破坏死锁的必要条件。原创 2024-06-05 17:29:38 · 151 阅读 · 0 评论 -
线程同步及安全(锁)
由于实现Runnable接口只需要创建一次线程对象,因此,可以使用类类型的对象作为同步监视器,因为创建一次对象,成员变量是唯一的,但是我们发现实际上创建一个对象太麻烦了,我们是可以直接使用this关键字作为同步锁。线程中断规则:对现成interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过interrupted()方法检测到是否有中断发生。优点:解决了多线程的数据安全问题 弊端:当线程很多时,每个线程都会去判断同步上的锁,很耗费资源,并且降低了程序运行的效率。原创 2024-06-05 17:25:27 · 516 阅读 · 0 评论 -
线程的调度策略
抢占式策略:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取CPU时间片相对多一些。时间片策略:(所有线程轮流使用CPU的使用权,平均分配每个线程占用的CPU的时间片)低优先级只是获得调度的概率低,并非一定是在高优先级线程之后才被调用。同优先级线程是先进先出的队列,使用时间片策略。对高优先级的使用优化调度的抢占式策略。:改变线程的优先级,数越大优先级越高。线程创建时,继承父线程的优先级。对应Windows线程优先级。:10【最高优先级】原创 2024-06-05 10:21:05 · 165 阅读 · 0 评论 -
Map接口
HashMap和Hashtable实现机制一样,但是Hashtable是线程安全的集合,性能慢于HashMapTreeMap通常比HashMap和Hashtable要慢(尤其是在插入和删除的时候),因为使用了红黑树来维护元素的次序使用TreeMap的好处:key-value总是有序状态,无序专门进行排序,可以通过调用keySet(),取得key的Set集合,,然后通过toArray()方法将Set集合转换为数组,最后通过Arrays工具类中的binarySearch()方法在已排序的数组中快速查询对象。原创 2024-06-05 09:00:42 · 335 阅读 · 0 评论 -
并发系列-多线程创建和使用
run():封装线程执行的代码,直接调用,相当于普通方法的调用 start():启动线程,然后由JVM调用此线程的run()方法启动线程。举例说明:成员变量共同使用,如果不定义为static,则继承Thread类就是各自使用各自的,但是实现Runnable接口,只需要创建一次对象,成员变量也相当于是共享的。当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据错误。调用start方法,一个对象只允许调用一次start方法,否则报错。原创 2024-05-31 18:05:08 · 765 阅读 · 0 评论 -
并发系列-多线程的基础概念
程序是编程指令或语言组成的集合(静态的),进程是正在运行的程序(动态的),线程是进程中的一条执行路径(动态的)进程是资源分配的单位,线程是调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(PC)一个进程如果可以同一时间并行执行多个线程,则是支持多线程的一个进程中的多个线程共享相同的内存单元/内存地址空间(也就是共享堆空间),可以访问相同的变量和对象共享堆空间优缺点:优点:线程间通信更简便、高效;缺点:多个线程操作共享的系统资源可能会带来安全隐患。原创 2024-05-31 18:02:09 · 558 阅读 · 0 评论 -
Hashtable
与Hashset一样,尽量不用使用可变对象作为key值,如果非要使用,尽量不要在程序中修改可变对象。key和value都不允许为null,为null报错:NullPointerException。key传入的对象必须重写hashCode和equals方法。Hashtable也是Map的典型实现类,古老的。底层采用的数据结构与HashMap相似。参考HashSet中的面试题。原创 2024-05-29 22:37:23 · 177 阅读 · 0 评论 -
TreeMap
需要key对象的类都必须实现Comparable接口,而且存储在同一个TreeMap集合中的key值必须是同一个类的对象,否则会抛出ClassCastException异常。如果没有实现Comparable接口就必须使用定制排序,在创建TreeMap集合对象时传入一个Comparator对象,该对象负责对TreeMap集合中所有元素进行排序。TreeMap中的两个元素相等的标准是CompareTo()方法返回值等于0,或定制排序中compare()方法返回值等于0。TreeMap是以红黑树为底层数据结构。原创 2024-05-29 22:35:24 · 154 阅读 · 0 评论 -
HashMap
HashMap是Map的典型实现类,也是HashSet的底层实现。原创 2024-05-29 22:32:41 · 690 阅读 · 0 评论 -
EnumSet
不允许添加null,如果添加null,则会报空指针异常NullPointerException。EnumSet在内部采用位向量形式存储–存储紧凑、高效,占用内存小、运行效率高,适合批量操作。EnumSet不允许添加重复元素,如果添加重复值,则会将上一次的值覆盖。EnumSet的集合元素是有序的()由枚举类的定义顺序决定存储顺序。EnumSet的所有元素都必须是指定枚举类型的枚举值。EnumSet是专门为枚举类涉及的集合类。原创 2024-05-29 22:27:31 · 191 阅读 · 0 评论 -
LinkedHashSet
LinkedHashSet是HashSet的子类,在添加数据时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据(双向链表)即存放无序,取数有序,由于是采用了链表的形式维护插入的顺序,因此比HashSet效率偏低,但是迭代访问全部元素时效率较高。LinkedHashSet也是通过hash值确定索引值,从而确定数据的存放位置的,但是同时也采用了链表来维护元素的次序。由于使用hashcode来确定存储位置,因此也是不允许重复的。LinkedHashSet底层实现–原创 2024-05-29 22:26:37 · 174 阅读 · 0 评论 -
TreeSet
TreeSet不允许添加的元素重复–判断重复的标准是比较器返回值等于0。TreeSet不允许添加不同对象元素–必须要求是相同类的对象。通过Java比较器,实现TreeSet不允许添加重复元素。底层实现实际上是TreeMap和SortedMap。TreeSet是一个无序的,线程不安全的集合。TreeSet不允许添加的元素(原创 2024-05-29 22:25:35 · 138 阅读 · 0 评论 -
HashSet
HashSet底层使用HashMap进行了包装,特性与HashMap基本一致,继承自Set接口。原创 2024-05-29 22:24:24 · 186 阅读 · 0 评论 -
Set接口
Set继承自Collection。原创 2024-05-29 22:23:11 · 117 阅读 · 0 评论 -
Queue和Deque
如果元素为null,直接抛出异常,原因是循环数组的空闲位置,本身就是null,插入null,指针移动没有必要,且当head和tail相等的时候还需要指数级扩容,因此可能造成大量的空间浪费。我们发现无法取head=1,因此必须是2的倍数,head-1的二进制才不会改变,因为2的倍数在二进制表示为一个1,后面全是0,length-1相当于后面的0全为1,即二进制低位为1,已知。方法取出队列中的元素时,并不是取出最先进入队列的元素,而使取出队列中最小的元素,已经违背了队列的先进先出原则。原创 2024-05-29 22:21:12 · 912 阅读 · 0 评论 -
Vector向量
Vector类ArrayList类Vector是顺序容器允许存放null值允许存放重复值底层通过数组实现线程安全。原创 2024-05-29 22:07:15 · 112 阅读 · 0 评论 -
LinkedList
LinkedList是一个顺序容器是线程安全的允许存放null值允许存放重复值底层采用双向循环链表进行存储LinkedList同时实现了List接口和Deque接口LinkedList既可以看作是一个顺序容器,也可以看作是一个队列,同时又能看作是一个栈栈和队列都可以使用LinkedList,java官方已经声明不支持使用Stack类了,而且也没有一个Queue类(这是接口)可供使用但是目前ArrayDeque是栈和队列的首选,性能上比linkedList好。原创 2024-05-29 22:04:53 · 981 阅读 · 0 评论 -
ArrayList
ArrayList是顺序容器,存储和取出的顺序是一致的,可以理解为使用者很明确存储位置ArrayList允许存放null值ArrayList允许存放重复值ArrayList底层通过数组实现ArrayList未实现线程安全。原创 2024-05-29 22:02:11 · 705 阅读 · 0 评论 -
List接口
有序的Collection序列,此接口的用户可以对此列表中的每个元素的插入位置进行精确的控制用户可以通过元素的整数索引访问元素,并搜索列表中的元素,与set不同,通常允许重复的元素特点:元素有序且可重复,集合中每个元素都有其对应的顺序索引。原创 2024-05-29 21:55:12 · 236 阅读 · 0 评论 -
Interable接口
Iterable接口是Collection的父接口,主要用于遍历Collection集合中的元素。原创 2024-05-29 21:52:03 · 813 阅读 · 0 评论 -
Collection接口详解
HashSet的性能总是比TreeSet的性能好,特别是添加查询等操作时因为TreeSet需要额外的红黑树来维护集合元素的次序,只有当需要一个保持排序的Set时才使用TreeSetHashSet和LinkedHashSet进行比较插入删除操作,HashSet性能高于LinkedHashSet,这是因为维护了链表带来的开销遍历集合LinkedHashSet的性能高于HashSetEnumSet是Set集合中性能最好的,但是只能保存相同的枚举类的枚举值作为集合元素。原创 2024-05-29 21:50:07 · 535 阅读 · 0 评论 -
集合的概述
容器是用于容纳其他对象的对象,因此基本数据类型无法直接使用容器,必须要转换成包装类后才可以使用,这里就涉及到了包装类的概念。java.util包下Java集合框架的优点:降低编程难度提高程序性能提高API之间的互操作性降低学习难度提高代码的重用性。原创 2024-05-27 10:28:48 · 521 阅读 · 0 评论 -
代理模式(静态和动态)
代理模式:为另一个对象提供一个替身或占位符,以便于控制对这个对象的访问静态代理:就是将一些在方法中重复的功能提取出来,通过一个专门的类去封装,在具体类中需要的时候就用那个专门的类的对象去调用动态代理:原理和静态代理差不多,只是用了一个反射的接口,去调用一些方法方便进行动态调度动态代理的步骤就是:先把代理类实例化,再实例化被代理类,将被代理类的对象传到代理类的方法中,因为是Object类型,所以需要转型再输出那个方法。原创 2024-05-27 10:26:39 · 240 阅读 · 0 评论 -
Java网络编程
客户端接收到服务端发出的TCP报文,确认了服务端已做好释放连接的准备,立即就会结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务端发送一段报文。端口:当源IP将数据包发送到目的IP的时候,常常是通过程序接收的,但是一个通信实体可以有多个通信程序可以提供网络服务,端口号就是为了唯一确定一个通信程序的。确认号:Ack序号,占32位,用来标识目标主机是否接收到数据,由目标主机确认是否生效,如果Ack=Seq+1,且ACK标志位=1,则确认连接成功。原创 2024-05-27 10:24:05 · 792 阅读 · 0 评论 -
Java枚举
类的对象只有有限个,确定的当需要定义一组常量时,强烈建议使用枚举如果枚举类中只有一个对象,则可以作为单例模式的实现方式例如:星期:星期一、星期二、星期三、星期四、星期五、星期六、星期天性别:男、女自定义枚举类方式一: jdk5.0之前,自定义枚举类//jdk5.0之前定义枚举类的方式//1.private final修饰属性//2.私有化构造器//3.类内部创建对象Monday Tuesday Wednesday Thursday Friday Saturday Sunday。原创 2024-05-27 10:13:17 · 243 阅读 · 0 评论 -
Java异常
在Java语言中,将程序执行中发生的不正常情况称为异常。语法错误和逻辑错误不是异常Java程序执行过程中所发生的异常事件可分为两类:Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError和OutOfMemoryError等Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以用针对性的代码进行处理。例如:空指针访问异常NullPointerException、试图读取不存在的文件、网络连接中断、数据角标越界等。原创 2024-05-27 10:12:15 · 778 阅读 · 0 评论 -
IO多路复用模型原理
在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了。原创 2024-05-27 10:04:42 · 1279 阅读 · 0 评论 -
NIO流(多路复用技术)
NIO是Java提供的一种基于Channel和Buffer的IO操作方式,即:利用内存映射文件方式处理输入和输出。NIO具有更加强大和灵活的IO操作能力,提供了非阻塞IO、多路复用等特性,特别适合需要处理大量连接的网络编程场景在JDK1.4时提出了NIO(New I/O),在BIO模型(Blocking IO)的基础上,增加了NIO模型(Non-Blocking IO),即同步非阻塞方式。原创 2024-05-27 10:00:00 · 544 阅读 · 0 评论 -
IO流(BIO)
I/O:是的缩写,指的是某个设备或环境进行数据的输入和输出,java将输入输出问题(如:读写文件,网络传输等)抽象成流对象(Stream)来解决Java环境某个设备或环境数据文本、图片、音频、视频等输入和输出读取文件就是输入,写入文件就是输出Java.io包下提供了各种流的类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出。原创 2024-05-27 09:48:07 · 932 阅读 · 0 评论 -
Linux的五种网络IO模型
阻塞IO读操作流程图当用户进程调用了recvfrom这个系统调用方法,kernel就开始了IO的第一个阶段:准备数据此时Kernel会开始接收数据报文,此时整个用户进程处于阻塞状态当Kernel接收到足够的数据报文后,就会将数据从Kernel中拷贝到用户进程的内存空间中,这个拷贝的过程用户进程依旧是阻塞状态直到拷贝过程结束,Kernel会给用户进程返回结果,用户进程才会解除阻塞状态阻塞IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据)都被阻塞了由于所有Socket网络编程都是从listen()、sen原创 2024-05-27 09:36:35 · 1052 阅读 · 0 评论 -
Java IO
在Java的发展过程中,IO演变了多种形式,目的是为了满足实际业务所需,IO即(Input和Output的首字母), 是指最基础的输入和输出java中支持的网络编程模型IO模式共三种:BIO(Blocking IO)原创 2024-05-27 09:30:35 · 598 阅读 · 0 评论 -
Java注解
从JDK5.0开始增加了对元数据(MetaData)的支持,也就是注解(Annotation)注解其实就是代码里的特殊标记注解可以在编译、类加载、运行时被读取,并执行相应的处理使用注解的目的主要是为了使程序员在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息(代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或部署)注解可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息都被保存在注解的name=“value”中。原创 2024-05-27 09:27:26 · 693 阅读 · 0 评论 -
Java反射
反射被视为的关键,反射机制允许程序在执行期间借助于取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。类加载是指:将类的class文件读入内存,并在堆内存中的方法区对应创建一个java.lang.Class对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为反射。类加载的几种来源从本地文件系统加载class文件,也就是本地代码。原创 2024-05-27 09:22:32 · 408 阅读 · 0 评论 -
Java泛型
/自定义泛型类//自定义泛型属性T id;//自定义构造器this.id=id;//自定义泛型方法@Override1:-1;//自定义方法参数//自定义泛型接口1.3泛型定义时的注意事项泛型的参数类型必须是类类型,不能是基本数据类型如果一个类定义了泛型,在使用时(实例化)没有指定泛型的类型,则默认为Object类泛型可以用于定于方法类型、方法参数类型、属性类型如果一个类定义了泛型,在实例化时建议使用,否则很容易引发E。原创 2024-05-27 08:54:01 · 696 阅读 · 0 评论 -
Java包装类
自从引入了泛型,使得集合中的元素可以保证自己的类型不再丢失,虽然这样可能会导致同一个list集合不再能存储多种不同的引用数据类型,只能存放菱形语法标识的类型数据,但是同一个list存放多个不同类型的数据的场景是很少的,而且集合在创建时也可以不指定泛型,默认类型就是Object,完全满足了所有引用类型的场景。因此存在包装类的原因就是为了满足一些基本数据类型被抛弃的场景,当然,在不涉及到基本类型必须转换为包装类的情况下,尽量使用基本数据类型,因为这是更底层的数据类型更高效,且对象本身就更浪费资源。原创 2024-05-27 08:49:49 · 835 阅读 · 0 评论 -
HashSet/HashMap底层源码解析
图1:这里我们可以看出,&、|这些逻辑运算结果都是偏向于true或false的,只有^才能让hash值更加随机散列。HashSet new的过程实际上是创建HashMap过程,首先看一下测试代码。源码二:new HashMap()是对loadFactor属性的初始化过程。源码四:调用了put方法后,我们就发现还是在套娃,调用了putVal方法。源码一:new HashSet()调用构造器的源码。源码三:new完成以后,调用add方法。源码五:调用putVal()方法。后续再详细分析一下红黑树吧,害。原创 2021-08-14 15:55:19 · 155 阅读 · 0 评论 -
Java-异常
1.异常概述在Java语言中,将程序执行中发生的不正常情况称为异常。语法错误和逻辑错误不是异常Java程序执行过程中所发生的异常事件可分为两类:Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError和OutOfMemoryError等Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以用针对性的代码进行处理。例如:空指针访问异常NullPointerException、试图读取不存在的文件、网络连接中断、原创 2022-05-20 14:48:53 · 143 阅读 · 0 评论