
java基础
文章平均质量分 82
拾光师
瞧一瞧,看一看,好吃还不贵。量大管饱
多年java开发经验,现征战于互联网广告行业
分享各种java相关知识,每周更新
展开
-
java基础之动态代理
原文链接http://zhhll.icu/2020/11/12/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/动态代理动态代理有很多种方式,如jdk代理,cglib,ASM等在说动态代理之前先说一下静态代理静态代理静态代理在使用时,需要定义接口或者父类,被代理对象和代理对象一起实现相同的接口或者继承相同的父类静态代理使用的是组合模式,在代理类中包含有被代理类的对象public cla原创 2021-01-14 21:10:38 · 171 阅读 · 1 评论 -
java集合之PriorityQueue详解
PriorityQueue是优先级队列,底层使用数组存储,是基于二叉堆的一个无界队列,可以使用默认排序或者提供Comparator比较器使得队列中的元素有序。根节点的元素最小是小顶堆(小于左右子节点的值)根节点的元素最大是大顶堆(大于左右子节点的值)PriorityQueue详解。还是以默认的比较器为例。以使用默认比较器为例。原创 2023-12-20 10:07:18 · 844 阅读 · 0 评论 -
如何解决hash冲突
基于线性探测法进行改进,使得其可以双向探测,d~i~=1^2^,2^2^,3^2^…在使用hash表时肯定会遇到hash冲突的情况(看你设计的hashCode如何,设计的好,冲突就少一些)对于冲突的数据,都存放到另一个溢出表中,在查找时,先在散列表中进行查找,如果没有则去溢出表中顺序查找。但是冲突再少也会存在冲突,那就需要有处理冲突的方法,下面列出来一些处理hash冲突的方法。使用不同的散列函数来进行散列,一个冲突则使用另一个,不过这样做也增加了计算的时间。原创 2024-10-24 10:32:42 · 465 阅读 · 0 评论 -
java集合之ConcurrentHashMap详解
哈希函数根据hashCode计算出哈希值,这里的hash值与HashMap的计算方式稍微有点不同,在低十六位异或高十六位之后还需要与HASH_BITS在进行与运算,HASH_BITS的值是0x7fffffff,转为二进制是31个1,进行与运算是为了保证得到的hash值为正数。CAS包含三个操作数,---内存中的值(V),预期原值(A),新值(B) 如果内存中的值和A的值一样,就可以将内存中的值更新为B。CAS是compare and swap的缩写,即我们所说的比较交换,CAS属于乐观锁。原创 2023-12-12 10:09:28 · 1203 阅读 · 0 评论 -
java基础之TreeMap详解
从继承结构可以看到TreeMap除了继承了AbstractMap类,还实现了NavigableMap接口,而NavigableMap接口是继承自SortedMap接口的,所以TreeMap是可以进行排序的。TreeMap是Map接口的一个实现类,底层基于红黑树的实现,按照key的顺序存储。原创 2024-10-17 10:01:05 · 1001 阅读 · 0 评论 -
java集合之HashMap详解
在计算数组下标时使用的是(n - 1) & hash来计算的,当n为2次幂时,n-1的低位将全是1,哈希值进行与操作时保证低位不变,最终得到的index结果,完全取决于key的hashCode的最后几位,从而保证分布均匀,效果等同于取模,且性能比取模高。假如HashMap到达了扩容的临界点,此时有两个线程在同一时刻对HashMap进行put操作,两个线程都会进行扩容可能会形成链表环,一旦形成环形数据结构,Entry的next节点永远不为空,使得下一次读操作出现死循环。初始大小用来规定哈希表数组的长度。原创 2023-12-08 10:21:53 · 899 阅读 · 0 评论 -
java集合之Map
HashMap如果出现hash冲突的话,会在放到链表中,但是如果hash冲突过多的话,会导致链表太长,查询时性能会下降,在链表长度超过一定值时,会进行结构改造,将链表转换为树状结构,这里TREEIFY_THRESHOLD是8。Hashtable是在java1.0中实现的最早的Map,继承自Dictionary类,底层使用的哈希表,是线程安全的,因为该类中的方法都是用了synchronized修饰,但是也因此存在了效率问题。ConcurrentHashMap是并发包下的类,属于线程安全的HashMap。原创 2023-12-06 09:56:02 · 609 阅读 · 0 评论 -
java基础之HashSet详解
HashSet是基于HashMap实现的一个单列存储的集合类,将所有的数据存在HashMap的key值中,而value全部使用一个Object对象存储。继承了AbstractSet类,实现了Set接口、Cloneable接口和Serializable接口,所以HashSet是支持克隆和序列化的。HashSet的方法实现都非常简单,直接使用封装的HashMap来操作数据,真正执行的是HashMap的方法。原创 2024-10-11 10:15:16 · 1976 阅读 · 0 评论 -
LinkedList详解
LinkedList使用的迭代器是其父类AbstractSequentialList中的iterator方法,其迭代器是双向的,可以正向也可以反向。继承了AbstractSequentialList,实现了List接口、Deque接口、Cloneable接口、Serializable接口。以java8为例来了解一下LinkedList的源码实现。LinkedList是List接口的一个主要的实现类之一,基于。LinkedList的remove方法比较。LinkedList详解。原创 2024-10-10 10:14:16 · 978 阅读 · 0 评论 -
ArrayList详解
由于ArrayList的默认初始值为10,扩容为1.5倍,如果集合中所需要存储的元素数量多的话,需要进行多次扩容,重新申请内存并进行赋值,比较耗时,所以如果在进行实例化时指定初始容量,可以减少扩容次数,提升性能。ArrayList是线程不安全的,并发情况下可能会导致ArrayIndexOutOfBoundsException,在扩容时,由于没有锁的保护,导致一个线程访问到了另一个线程的不一致状态,导致越界。List中使用最多的就是ArrayList,基本上大家在实例化一个List的时候都是。原创 2023-11-30 10:06:28 · 575 阅读 · 0 评论 -
java基础之集合概览
HashMap在Map.Entry静态内部类实现存储键值对,HashMap使用哈希算法,在put和get方法中,使用hashCode和equals方法,使用put方法时,使用key的hashcode和哈希算法来找出存储键值对的索引,Entry存储在LinkedList中,如果存在entry,使用equals检查传递的key是否存在,如果存在,会覆盖掉value,如果不存在,会创建一个新的entry然后保存。元素必须定义hashCode()和equals()方法,遍历元素时,会按照添加的进去的顺序。原创 2023-11-28 10:02:00 · 1210 阅读 · 0 评论 -
JDBC操作事务
REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读仍存在(Mysql默认的事务隔离级别)SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但是性能低下。脏读 对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取到的内容就是临时无效的。原创 2023-11-24 10:16:45 · 309 阅读 · 0 评论 -
JDBC基本操作
在使用该PreparedStatement执行插入操作时,可以使用statement.getGeneratedKeys()来返回一个新生成主键的ResultSet对象,结果集中只有一列GENERATED_KEY,存放的新生成的主键值。JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,定义了用来访问数据库的标准的Java类库。该接口为Statement的子接口,属于预处理操作,可以传入带有占位符的SQL,然后再进行补充占位符,索引值从1开始。executeUpdate方法。原创 2023-11-22 10:19:30 · 516 阅读 · 0 评论 -
函数式编程
3、类::实例方法,指向任意类型实例方法的方法引用 当lambda表达式第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用。方法引用其实也是lambda表达式,要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同。lambda表达式,由箭头->分隔开参数和函数体,箭头左边是参数,右边是lambda返回的表达式,即函数体。java8的方法引用,由::区分,在::左边是类或对象的名称,在::的右边是方法的名称,但是没有参数列表。Supplier 供给型接口。原创 2023-11-20 10:27:13 · 179 阅读 · 0 评论 -
java Stream操作
https://zhhll.icu/2020/java基础/java8/1.java Stream操作/](https://zhhll.icu/2020/java基础/java8/1.java Stream操作/)Stream又称为流,可以将集合转换为一种流,对集合中的每个元素进行一系列的流式操作,流并不存储元素,对流的操作也不会修改数据源。像count()、max()、min()、sum()这些内部其实也是使用的reduce。数据源 ------转换为--》流----》进行中间操作----》终止操作。原创 2023-11-17 10:29:04 · 399 阅读 · 0 评论 -
反射之Type类
Type getOwnerType() 返回的是类型所属的类型,这个所属类型就像是 Map.Entry的所属类型是MapType[] getActualTypeArguments() 获取参数化类型的类型变量或是实际类型列表,如List。D getGenericDeclaration() 获取声明该类型变量的原始类型,例如class Test。Type getRawType() 返回参数化类型中的原始类型,如List。Type接口是所有类型的父接口,有四个子接口和一个实现类。原创 2023-11-15 11:46:34 · 215 阅读 · 0 评论 -
java网络IO
服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待,直到服务器端的处理线程线程上一个请求的处理。同步和非同步是操作系统级别的,主要描述操作系统在收到程序请求网络IO操作后,如果网络IO资源没有准备好,该如何响应程序。同一时间,服务器只能接收一个客户端的请求信息,第二个客户端需要等待服务器接收完第一个请求数据后才会被接收。阻塞和非阻塞是程序级别的,主要描述程序请求操作系统IO操作后,如果网络IO资源没有准备好,程序如何处理。同步IO不响应程序,直到网络IO资源准备好。原创 2023-11-08 10:08:31 · 366 阅读 · 0 评论 -
NIO基本操作
从buffer中读取数据,由于切换为读模式时,limit为写入的position值,所以使用buf.limit就可以获取到写入的数据长度,读取时会根据读的数据来更新position值,标记读取的位置。NIO的缓冲区(字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区就是只可以读,直接缓冲区是为了加快I/O速度,以一种特殊的方式分配其内存的缓冲区。但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。在写入数据时,它是写入到缓冲区的。原创 2023-11-03 10:37:37 · 263 阅读 · 0 评论 -
java基础之IO操作
flush()方法用来强制要求OutputStream对象将暂存于内部缓冲区的数据立即进行实际的写入(一般情况下不需要手动的调用该方法,在内部缓冲区填充满了之后,会自动执行实际的写入操作,在调用close()方法时也会自动调用flush()方法)注意:该方法可能在向后移动的时候,没有达到指定字节就到达了流的末尾,所以并不一定会跳过指定的字节,该方法返回值为实际跳过的字节数。主要的方法是writeObject,存储对象的类、类的签名以及这个类及其父类中所有非静态和非瞬时的字段的值。原创 2023-11-01 10:32:24 · 176 阅读 · 0 评论 -
java基础之异常
checked异常,编译时异常,是由于编程与环境互动造成程序出错,如果出现此类异常,需要手动捕获处理,否则不能通过编译,如IOException、MalformedURLException、ClassNotFoundException等。当异常发生时,该线程会暂停,逐层退出方法调用,直到遇到异常处理器,异常处理器可以catch到异常对象,进行相应的处理。throw关键字用在方法内部,只能用于抛出一种异常,用来抛出一种异常,用于抛出方法或代码块中的异常。throw和throws。原创 2023-10-26 13:21:26 · 170 阅读 · 0 评论 -
java基础之你所不知道的字符串
在jdk6+中,当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用,否则,如果该字符串对象已经存在于java堆中,则将堆中此对象的引用添加到字符串常量池中,并且返回该引用;其在jdk6中,当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用,否则,将此字符串对象添加到字符串常量池中,并返回该字符串对象的引用。在使用字符串拼接之后生成的字符串如果调用intern()方法,就会返回该字符串所对应的常量池中字符串的地址值。原创 2023-10-22 11:39:06 · 191 阅读 · 0 评论 -
java基础之内部类
在创建成员内部类对象时,它会与创建它的外围对象有某种联系隐式引用(内部类对象会秘密的捕获一个指向外部类的引用,通过这个引用可以用来访问外部类的成员),通过这个隐式引用可以访问外部类的所有成员。静态内部类,内部类对象与外部类对象之间没有联系,将内部类声明为static,普通的内部类对象隐式的保存了一个引用,指向创建它的外部类对象,当内部类是static的时候,意味着。内部类是一种较为特殊的类形式,定义在另一个类中的类,叫做内部类,是主类的一部分,可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性。原创 2023-10-16 09:55:30 · 170 阅读 · 0 评论 -
java基础之接口和抽象类
抽象类可以包含实例变量,可以是public的也可以是private的,且可以包含非final的,非抽象方法可能引用这些变量。接口中的所有方法隐式为抽象的(java8出现了默认方法,为非抽象的);默认方法允许在不破坏已使用接口的代码的情况下,在接口中新增方法,必须用default修饰符来修饰方法。在java8之前的接口只允许有抽象方法,是一个完全抽象的类,没有提供任何实现。在java8之前只能有抽象方法,java8之后可以有默认方法和静态方法。抽象类中可以包含具体的方法,当然也可以不包含抽象方法。原创 2023-10-12 14:17:14 · 95 阅读 · 0 评论 -
java基础之组合和继承
field被分配了不同的存储空间,Child其实是存在两个filed属性的:本身的以及父类的,但是在引用Child的field的时候,默认的field属性是来自于本身的,如果要获取父类的该实例变量,需要使用super.field来显示地指定获取父类实例变量。java采用后期绑定,在运行时根据对象的类型进行绑定,在运行时判断对象的类型,从而调用方法,在编译时编译器不知道对象的类型,由于每次调用方法都要进行搜索,时间开销较大,所以虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。原创 2023-10-08 10:29:22 · 176 阅读 · 0 评论 -
java基础之对象
对象引用存储在栈内存中,但对象保存在堆内存中。创建一个对象时,只需new关键字实例化对象,执行代码时,会自动在堆中进行内存分配。boolean、char、byte、short、int、long、float、double这些都是基本数据类型,基本数据类型不需要使用new关键字来创建对象,直接存储值,存储在栈内存内。这些存储的方式是将对象转存于另一个介质中,并在需要时恢复成常规的、基于RAM的对象。上例中,引入了一个新的类型,我们可以通过new关键字来创建一个这种类型的对象,创建对象的过程称为类的实例化。原创 2023-10-03 07:27:11 · 172 阅读 · 0 评论 -
java zip压缩
原文链接 [https://zhhll.icu/2022/java基础/IO/3.zip压缩/]## zip压缩zip文档可以以压缩格式存储一个或多个文件,可以使用ZipInputStream读取Zip文档,使用ZipOutputStream来写入到Zip文件中原创 2022-04-26 10:42:11 · 1548 阅读 · 1 评论 -
java异常
原文链接 [https://zhhll.icu/2020/java基础/面向对象/13.java基础之异常/]## 异常当异常发生时,该线程会暂停,逐层退出方法调用,直到遇到异常处理器,异常处理器可以catch到异常对象,进行相应的处理原创 2022-04-22 14:27:04 · 534 阅读 · 1 评论 -
java字符串
原文链接 [https://zhhll.icu/2020/java基础/面向对象/12.java基础之字符串/]String是一个final修饰的不可变类,其属性也是final的,底层使用char数组存储原创 2022-04-21 15:56:35 · 372 阅读 · 1 评论 -
final关键字
原文链接 [https://zhhll.icu/2021/java基础/面向对象/11.final关键字/]## final关键字final可以用来修饰变量、方法和类### final方法final方法的作用是防止子类通过重写改变方法的行为。 类中所原创 2022-04-20 14:24:44 · 388 阅读 · 1 评论 -
java构造器
原文链接 [https://zhhll.icu/2021/java基础/面向对象/2.java基础之构造器/]java构造器原创 2022-04-15 15:13:57 · 604 阅读 · 1 评论 -
java数组
原文链接 [https://zhhll.icu/2021/java基础/面向对象/8.java基础之数组/]数组数组的本质是一个相同数据类型的元素集合。元素是数组的组成部分,数组中每一个元素都可以使用唯一的索引值来访问,这个索引值也可以叫做数组下标。数组是很多集合类的底层存储结构,在了解java集合类之前大家先了解一下数组吧。数原创 2021-01-23 21:19:36 · 252 阅读 · 1 评论 -
java8流式操作
Stream又称为流,可以将集合转换为一种流,对集合中的每个元素进行一系列的流式操作,流并不存储元素,对流的操作也不会修改数据源数据源 ------转换为--》流----》进行中间操作----》终止操作> 多个中间操作可以连接起来形成一个流水线,除非流水线触发终止操作,否则中间操作不会执行任何处理,在终止操作时一次性全部处理原创 2021-01-16 11:05:44 · 1935 阅读 · 1 评论 -
java8函数式编程
原文链接 [https://zhhll.icu/2020/java基础/java8/2.java基础之函数式编程/]函数式编程函数式编程强加了额外的约束,即所有数据必须是不可变的:设置一次,永不改变。将值传递给函数,该函数然后生成新值但从不修改自身外部的任何东西,不可变对象和无副作用范式解决了并发编程中最基本和最棘手的问题之一。Lambda表达原创 2021-01-15 23:37:30 · 811 阅读 · 3 评论 -
java反射之Type接口
原文链接 [https://zhhll.icu/2020/java基础/反射/2.反射之Type/]Type类Type接口是所有类型的父接口,有四个子接口和一个实现类。Class类比较常见,表示的是原始类型。表示的Java类在JVM里表现为一个Class对象ParameterizedType表示的是参数化类型,如List这种带有泛型的类型。ParameterizedType接口原创 2021-01-13 21:49:56 · 660 阅读 · 1 评论 -
java NIO操作
原文链接 [https://zhhll.icu/2020/java基础/IO/2.NIO基本操作/]NIO早在JDK1.4中就已经提出来了(JSR51),在JDK1.7中对NIO进行了补充类库NIO.2(JSR 203)同步非阻塞**阻塞与非阻塞的区别:**- **阻塞时,在调用结果返回时,当前线程会被挂起,并在得到结果之后返回** 传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执原创 2021-01-11 21:59:42 · 486 阅读 · 1 评论 -
java IO操作
原文链接 [https://zhhll.icu/2020/java基础/IO/1.java基础之IO操作/]用户进程发起请求,内核接收到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数据后再响应客户端。数据输入到buffer需要时间,从buffer复制数据至进程也需要时间,根据在这两段时间内等待方式不同,I/O动作可分为五种模式- 阻塞I/O- 非阻塞I/O- I/O复用- 信号驱动I/O- 异步I/O原创 2021-01-09 12:17:32 · 1018 阅读 · 2 评论 -
java继承
原文链接 [https://zhhll.icu/2020/java基础/面向对象/5.java基础之继承/]为了避免重复代码太多,导致代码不好维护,大家需要学会如何复用代码,代码复用的两种方式,组合和继承原创 2021-01-06 23:08:32 · 244 阅读 · 1 评论 -
java内部类
原文链接 [https://zhhll.icu/2020/java基础/面向对象/9.java基础之内部类/]内部类是一种较为特殊的类形式,定义在另一个类中的类,叫做内部类,是主类的一部分,可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性原创 2021-01-04 19:55:28 · 262 阅读 · 1 评论 -
java接口和抽象类
原文链接 [https://zhhll.icu/2020/java基础/面向对象/7.java基础之接口和抽象类/]抽象类抽象方法的声明没有方法体。包含抽象方法的类叫做抽象类。在java8之前的接口只允许有抽象方法,是一个完全抽象的类,没有提供任何实现原创 2021-01-03 21:29:20 · 358 阅读 · 1 评论 -
java重载与重写
原文链接 [https://zhhll.icu/2020/java基础/面向对象/6.重载与重写/]重载与重写java中有overload重载和override重写重载重载是指一个类中有多个名称相同但是参数列表不同的方法(参数列表不同是指参数个数或类型不同)重写重写是指子类中的方法与父类中的某个方法名称和参数完全相同,通过子类创建的实例对象将父类中的这个方法覆盖掉,是面向对象多态性的一种表现。原创 2021-01-02 21:39:31 · 306 阅读 · 1 评论