java基础
蚂蚁雅嘿
这个作者很懒,什么都没留下…
展开
-
CompletableFuture
CompletableFuture:相关知识点记录。原创 2024-04-29 14:35:32 · 104 阅读 · 0 评论 -
记一次异步编程类CompletableFuture使用案例
下面记录了一次,多线程处理处理一个业务的例子,并且要等待所有异步子线程执行完成后,主线程才能继续往下执行。CompletableFuture 是jdk8进入的一个异步变成工具,可以实现多线程编程。supplyAsync:异步线程有返回值;runAsync:异步线程没返回值。原创 2023-08-21 10:26:39 · 192 阅读 · 0 评论 -
java对大文件分片上传
这里记录一下,Java对大文件的切分,和后端接口分片上传的实现逻辑正常,前后端分离的项目其实是前端去切分文件,后端接口接收到切分后的分片文件去合并,这里都用java来记录一下。特别说明:我这里用的是zip包的上传,里面是音频文件,如果你的文件是单个文件,切分和合并文件逻辑都是一样的,只是不用后续的解压。原创 2023-08-15 17:28:32 · 2416 阅读 · 1 评论 -
记一次excel上传示例
excel poi原创 2023-07-19 16:35:48 · 85 阅读 · 0 评论 -
文件流的最简单应用
计算机能够存储的最小数据单位是字节,所有的文件数据都是字节,一个文件的所有数据可以看成一个字节数组。UTF-8编码 一个汉字3个字节 一个英文字符1个字节。GBK编码 一个汉字2个字节,一个英文字符1个字节。原创 2023-05-25 11:51:06 · 87 阅读 · 0 评论 -
支持相同key的Multimap
1. ArrayListMultimapArrayListMultimap可以支持key相同的键值对,并自动将value转为list。例如: Multimap<String, Integer> multimap = ArrayListMultimap.create(); multimap.put("a",1); multimap.put("b",2); multimap.put("c",3); multimap.put("a",4); multimap.put("a",5);原创 2022-04-29 18:16:49 · 584 阅读 · 0 评论 -
JAVA8新特性常用的方法简单梳理
1. Stream的filter方法实现对集合元素的过滤List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Stream<Integer> integerStream = list.stream().filter(a -> a > 3);List<Integer> list1 = integerStream.collect(Collectors.toList());System.out.pr原创 2021-05-27 10:43:40 · 225 阅读 · 0 评论 -
java中的==和equals的区别
1. 用==做比较如果比较的都是基础数据类型,那么比较的就是他们的值。如果比较的是包装类或String类,那么比较的是两个对象的内存地址。如果比较的一个是基础数据类型,一个是包装类,那么包装类会拆箱为基础数据类型进行比较。举例:int a =10;int b = 10;System.out.println(a == b);比较的是a和b的值都是10,所以会输出true;String a = "123";String b = "123";System.out.println(a =原创 2020-11-15 22:30:57 · 275 阅读 · 0 评论 -
序列化和反序列化
1.概念把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。对象的序列化主要有两种用途:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等原创 2020-11-11 22:29:16 · 252 阅读 · 0 评论 -
并发工具CountDownLatch和CyclicBarrier
1. 等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。背景:在jdk1.5之前中的join方法可以实现让当前线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。例如:public class Test2 { public static void main(String[] args) throws InterruptedException { Th原创 2020-10-29 10:09:48 · 128 阅读 · 0 评论 -
深入理解synchronized
使用synchronized的方式synchronized(lockObject){}public synchornized void test(){ //代码}但这里需要指出的是,无论是对一个对象进行加锁还是对一个方法进行加锁,实际上,都是对对象进行加锁。对于synchronized这个关键字,可能之前大家有听过,他是一个重量级锁,开销很大,建议大家少用点。但大家可能也听说过,但到了jdk1.6之后,该关键字被进行了很多的优化,已经不像以前那样不给力了,建议大家多使用。基于转载 2020-10-19 21:25:49 · 133 阅读 · 0 评论 -
理解ThreadLocal和底层实现
一、定义从jdk的官方文档中的描述:ThreadLocal类是用来提供放线程内部的局部变量,这样变量在多线程环境下访问(通过set和get访问)时能保证各个线程间的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static 类型的,用来关联线程和线程上下文。我们可以得知ThreadLocal的作用是提供线程内的局部变量,不同的线程之间不会相互干扰。这种...原创 2020-04-15 01:18:13 · 433 阅读 · 1 评论 -
理解JVM和GC回收机制
一、JVM是什么?java虚拟机(java virtual machine,JVM)一种能够运行java字节码的虚拟机。作为一种编程语言的虚拟机,实际上不只是专应用于java语言,只要生成的编译文件匹配JVM对加载编译文件格式要求,任何语言都可以JVM编译运行,比如:kotlin,scala等。JVM有很多不只是Hotspot,还有JRockit、J9等等。二、JVM的基本结构JVM由3个...原创 2020-04-08 20:56:57 · 174 阅读 · 0 评论 -
利用jdk8新特性对代码的优化
public class MyTest { //情景:实现list中的元素的过滤,求出集合中age>=30和salary>=300的元素 List<TestUser> userList = Arrays.asList( new TestUser("张三",200.1,20), new TestUser("李四"...原创 2020-04-04 11:55:56 · 255 阅读 · 0 评论 -
ArrayList和LinkList
一、ArrayList相关知识ArrayList是Java集合常用的数据结构之一,继承自AbstractList,实现了List,RandomAccess、Cloneable、Serializable等一系列接口,支持快速访问,复制和序列化。底层是基于数组实现容量大小动态变化,允许null值存在。是序的。ArrayList内部是由数组是实现的,而LinkList内部是由循环双向链表实现的。...原创 2020-02-28 16:00:37 · 266 阅读 · 0 评论 -
HashMap为什么是线程不安全的
jdk1.7中HashMap的transfer函数如下:void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) {...原创 2020-02-25 11:11:14 · 115 阅读 · 0 评论 -
HashMap底层结构和实现原理
jdk1.8的HashMap的底层结构HashMap的结构是数组+链表+红黑树当数组中的元素发生hash冲突的时候,当前相同的下标的数组元素上会形成链表结构,jdk1.8采用的是尾插法即在每个entry后依次加入新的entry,增加nextnode指向下一个entry。当链表中的元素大于等于8个时候会形成红黑树结构,(这也是jdk1.7和1.8的主要区别之一)。HashM...原创 2020-02-22 16:00:18 · 319 阅读 · 0 评论 -
HashMap 1.7和1.8的区别
底层数据结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。扩容后数据存储位置...原创 2020-02-21 14:58:57 · 620 阅读 · 0 评论 -
java中int与Integer用==比较详解
前言: 越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天...转载 2020-02-21 10:40:09 · 766 阅读 · 0 评论