java
今天的砖很烫
两耳不闻窗外事,一心只读圣贤书。
展开
-
Java 信号量(semaphore)搭配CountDownLatch 实现多线程处理循环内逻辑并限制创建线程数
Java 信号量(semaphore)搭配CountDownLatch 实现多线程处理循环内逻辑并限制创建线程数使用场景for循环中的处理逻辑较慢,这个时候可以在for循环中创建线程实现多线程处理数据,结合CountDownLatch 可以等待所有线程全部执行结束之后主线程再执行。但是有的时候循环次数比较多,并不适合循环创建,因为线程会创建太多。比如下面这段代码 ExecutorService threadPools = Executors.newFixedThreadPool(20);原创 2021-10-13 17:09:56 · 603 阅读 · 0 评论 -
多线程并发安全问题详细解释
多线程并发安全问题详细解释基础概念简单理解比如:打开任务管理器可以看到QQ.exe,在windows操作系统中,运行在内存中的exe文件就是一个进程(受操作系统管理的基本运行单元);线程就好像是QQ.exe在运行时同时运行的子任务,比如:好友视频线程、下载文件线程、数据传输线程、发送表情线程等。简单理解:任务就好像一件事情,线程就好像找了一个人做这件事情。以此类推:多线程就好像是找了多个人做一件事情,或者多个人做多个事情。串行和并行对比什么是串行:一个时间只找一原创 2021-10-03 12:13:18 · 257 阅读 · 0 评论 -
CompletableFuture 异步编排介绍,附实际应用demo
异步编排APIAmdahl定律Amdahl加速定律的基本出发点是:1.对于很多科学计算,实时性要求很高,即在此类应用中时间是个关键因素,而计算负载是固定不变的。为此在一定的计算负载下,为达到实时性可利用增加处理器数来提高计算速度;2.因为固定的计算负载是可分布在多个处理器上的,这样增加了处理器就加快了执行速度,从而达到了加速的目的。在此意义下,1967年Amdahl推导出了固定负载的加速公式。 [2]阿姆达尔定律是计算机系统设计的重要定量原理之一,于1967年由IBM360系列机的主要设计者阿姆达尔原创 2021-10-03 11:57:38 · 514 阅读 · 0 评论 -
JAVA基础超级详细的总结
https://www.cnblogs.com/schiller-hu/p/10662429.html转载 2021-02-21 20:51:31 · 193 阅读 · 0 评论 -
解决高并发问题的几点思路
解决高并发的几种思路高并发是什么可以这么理解高并发,在同一时间,有大量用户同时访问同一个URL,容易导致服务器和数据库资源被占满崩溃,数据库的存储和更新结果跟理想不一致,例如出现重复的数据记录,多次添加记录等数据错乱问题。高并发的处理策略服务器服务器可以做负载均衡集群,分摊系统的工作,减少单一服务器的资源负担数据库通过表设计防止并发导致数据错乱表设计成分库分表,分库减少单一数据库的负担,分表防止因数据量增多而降低数据库的性能数据库读写分离将数据存到redis缓存原创 2021-02-18 13:17:32 · 696 阅读 · 0 评论 -
Optional类介绍、源码
啊啊啊原创 2020-09-13 23:43:46 · 226 阅读 · 0 评论 -
Jdk8——Stream API,创建、中间操作、终止操作详细说明
强大的Stream API1. Stream API说明Java8中最重要的两个改变一个是Lambda表达式,一个则是Stream APIStream API(java.util.stream)把真正的函数式编程风格引入Java中,这是目前为止Java类库最好的补充,因为Stream API可以极大的提供Java程序员的生产力,让程序员写出更高效、干净、优美、简洁的代码。Stream 是Java8中处理集合的关键概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数原创 2020-09-12 18:17:34 · 1286 阅读 · 0 评论 -
Java8新特性——Lembda表达式-> 和方法引用、构造器引用、数组引用 :: 的写法说明
Java8新特性——Lembda表达式package com.ntt.sts;import org.junit.Test;import java.util.Comparator;public class Test20200910 { @Test public void test(){ Runnable runnable = new Runnable() { @Override public void run()原创 2020-09-12 00:24:38 · 677 阅读 · 0 评论 -
Java中三种代理模式,静待代理、动态代理、Cglib代理
Java中三种代理模式,静待代理、动态代理、Cglib代理代理模式代理(Proxy)是一种设计模式,提供了间接对目标对象进行访问的方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能.这就符合了设计模式的开闭原则,即在对既有代码不改动的情况下进行功能的扩展。举个例子来说明代理的作用:明星与经纪人之间就是被代理和代理的关系,明星出演活动的时候,明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解原创 2020-09-10 21:27:16 · 203 阅读 · 0 评论 -
反射的初步应用——静态代理以及动态代理例子
反射的应用:动态代理动态代理,在编译时候不指明代理类,而在运行时确定。静态代理:代理类和被代理类都是在编译期间就确定下来,这样不利于程序的拓展,同时每一个地阿里类只能为一个接口服务,这样一来程序开发必然会产生过多的代理,最好可以通过一个代理类完成全部的代理功能。动态代理和静态代理相比的优点:抽象角色中(接口)声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样我们就可以更加灵活和统一的处理众多方法。静态代理举例:package com.ntt.sts;import原创 2020-09-10 20:58:37 · 247 阅读 · 0 评论 -
Java基础——对反射机制的初步理解,通过反射调用类的私有结构的方法
JAVA反射Java Reflection反射是被视为动态语言的关键,反射机制允许程序在执行期间借助Reflaction API取得任何类的内部信息,并且能直接操作任意对象的内部属性和方法。动态语言:是一类在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有函数可以被删除或是其他结构上的改变,在运行时代码可以根据某些条件改变自身结构。除了静态语言。Object C php 等。静态语言,运行时候不能改变结构的原因,JAVA C++但是JAVA提供了反射机制。反射概原创 2020-09-08 00:07:05 · 422 阅读 · 0 评论 -
Java基础,基于TCP和UDP协议的Socket的使用方法
TCP的使用 @Test public void client() throws IOException { //创建socket对象,指明服务器的ip和端口号 InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); Socket socket = new Socket(inetAddress,8899); //获取一个输出流,用于输出数据原创 2020-09-06 19:56:59 · 349 阅读 · 0 评论 -
RandomAccessFile的特性,以及应用场景
RandomAccessFileRandomAccessFile直接继承了Object类,实现了DataInput 和DataOutput接口它既可以作为输入流又可以作为一个输出流package com.ntt.sts;import org.junit.Test;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessF原创 2020-09-06 15:09:03 · 425 阅读 · 0 评论 -
对象的序列化与反序列化——ObjectOutputStream、ObjectInputStream
对象流作用:用于存储和读取基本数据类型对象或者对象的处理流,它的强大之处是将java中的对象写入到数据源中,也能发数据源中的数据还原回来。序列化与反序列化。对象的序列化机制:序列化:允许将内存中的Java对象转化为平台无关的二进制流,从而允许把这种二级制流 持久的保存在磁盘上,或者通过网络将这种二进制流传输到另一个网络节点。反序列化:当其他程序获取这种二级制流,就可以恢复成原来的Java对象。public class ObjectInputStreamOutputStreamT原创 2020-09-05 00:26:10 · 272 阅读 · 0 评论 -
InputStreamReader、OutputStreamReader转换流的使用
InputStreamReader、OutputStreamReader转换流的使用转换流:属于字符流InputStreamReader :将一个字节的输入转化为字符的输入流OutputStreamReader : 将一个字符的输入转化为字节的输入流作用:提供字节流和字节流主之间的转换编码:字节、字节数组转化为字符数组字符串解码:字符数组、字符串转化为字节、字节数组public classInputStreamReaderTest{ @Test public void test原创 2020-09-04 23:16:51 · 1335 阅读 · 1 评论 -
集合的体系结构——集合的基础知识
为什么需要集合面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对多个对象进行存储,因为数组有一些弊端,所以引入了集合。集合和数组都是对多个数据进行存储的结构,简称Java容器。数组的特点,一旦初始化之后,其长度就固定了;声明数组的时候,需要指定数组的类型,其元素的类型也就确定了。比如:String [] arr; int [] arr; Object [] arr;3. 数组的缺点(反过来就是集合的优点)一旦初始化之后长度就不可修改了;数组中提供了方法非常的有限,对于添原创 2020-09-02 21:50:29 · 1384 阅读 · 0 评论 -
使用字节流和缓冲流复处理文件提高读写速度
对于文本文件使用字符流进行处理,对于非文本文件使用字节流进行处理。原创 2020-09-02 21:35:06 · 687 阅读 · 0 评论 -
IO流基础---字符流的写入写出
IO流IO:数据的写入写出,(数据持久化)针对操作数据的特点不同,采用不同的流。File类的使用File类的一个对象,代表一个文件或者一个文件目录。原创 2020-09-01 21:29:02 · 744 阅读 · 0 评论 -
泛型(Generic)总结
泛型(Generic)jdk1.5新增特性在jdk1.5之前没有泛型,会导致集合中加入的数据类型不统一,并且不会出现编译错误,但没有问题恰恰就是最大的问题。List<Stirng> list = new ArrayList<String>();所以引入了泛型,(泛型的类型是一个类,不能是基本数据类型,使用包装类)指定了某一种类型就不能加入另外一种类型,在编译的时候就会进行类型检查,保证了数据的安全。泛型的基本使用Map<String,Object>原创 2020-08-30 22:30:28 · 156 阅读 · 0 评论 -
操作Collection和Map的工具类——Collections
Collections:操作Collection和Map的工具类** Collections和Collection的区别。**Collections是一个工具类,用来操作Collection和Map。Collections类中的常用方法。reverse(List): 反转List中元素的顺序shuffle(List): 将集合中的顺序随机排列(每次都是随机的)sort(list): 按照自然排序来进行排序,如果想要换一种方式需要使用sort(list,Comparator)swap(i,j)原创 2020-08-30 16:24:11 · 236 阅读 · 0 评论 -
Map集合下HashMap、Properties的遍历操作
Map集合的遍历操作HashMap的遍历Map map = new HashMap();map.put(1,"suitianshuang");map.put(2,"tianshuangsui");map.put(3,"shuangtiansui");//遍历所有的key集:使用keySet(),(map集合的key使用的是Set进行存储的)Set set = map.keySet();iterator iterator = set.iterator();while(iterator.ha原创 2020-08-26 22:28:34 · 267 阅读 · 0 评论 -
Map接口下继承树特点分析,结构分析
Map接口下继承树特点分析,结构分析Map:双列数据,存储key-value数据 --类似于函数 y = f(x)HashMap :Map的主要实现类,线程不安全,效率高,可以存储null的key和valueLinkHashMap:在原有的hashMap的基础上,添加了一对指针,指向前一个和后一个数据。对于频繁的遍历操作,LinkedHashMap的的效率要高于HashMap.TreeMap:保证按照添加的key-value对进行排序,实现排序遍历(按照key来排序)。底层使用的是红黑树。原创 2020-08-26 21:45:26 · 375 阅读 · 0 评论 -
Set接口下的HashSet、LinkedHashSet、TreeSet分析
Set接口下的HashSet、LinkedHashSet、TreeSet分析简介Set接口:存储无序、不可重复的数据HashSet:线程不安全,可以存储null值LinkedHashSet:是HashSet的子类,遍历内部的数据时,可以按照添加的顺序遍历。TreeSet:可以按照添加的对象指定属性进行排序。...原创 2020-08-25 21:47:39 · 286 阅读 · 0 评论 -
List接口下的ArrayList、LinkedList、Vector三者比较
ArrayList、LinkedList、Vector三者比较Collection接口下的List接口list集合的特点:存储有序、可重复的数据,自动扩容,“动态数组”ArrayList:是List接口的一个主要实现类,他是一个线程不安全的集合,所以效率较高。 底层仍然使用的是Object[]数组存储。jdk1.7中ArrayList 在创建对象的时候就创建了一个数组,默认大小为10,每次默认情况下扩容为原来的1.5倍。(相当于新创建了一一个数组,并且将原有的数据放进新的数组中去)jdk1.原创 2020-08-25 19:28:06 · 196 阅读 · 0 评论 -
Iterator的使用和原理,增强for循环的原理
Iteratoriterator对象成为迭代器——设计模式的一种,主要用于遍历Collection集合中的元素。迭代器被定义为提供一种访问一个容器(container)对象中各个元素,而不需要暴露该对象的内部细节。迭代器模式,就是为容器而生。使用iterator遍历集合//省略往集合中刚入元素...Iterator iterator = coll.iterator();//不推荐使用for(int i = 0;i<list.size;i++){ System.out.println原创 2020-08-25 00:23:42 · 421 阅读 · 0 评论 -
数组转化为集合的方式asList()
String[] arr = {"abc","ccc","ddd"}; /*把数组变成list集合的好处? * 可以使用集合的思想和方法来操作数组中的元素 * 注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的 * 如果增删了,那么会发生不支持操作异常 */ List<String> list = Arrays.asList(arr); //list.add("qq"); 不可用 /* ..原创 2020-08-24 23:22:33 · 1077 阅读 · 1 评论 -
Java注解(Annotation)简介(待补充)
注解的概述注解是jdk5.0新增加的支持,注解是代码中的特殊标记。JPA(java持久化框架)就是基于注解的,注解是一种趋势,因为极大程度的简化了程序员编写代码的行数。框架 = 注解 + 反射 + 设计模式。注解代替的是原本的xml文件。SpringBoot之所以简单就是因为使用注解代替了繁琐的xml配置。如何自定义注解(Annotation)注解声明为@interface。内部定义成员,通常使用value来表示。可以指定成员变量的默认值,使用default定义。如果自定义注解没有成员原创 2020-08-23 14:00:22 · 244 阅读 · 0 评论 -
System类、BigInteger类 和 BigDecimal类
System类System类的构造器是私有的,所以不可以实例化,System类的方法都是static的所以直接使用类型.方法就可以调用了。System.gc()请求系统进行垃圾回收,但是是否会回收是取决于系统中垃圾回收算法的设计以及系统执行的情况,并不是一定就会进行垃圾回收。此外系统类还可以获得程序运行的系统的相关信息。Math类基本上也都是静态的方法,其方法的参数和返回值类型一般基本都是double类型的。BigInteger类 和 BigDecimal类Integ原创 2020-08-22 17:09:17 · 179 阅读 · 0 评论 -
Comparable自然排序与Comparator定制排序
自然排序像String 这样的包装类实现了Comparable接口,重写了compareTo()方法给出了比较两个对象大小的方式。可以直接调用sort方法进行排序。如果想排序自定义的类就需要自己重写compareTo()方法。自定义排序时候的规则是小的返回负数,大的返回正数,相等的返回0。String[] arr = new String[]{"AA","BB","DD","CC","ZZ","GG"};//数组排序System.out.println("Arrays.sort(arr)");原创 2020-08-22 16:45:11 · 200 阅读 · 0 评论 -
时间相关常用工具类API
jdk 1.8以后新的常用日期时间API//获取当前日期(年月日)、时间(时分秒)、日期➕时间(年月日时分秒)LocalDate localDate = LocalDate.now();LocalTime localTime = LocalTime.now();//相较于另外两个用的频率要高一些。LocalDateTime localDateTime = LocalDateTime.now();通过调用get方法,获取更多的时间。这三个类有点类似于CalendarInstant 类就类似原创 2020-08-22 14:42:48 · 286 阅读 · 0 评论 -
java基础——对String的理解
String 代表不可变的字符序列(笔记)String 类型 常量池, 唯一一个可以直接String t1 = “abc” 而不需要new 的类,自面量的概念,常量池,Stringa1= “abc” 和String a2 = “abc” a1 和 a2 是使用同一块内存的,都是abc。当对现有的字符串进行重新操作的时候,需要新指定新的内存区域进行赋值,不能在原有的基础上进行赋值。String a = “abc” a += “def”;现在的a和原来的a不在同一块内存区域。但是现在的a指向了新的原创 2020-08-21 23:07:58 · 689 阅读 · 0 评论