- 博客(27)
- 收藏
- 关注
原创 LinkedList源码笔记
增删这些操作基本上就是修改节点中next和pre指针的指向,这也没啥可说的。和arraylist效率差不多,但是linkedlist显然不需要扩容。内部主要就是这三个成员变量 ,本质就是一个双向链表,没啥可说的。没办法,只能顺着索引一个个往下找,所以效率很低。
2022-11-06 09:53:33
138
原创 Java中如何向Integer集合添加String类型数据?
Java中如何向Integer集合添加String类型数据?- bravo1988的回答 - 知乎 https://www.zhihu.com/question/553126951/answer/2672693404。
2022-11-05 08:57:10
208
原创 ArrayList源码学习总结
第三 特别注意,扩容是把原来数组的内容拷贝到一个新数组中去,这个新数组的长度是扩容后的长度;注意,是新建了一个数组,并不是扩大原来数组的长度。第二,新增元素前需要先扩容,扩容机制很简单,如果长度够则使用原来的数组,如果数组长度不够则扩大1.5倍,还不够则直接扩大到所需长度。第一,ArrayList内部实现是Object数组,这算是一个常识了;第四 删除一个元素,如下;可见,源码写的也就这样,并不怎么优雅。第五,增强型for循环会转换成迭代器,或者说是通过迭代器实现的。
2022-10-26 21:41:53
159
原创 Spring 异步任务简明教程
线程池就不多解释了,这里用的是Spring提供的线程池;也可以用java库提供的;异常处理器会捕获异步任务抛出的异常进行处理;当然前提是你得抛出;最后,在controller层调用管理器中的submit方法即可。很简单,interface的代码就省略了。
2022-10-21 09:53:02
793
原创 Java中枚举的简单理解
枚举类型 实际 继承自java.lang.Enum, 实际上就是在类的代码中同时实例化对象。以下代码,创建一个类Color继承自Enum, 并同时实例化两个对象。
2022-10-17 10:26:57
152
原创 synchronize和volatile关键字
6 synchronize关键字保证了内存可见性,在释放锁时,所有写入都会写回内存,而获得锁后,都会从内存中读取最新数据。5 可重入性:获取锁之后,如果在代码块中需要调用其他代码块,且其他代码块也需要获取相同的锁,则可以直接执行,无需等待。2 在一个类中,在对象方法前加synchronize关键字,执行该方法的代码需要获取当前对象的锁。3 在一个类中,在类方法前加synchronize关键字,执行该方法的代码需要获取类对象的锁。4 在代码块中加synchronize关键字,需要指明要获取哪个对象的锁。
2022-10-12 11:29:52
134
原创 多线程--竞态条件和内存可见性
开启两个线程,对同一个 CountRunnable对象中的i的值进行同时修改,如下。结果应为30,但是每次结果并不相同,多为20-30之间。实现一个Runnble接口,如下。
2022-10-12 11:00:54
122
原创 创建线程的开销
默认一个线程的线程栈大小是1M,别小看这1M的空间,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。【创建一个线程默认需要消耗1M的内存,如果每个用户请求都创建一个线程,那么1024个用户就是1G了,并发量一大就扛不住了】
2022-10-12 09:54:12
2018
原创 Java静态代理
ProxyService内部有一个RealService成员,该成员的方法提供了正在的服务。RealService是真正提供服务的类/对象。
2022-07-30 16:05:19
156
1
原创 java 函数式编程
接口代码实现代码 单个参数可以省略括号。把代码块作为参数,代码块是一个函数式接口的实现 @FunctionalInterface 通知编译器这是一个函数式接口,编译器在编译时会进行检查实例:实现Function接口生成随机定长字符串...
2022-06-24 22:17:18
317
原创 Mybatis 二级缓存
补充:配置文件中,datasource的type类型如果设置成pooled,则是默认使用mybatis自带的连接池。一级缓存和二级缓存,一级缓存默认开启,以会话为单位,会话一旦关闭缓存也就会释放。 开启二级缓存,在mapper文件中设置LFU算法,最近最少使用...
2022-06-05 21:08:55
92
原创 Mybatis SelectKey和UseGeneratedKey的区别
useGeneratedKey只支持支持自增主键的数据库。 oracle只能使用selectKey
2022-06-05 08:58:53
296
原创 java JDBC 连接池
阿里巴巴Druid连接池的配置与使用配置文件:使用:其实,连接池不是什么很高深的概念。web服务器和数据库服务器之间的通信也要经过套接字。如果每次操作数据库时都要新建tcp连接太费时间,而且还要经过数据库用户和权限认证的过程。不如先把连接建好,并为数据库服务器端的套接字创建负责读写它的线程。这样,如果web服务器的某个线程需要和数据库服务器通信,直接向web服务端的一个已建好连接的套接字写东西或读东西就行了,数据库那端的线程会负责处理的。另外,DataSource类的官方描述是物理数据源的工厂,
2022-06-03 16:36:45
153
原创 java JDBC 批处理
如果不使用批处理的话,就要创建n个PreparedStatement对象,每执行一次增删改操作都要向数据库服务器发送一次数据,包括sql语句和参数,数据库收到sql和参数后会解析并执行。如果使用批处理,就只要想数据库服务器一次性发送一次数据,包括一条sql语句个n列参数,数据库服务器也只要解析一次sql语句,会大大提升效率。这里我们也可以看出来,PreparedStatement执行execute相关方法时,才会向套接字内写数据发送给数据库。在这里,我认为,批处理会把sql语句和参数都拼接起来,拼成一
2022-06-03 15:01:38
311
原创 java JDBC 事务
执行一次增删改查的操作前事务是自动开启的,jdbc 默认自动提交,即执行每条sql语句后都会提交一次。可以关闭自动提交,手动控制提交时机。
2022-06-03 13:32:51
337
原创 java JDBC Sql注入攻击
查询:sql注入攻击和PreparedStatement: 其实本质就是PreparedStatement会对参数中的特殊字符进行转义处理,而不是直接拼接。它使用一个?占位,代表一个参数。在设置参数时,如果参数是字符串,拼接sql语句时会自动为字符串加上引号以此表明这是一个字符串,同时对参数内自带的特殊符号会进行转义处理。...
2022-06-03 08:59:30
331
原创 java JDBC 基础五步骤
web服务器会为每一个客户端连接创建一个线程。当客户请求需要进行对数据库的操作时,就需要建立和数据库服务器的连接。这个连接也是使用TCP/IP协议,因为它也是一种网络传输。这个物理连接在Java中就对应了一个java.sql.Connection接口的实现类的对象。显然,数据库服务器肯定也是多线程的,它应该也会为每一个web服务器线程发起的连接创建一个线程。这样一个Connection对象就对应了一个web服务器线程和一个数据库服务器线程之间的连接。一个数据库服务器线程服务于一个web服务器线程,而一个w
2022-06-02 15:18:49
477
原创 java反射笔记
java虚拟机会在第一次使用一个类时将它加载到内存中,并创建该类的一个Class对象,这个Class对象只会创建一次。显然这个对象中包含了类的字段、构造方法、方法等信息。这是理解反射的关键。Class类是反射的核心类,它主要有以下方法:Class xxxClass = Class.forName(xxx类的完全限定类名); 加载指定类,并返回该类的Class对象的引用xxx xxxInstance = xxxClass.newInstance(); 使用默认构造方法创建该类的一个实例如果我们在程序运行时输入
2022-05-31 21:49:15
112
原创 理解文件IO和套接字
此部分参考《汇编语言》王爽 清华大学出版社以3.5英寸软盘为例:2面 * 80磁道 * 18扇区 * 512字节。对磁盘的访问由磁盘控制器进行,只能以扇区为单位对磁盘进行读写。BIOS提供了对磁盘读写的中断例程,为我们封装了对硬件的复杂操作,我们可以用它对磁盘进行读写。当然如果你熟悉底层硬件,精通如何控制磁盘控制器,你也可以自己写一个程序完成读写操作。中断例程为13h。以下是程序所需的参数:ah 存放13h的功能号(2是读扇区);al 读取的扇区数; ch 磁道号;cl 扇区号;dh 面号;dl 驱动器号;
2022-05-29 16:07:11
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人