
再学JAVA
文章平均质量分 59
再学JAVA
程序员·小李
不知道要干什么的时候,停一停,想一想;知道想要什么的时候,努努力,拼一拼。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入元空间
完成一次垃圾回收,此时O类型的两个对象已被清理,剩下的P类型的对象和类加载器的实例一起被复制到了Survivor区域。但是,此处虽然O类型不再使用,但是对应的元空间的内存占用不能被释放,因为这个类加载器,不仅仅负责O类型,还负责P类型,而P类型还存在实例,因此不可以被回收。此时,存在两个类型为O的对象,一个类型为P的对象,对应的类加载器的实例是深蓝色的那个圆。bootstrap类加载器和application类加载器是不会被回收的,而动态类加载器,在其负责加载的类对象不再使用时会被回收。原创 2023-03-07 23:07:43 · 1132 阅读 · 0 评论 -
内存泄漏分析及规避方法
这里使用i作为计数器,每创建1000个Person对象,就会把ArrayList重置一下,这样,上一轮的1000个对象就不在被引用,垃圾回收器就可以正常回收这些对象了。字符串的频繁拼接时,注意使用StringBuilder进行替换,因为每次拼接都会产生新的对象,然后存储在字符串常量池,而字符串常量池被分配在对内存中,可能导致堆溢出。内存泄漏就是堆内存中的某些对象,你虽然不再使用它们了,但是垃圾回收器还回收不了他们,长此以往内存就慢慢耗没了。一方面内存占用不可控,另外资源难以回收,因为对象一直被占用着。原创 2023-03-06 23:02:17 · 3257 阅读 · 0 评论 -
Stream的创生、处理、终结
mapToInt / flatMapToInt, mapToLong, mapToDouble转换成具体的类型流,具有统计学功能。检查allMatch, anyMatch, noneMatch,全部符合,存在符合,全不符合。reduce是对每个数据依次进行计算,可以带初始值,针对每个元素做一元或二元运算。distinct去重,只保留唯一的,类似于使用HashSet。flatMap将Stream中的集合展开,汇聚成单个元素的流。filter实现过滤,留下的都是。empty()方法创建空的流。原创 2023-02-23 19:54:42 · 309 阅读 · 0 评论 -
JVM垃圾回收
在标记的过程中,很可能还会被重新引用,或者产生新的对象,很容易和标记线程发生冲突,因此,stop the world简单粗暴,将暂停应用内的线程,开始正式标记工作。在对象上面维护一个引用计数器,每有一个引用指向自己,计数器+1,每有一个引用不再指向自己,计数器-1,垃圾回收那些计数器为0的对象。删除后,会空出内存位置,可以在空的位置继续创建对象,但是,来个占用内存较大的对象可能就没法创建了。将继续引用的对象标记为1,不再引用的对象保持为0,这样就可以回收标记是0的对象了。原创 2022-11-10 08:59:35 · 448 阅读 · 0 评论 -
《Java核心卷第十版》Java开发环境
1.JDK下载到JDK下载下载Java开发运行环境。2. JDK与JRE释疑JDK包含java代码编译器及JRE,可以编译并运行Java代码。(一般用于开发人员)JRE只是Java程序的运行环境,有了它就可以执行java程序了。(所有用户)3.JDK安装在执行安装程序后,需要将JDK的安装路径添加到环境变量里。可以在命令行执行以下命令检测JDK安装成功与...原创 2019-04-19 11:20:29 · 360 阅读 · 0 评论 -
《Java核心卷第十版》Java基本程序设计结构
1. 第一段Java程序需要注意:Java程序文件名必须与类名一致Java类名首字母大写2.注释使用//单行注释:/* */多行注释:3.数据类型共8种基本数据类型:int, short, long, byte, float, double, char, boolean长整型在数据末尾添加L表示长整型数据,...原创 2019-04-19 15:06:40 · 453 阅读 · 0 评论 -
Optional判空妙用
场景4, result!= null 但是 get(0) == null。场景5,result!场景3, result!= 0, 但是resultList == null。场景2,result!= null 但是 code!场景1, result = null。那么判空就赶紧用起来吧!原创 2022-09-07 19:58:09 · 828 阅读 · 0 评论 -
One bite of Stream(9)
先进行了一次二分组,划分出是否素食,然后素食和非素食内部根据Calories进行比较,找到最大的Dish,然后取到。在这里看,partitioningBy和groupingBy没有太大的区别,一个是多分组,另外一个是二分罢了。其实partitioning属于groupingBy的一种特殊情况,那就是二分,分成两组。相当于先进行了一次二分组,划分出是否素食,然后在素食和非素食内部再根据type进行分组。根据partitioningBy的条件,分为True和False各一组。2.先二分,再求算最大值。...原创 2022-07-21 07:42:01 · 185 阅读 · 0 评论 -
One bite of Stream(8)
DIET,NORMAL,FAT}首先,我们定义了一个Enum,用于表示不同的组。else}));然后根据不同的规则,返回了不同的枚举值,这样就可以按照自己的意愿进行分组了。原创 2022-07-21 07:03:49 · 166 阅读 · 0 评论 -
One bite of Stream(7)
同样的,summarizingLong()、summarizingDouble()也可以使用,对应的结果集为LongSummaryStatistics、DoubleSummaryStatistics。前面我们用到了counting()、maxBy()、minBy()、summingInt()、averagingInt(),现在使用summarizingInt()可以包含前面所有。joining()默认调用toString()方法,使用StringBuilder进行拼接,也支持使用分隔符进行拼接。...原创 2022-07-20 08:52:02 · 151 阅读 · 0 评论 -
One bite of Stream(6)
Arrays.stream()在创建流时,传入数组对象,基础类型会生成对应的IntStream、LongStream、DoubleStream。iterate会产生一个无界流(没有边界,如果不加控制就是死循环),这里使用limit控制了数量。前面我们都在讲如何过滤、匹配,统计、映射、收集等等,接下来看看怎么样生成Stream。两个入参,一个是初始值,第二个是递归算法,根据前一个值计算新的值。Stream.of()可以生成流,参数会逐个填充进去。......原创 2022-07-20 07:53:12 · 130 阅读 · 0 评论 -
One bite of Stream(5)
IntStream有一些扩展方法,例如sum(),average(),min(),max()可以很方便的完成reduce操作。这三个流分别用于解决Integer与int,Long与long,Double与double之间的装箱拆箱的问题。转而代之的是下面的IntStream,通过mapToInt转换成了IntStream。在通过IntStream进行reduce操作时,如果遇到元素不存在的情况怎么办?生成从start开始,到end-1之间的整数。生成从start开始,到end之间的整数。...原创 2022-07-19 23:40:44 · 151 阅读 · 0 评论 -
One bite of Stream(4)
代码】OnebiteofStream(4)原创 2022-07-19 23:14:59 · 123 阅读 · 0 评论 -
One bite of Stream(3)
可空类型也是可以理解的,如果Stream中没有元素,就无法执行这个函数,并且也没有给初始值,因而就没有结果。依次比较每个元素,直到最后一个。Stream可能没有元素,因而返回Optional。reduce有一个重载方法,可以不给定初始值,但是返回可空类型。本身有缩减的意思,这里有汇总的含义在里面。示例一计算所有元素的和。示例二计算所有元素的积。...原创 2022-07-19 22:43:09 · 131 阅读 · 0 评论 -
One bite of Stream(2)
Stream提供了allMatch(),anyMatch(),noneMatch(),findFirst(),findAny()功能,用于实现条件匹配与查询,一起来看看。当Stream中有满足条件的元素时,会返回任意一个满足条件的元素,否则Optional中没有元素。与findAny()类似,但返回第一个满足条件的元素,一般这个比较常用。ifPresent(Consumer)如果存在则执行。有->true->至少有一个符合要求。没有->false->均不符合要求。所有元素均符合->true。...原创 2022-07-19 22:16:31 · 271 阅读 · 0 评论 -
One bite of Stream(1)
想法不错,但是转换成字符串流的时候,我们会发现,每个字符串数组生成的是一个单独的流,最终的结果是List而不是我们想要的LIst.stream方法从一个List中构造出一个流,filter对其中的元素进行了过滤,满足Calories大于300的才会被留下,map是直接取到他们的Name,limit留下了前3个数据,collect用于将流收集起来,构造一个新的List出来。再例如,Stream中的元素是A类型,我想把每个元素转换成B类型,也可以使用map。原创 2022-07-19 08:57:49 · 180 阅读 · 0 评论 -
Java内存模型基础
假设有两个线程A和B并发执行,线程A有3个操作,他们在程序中的顺序是A1->A2->A3,线程B也有3个操作,B1->B2->B3。当没有同步操作时,线程A和线程B交替执行,但单个线程内的顺序依然保持代码顺序,即A1->A2->A3,B1->B2->B3。对于存储在共享空间的数据,每个线程都保存了一份“副本”,实际上读共享空间的数据读写均是通过副本的读写来完成的。如果是对象的成员变量,则在堆中存储。(即后一个执行的语句无需依赖前面执行的语句的结果),处理器可以改变语句对应的机器指令的执行顺序。原创 2022-04-25 07:43:01 · 192 阅读 · 0 评论 -
BigDecimal疑问解答
构造方式new BigDecimal(int)new BigDecimal(long)new BigDecimal(String.valueOf(double)) // 此处防止精度丢失new BigDecimal(String)精度丢失问题BigDecimal a =new BigDecimal(0.1);System.out.println("a values is:" + a);BigDecimal b =new BigDecimal("0.1"..原创 2022-03-02 22:26:21 · 511 阅读 · 0 评论 -
Java8中的函数式接口与Lambda表达式
函数式接口可以使用@FunctionalInterface进行标记,只能包含一个方法,还得是publicabstract方法。第二种属于成员函数,要求第一个参数必须与函数式引用的类型一致。第三种属于局部变量的函数引用,使用局部变量替换类型来引用方法,参数列表需要与引用方法的参数类型一致。consumer完成的是对元素的使用和处理,像一个消费者一样,无需返回值。function完成的是入参为指定类型,出参为另外一个类型的转换问题。predicate主要完成的是布尔类型的判断,二分的问题。......原创 2021-12-18 09:09:38 · 736 阅读 · 0 评论 -
Java8接口默认方法
在此之前,接口方法都是public abstract的,实现类必须实现所有方法。在java8之后,支持默认方法,提供默认实现。缺点在于没有成员变量,无法借助成员变量操作。interface Formula { double calculate(int a); // 使用default关键字给出了默认实现,实现类可以选择覆盖或者不覆盖这个方法 default double sqrt(int a) { return Math.sqrt(a); }原创 2021-12-18 09:03:21 · 910 阅读 · 0 评论 -
Java正则使用
正则表达式涉及Pattern和Matcher两个类,Pattern的构建Pattern pat= Pattern.compile("Java"); // 此处的Java就是正则表达式的模式Matcher的构建Matcher mat= pat.matcher("Java Test"); // 此处的字符串是用于验证的字符串验证是否匹配boolean found = mat.matches(); // check for a match获取所有...原创 2021-12-17 21:53:45 · 306 阅读 · 0 评论 -
参考Optional写一个NullableString
NullableStringpublic class NullableString { /** * 底层值 */ private final String value; public NullableString(String value) { this.value = value; } /** * 对外的非空操作 * @param consumer 执行语句 */ public .原创 2021-07-20 19:19:48 · 341 阅读 · 0 评论 -
Optional
使用示例public static void main(String[] args) { Optional<Integer> option1 = Optional.ofNullable(null); Optional<Integer> option2 = Optional.ofNullable(1); option1.ifPresent(System.out::println); // no print option2.ifPresent(S原创 2021-07-19 19:27:42 · 127 阅读 · 0 评论 -
DateTimeFormatter
格式化public static void main(String[] args) { final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); final DateTimeF原创 2021-07-19 19:12:25 · 4627 阅读 · 0 评论 -
ZonedDateTime
构造public static void main(String[] args) { ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println(zonedDateTime);}它的获取年月日,时分秒的方法同LocalDateTime获取时区信息public static void main(String[] args) { ZonedDateTime zonedDate.原创 2021-07-19 19:03:48 · 455 阅读 · 0 评论 -
LocalDate、LocalTime、LocalDateTime
Date与LocalDateTime、LocalDate之间的互转。原创 2021-07-19 17:55:59 · 669 阅读 · 1 评论 -
再学Java 对象克隆
对象克隆就是以一个对象为模板,创建出一个新的对象。同时,满足二者调用equals方法返回true,但是==判断返回false。1. 浅拷贝顾名思义,浅拷贝适合仅包含基础类型,简单数据类型的场景。@Datapublic class Person implements Cloneable{ private String name; private Email email; protected Person clone() {原创 2021-07-19 17:00:03 · 122 阅读 · 0 评论 -
Class和ClassLoader加载资源
Class和ClassLoader都可以加载本地资源:PropertyUtils.class.getResourceAsStream(path);原创 2021-06-05 15:41:13 · 277 阅读 · 0 评论 -
Collection
常用方法方法原创 2021-05-28 16:20:54 · 119 阅读 · 0 评论 -
类之间的关系
泛化(继承)泛化关系就是继承关系,表示两个类之间存在父类和子类的关系,父类更抽象,子类更具体。子类是父类的具体实现。A继承自B:实现关系(抽象关系)抽象概念与具体实现之间的关系,体现在接口、抽象类的实现上。车是抽象概念,具体的实现分小汽车、自行车等等。组合关系如果说继承是is-a的关系,那么组合就是has-a的关系,is-a和has-a的最根本的区别是,is-a之间的强依赖,继承与生俱来的强依赖关系,而has-a不存在过分强烈的依赖关系,它是拥有的概念。如果B拥有A,B不存在,A仍然存在原创 2021-03-14 21:53:53 · 166 阅读 · 0 评论 -
Java的“Equals“与“==“
Equals与==的区别在基本数据类型中,使用==比较的是实际值,对于引用类型,==比较的是内存地址。equals方法:如果没有重写过equals方法,它等价于==。代码示例1String s1 = new String("abc");String s2 = new String("abc");String s3 = "cbd";String s4 = "cbd";System.out.println(s1 == s2); // false, new的都是不同的对象System.out原创 2021-01-21 20:05:14 · 125 阅读 · 0 评论 -
Java的ThreadLocal
ThreadLocal特点针对并发问题出现的。线程之间独立维护,互不干扰。减少锁竞争导致的问题,提高并发性能。常用方法方法描述ThreadLocal()构造器用于创建对象public T get()获取值public void set(T value)设置值public void remove()移除当前的变量使用和不使用ThreadLocal的代码对比public class MyDemo01 { private S原创 2021-01-21 20:03:25 · 123 阅读 · 0 评论 -
Java 反射(4)
获取泛型方法返回值类型对于上述的getStringList方法,通过getGenericReturnType获取泛型类型,转为ParameterizedType,然后获取真实的类型getActualTypeArguments获取泛型参数对于上面的泛型参数,通过getGenericParameterTypes获取参数的泛型,然后转ParameteredType再获取真实类型,getActualTypeArguments获取泛型变量...原创 2020-09-10 11:40:03 · 147 阅读 · 0 评论 -
Java 反射(3)
特例:获取getter setter方法public static void printGettersSetters(Class aClass){ Method[] methods = aClass.getMethods(); for(Method method : methods){ if(isGetter(method)) System.out.println("getter: " + method); ...原创 2020-09-09 15:37:10 · 217 阅读 · 0 评论 -
Java 反射(2)
获取Constructor对象直接获取所有public构造器:Class aClass = ...//获取Class对象Constructor[] constructors = aClass.getConstructors();根据参数类型获取指定的构造器:Class aClass = ...//获取Class对象Constructor constructor = aClass.getConstructor(new Class[]{String.class});...原创 2020-09-09 14:59:08 · 169 阅读 · 0 评论 -
Java反射(1)
获取Class对象1. 通过类名获取Class myObjectClass = MyObject.class;2. 通过类的全限定名称获取String className = ... ;//在运行期获取的类名字符串Class class = Class.forName(className);方式二需要注意捕获异常,防止ClassNotFoundException获取类的名称Class aClass = ... //获取Class对象,具体方式可见C...原创 2020-09-09 14:40:12 · 156 阅读 · 0 评论 -
Java NIO(3)
Path创建绝对路径//windowsPath path = Paths.get("c:\\data\\myfile.txt");//linuxPath path = Paths.get("/home/jakobjenkov/myfile.txt");创建相对路径Path projects = Paths.get("d:\\data", "projects");Path file = Paths.get("d:\\data", "projects\\a-proje..原创 2020-09-09 11:43:38 · 212 阅读 · 0 评论 -
Java NIO(2)
FileChannel连接到文件的通道,可以通过文件通道读写文件。始终是阻塞的,无法实现非阻塞,即不支持Selector获取FileChannel需要通过使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。读取数据创建一个ByteChannel,然后读取数据。写入数据使用write写入Buffer数据。注意flip的使用:关闭通道size获取文件的...原创 2020-09-09 11:23:34 · 162 阅读 · 0 评论 -
Java NIO(1)
核心组件ChannelBufferSelectorChannel与Buffer类似于Stream和byte的概念,NIO涉及Channel和BufferSelector允许单线程处理多个channel。将channel注册到Selector中,进行select调用,一旦有数据就会返回,否则阻塞。Channel既可以从通道中读取数据,又可以写数据到通道。可以异步读写。通过Buffer操作。涉及的Channel:File...原创 2020-09-09 10:30:21 · 202 阅读 · 0 评论 -
JAVA IO
数据读写的媒介IO实际上就是像水流一样读写文件 管道 网络连接 内存缓存 Java标准输入、输出、错误输出读入程序的叫Input,到处媒介的叫Output常见的IO操作类java的io操作类有个特点,字符相关的叫Reader,Writer。字节相关的叫InputStream,OutputStream文件读写java中,对文件的读写可根据字节操作还是字符操作分为FileInputStream、FileOutputStream或者Fi...原创 2020-09-03 11:12:53 · 192 阅读 · 0 评论