
JAVA基础
春风化作秋雨
学而思,思而学
展开
-
Java使用泛型保证返回参数无需强转
【代码】Java使用泛型保证返回参数无需强转。原创 2023-06-17 18:20:00 · 590 阅读 · 0 评论 -
为何开发中很少使用数组
实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用来存储多个数据的。集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。2、声明数组时的数据类型也决定了该数组存储的数据的类型。3、数组存储的数据是有序的、可重复的,特点单一。1、数组一旦声明之后,长度就不可变了。原创 2022-11-03 14:42:30 · 442 阅读 · 0 评论 -
java 中泛型的三种使用方式
一般被称为静态泛型方法;在 java 中泛型只是一个占位符,必须在传递类型后才能使用。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。原创 2022-11-03 13:17:04 · 1487 阅读 · 0 评论 -
java 多线程使用 join() 方法让主线程等待
java 多线程使用 join() 方法让主线程等待原创 2022-10-10 16:55:00 · 316 阅读 · 0 评论 -
java中join()方法理解与应用
java中,join()方法的作用是阻塞,即当前线程等待线程结束,才继续执行。线程T1执行至1, 进行中。线程T1执行至2, 进行中。线程T1执行至3, 进行中。线程T1执行至4, 进行中。线程T1执行至5, 进行中。线程T2执行至1, 进行中。线程T3执行至1, 进行中。线程T3执行至2, 进行中。线程T2执行至2, 进行中。线程T2执行至3, 进行中。线程T3执行至3, 进行中。线程T3执行至4, 进行中。线程T2执行至4, 进行中。线程T3执行至5, 进行中。线程T2执行至5, 进行中。原创 2022-10-10 16:25:18 · 500 阅读 · 0 评论 -
java 有锁和无锁实现线程交替执行与对比
【代码】java 有锁和无锁实现线程交替执行与对比。原创 2022-10-10 14:39:30 · 250 阅读 · 0 评论 -
java 中静态内部类与普通内部类的区别
注:static修饰的内部类,是一种较为特殊的内部类,Java文档中描述static修饰的内部类:一旦内部类使用static修饰,那么此时这个内部类就升级为顶类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性,同外部类没有分别。一般之定义和使用静态内部场景:该内部类仅外部类用到,以此减少类文件数量,方便代码维护和管理。2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部;5)类的内部,可定内部接口,并且可定义一个内部类实现这个内部接口。原创 2022-10-10 10:59:53 · 1918 阅读 · 0 评论 -
java获取对象属性名称与属性值
student:name=张明;height=181;user:gender=男;3、UserInfo类。2、Student类。原创 2022-10-10 10:00:24 · 5597 阅读 · 0 评论 -
java 使用多线程池异步处理不同业务
【代码】java多个线程池分别异步处理不同业务。原创 2022-10-10 09:52:05 · 757 阅读 · 0 评论 -
java 实现线程间通信
thread_A 打印:thread_B已完成自增1,目前num=10,请知晓!thread_B 打印:thread_A已完成自增1,目前num=11,请知晓!thread_B 打印:thread_A已完成自增1,目前num=1,请知晓!thread_A 打印:thread_B已完成自增1,目前num=2,请知晓!thread_B 打印:thread_A已完成自增1,目前num=3,请知晓!thread_A 打印:thread_B已完成自增1,目前num=4,请知晓!thread_A 结束!原创 2022-09-13 15:17:03 · 315 阅读 · 0 评论 -
字符串引用之避坑
2、修改字符串引用对应的对象值,其实是重新初始化了,原来的对象依然存在;如有其他引用指向,则其引用对应的对象不变。1、字符串的特殊性-不可变的对象,只能做为常量,分配在堆内存。原创 2022-09-11 20:29:10 · 234 阅读 · 0 评论 -
Java 两个变量不借用其他变量进行交换
场景:两个变量,无需借助其他变量完成交换。适用:boolean,int等数值类型打印输出:原创 2022-09-11 20:16:34 · 215 阅读 · 0 评论 -
Java 字符串指定个位置的字符修改操作
【代码】Java 字符串指定个位置的字符修改操作。原创 2022-09-08 15:30:08 · 1267 阅读 · 0 评论 -
Java中去掉字符串中的非中文字符
代码】Java中去掉字符串中的非中文字符。原创 2022-08-08 11:49:08 · 2038 阅读 · 0 评论 -
Java stream 实现 List<String> 转List<Long>
本文提供了三种方式,请自行参考import org.apache.commons.lang.ArrayUtils;import javax.swing.plaf.synth.SynthOptionPaneUI;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;原创 2022-02-22 15:31:01 · 17624 阅读 · 0 评论 -
Java8 stream().map() 修改元素
Java8 stream().map() 是一个中间操作,可实现对元素进行修改,这意味着它返回Stream对象。代码实现:package com.collectStream;import lombok.Data;import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;原创 2022-02-22 14:29:35 · 11902 阅读 · 1 评论 -
Java8 stream().filter() 过滤应用
Java8及以上版本中,使用stream().filter()来过滤一个List对象,查找符合条件的对象集合。代码实现:import lombok.Data;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class TestStreamFilter { public static void so原创 2022-02-22 14:13:57 · 39535 阅读 · 0 评论 -
Java stream().sorted() 排序应用
Java 8中 Stream 的 sorted() 可实现按照自然排序,也可使用 Comparator 提供的排序对流进行排序;支持使用 lambda 表达式进行实例化;还可实现反转自然排序。1、sorted() 使用按自然升序对集合进行排序,默认是升序排列;使用 Comparator 提供 reverseOrder() 方法实现降序排列。list.stream().sorted() .stream().sorted();list.stream().sorted(Comparator.re原创 2022-02-22 13:56:34 · 38066 阅读 · 5 评论 -
20 个超级使用的 Java 8 Stream,玩转集合的筛选、归约、分组、聚合
先贴上几个案例,水平高超的同学可以挑战一下:1. 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。2. 统计员工的最高薪资、平均薪资、薪资之和。3. 将员工按薪资从高到低排序,同样薪资者年龄小者在前。4. 将员工按性别分类,将员工按性别和地区分类,将员工按薪资是否高于8000分为两部分。用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda...转载 2022-02-22 10:34:35 · 256 阅读 · 0 评论 -
Java 内存模型独有与共享
1、独有栈、本地方法栈、程序计数器这三个部分都是线程独占的。栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同之处,执行Java 编写代码中方法使用栈,而执行 native方法使用本地方法栈。程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行Java方...原创 2022-02-21 10:36:06 · 330 阅读 · 0 评论 -
Thread.sleep(0) 的作用
使用场景:Java 采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到 CPU 控制权的情况。解决方案:为让某些优先级较低的线程也能获取到 CPU 控制权,可使用 Thread.sleep(0) 触发一次操作系统分配时间片的操作,这也是平衡 CPU 控制权的一种操作。...原创 2022-02-21 10:17:33 · 616 阅读 · 0 评论 -
线程同步注意事项
1、尽量缩小同步的范围,增加系统吞吐量。2、分布式下java提供的同步锁失去意义,须使用分布式锁。3、防止死锁,注意加锁顺序。原创 2022-02-21 10:09:09 · 264 阅读 · 0 评论 -
多线程编程中的原子性、可见性、有序性
原子性、可见性、有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。1、原子性原子性,是指一个线程的操作是不能被其他线程打断,同一时间只有一个线程对一个变量进行操作。在多线程情况下,每个线程的执行结果不受其他线程的干扰。举例:多个线程同时对同一个共享成员变量 n++ 累计100 次,若 n 初始值为 0,则 n 最后的值应该是 100,所以说它们是互不干扰的,这就是传说的中的原子性。但 n++ 并不是原子性的操作,要使用 AtomicInt原创 2022-02-21 10:04:22 · 1426 阅读 · 0 评论 -
死锁、活锁、饥饿、无锁
死锁、活锁、饥饿,是关于多线程是否活跃出现的运行阻塞障碍问题,若线程出现这三种情况,即线程不再活跃,无法再正常地执行下去。1、死锁死锁,是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。举例:工人A正在使用扳手,需要钳子配合,此时工人B正在使用钳子,需要扳手配合;两人都占用对方的工具,又都在等待对方手中的工具,如此死等下去,任务都阻塞了。此时,需要外力干预才解决,比如A先把把扳手借给B,或者...原创 2022-02-21 09:55:53 · 884 阅读 · 0 评论 -
使用使用线程池的好处
不使用线程池,每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行。线程数量少的情况下,可如此使用。然而,现实环境下可能需要开启多个线程让系统和程序运行达到最佳效率。1、单独创建线程潜在问题当线程数达到一定数量就会耗尽系统的 CPU 和内存资源,也会造成 GC频繁收集和停顿。每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。2、使用线程池可进行优化1、线程池可控制线程数量,避免线程泛滥。2、线程池原创 2022-02-21 09:30:13 · 600 阅读 · 0 评论 -
多线程同步的方法
1、synchronized 关键字2、Lock 锁3、分布式锁等原创 2022-02-21 09:20:57 · 171 阅读 · 0 评论 -
java 线程中的 wait()和 sleep()方法
java 中 sleep() 方法和 wait() 方法1、相同点:都可以用来放弃 CPU 一定的时间。2、不同点:若线程持有某对象的监视器,sleep()方法不会放弃对象的监视器,wait() 方法会放弃对象的监视器。...原创 2022-02-21 09:19:21 · 302 阅读 · 0 评论 -
Java 多线程实现方式
1、继承 Thread 类实现多线程。无返回结果2、实现 Runnable 接口方式实现多线程。无返回结果3、使用 ExecutorService、Callable、Future 实现有返回结果的多线程。原创 2022-02-21 09:14:41 · 112 阅读 · 0 评论 -
多线程线程的优势
1、发挥多核CPU 的优势现在的笔记本、台式机乃至商用的应用服务器一般都是2核、4 核、8 核甚至 16 核;如果是单线程的程序,那么在双核 CPU 上就浪费了 50%, 在 4 核CPU 上就浪费了 75%。单核 CPU 上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU 上的多线程才是真正的多线程,能实现多段逻辑同时工作。多线程,可以真正发挥出多核CPU 的优势来,达到充分利用CPU 的目的。2、防止阻塞从原创 2022-02-21 09:07:19 · 1698 阅读 · 0 评论 -
java BlockingQueue 实现多线程资源复用
1、测试主类package com.queues;import com.google.common.collect.Lists;import java.util.List;import java.util.concurrent.*;public class LineBlockingQueueTest { public static void main(String[] args) { List<String> list = Lists.newArra原创 2022-01-17 14:31:02 · 430 阅读 · 0 评论 -
Executors 框架
Executors 框架,是一个根据一组执行策略调用、调度、执行和控制的异步任务的框架。不使用线程池,创建线程数量不加控制或控制不当,会导致应用程序内存溢出。所以,创建线程池是一个很好的解决方案。它可以限制核心线程数量,还可以回收再利用使用结束的线程。利用Executors 框架可以非常方便的创建一个线程池。Executors类源码如下:package java.util.concurrent;import java.lang.Thread.UncaughtExceptionHandler原创 2022-01-12 21:47:31 · 515 阅读 · 0 评论 -
java 中 Lock
Lock 是一个接口,定义锁的基础规范,它比同步方法和同步块提供了更具扩展性的锁操作;这些方法允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。package java.util.concurrent.locks;import java.util.concurrent.TimeUnit;public interface Lock { void lock(); void lockInterruptibly() throws InterruptedExc原创 2022-01-12 21:40:15 · 393 阅读 · 0 评论 -
java 原子操作
1、原子操作原子操作(atomic operation)是指不可被中断的一个或一系列的操作。2、实现方式处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。Java 中可通过锁和自旋CAS 的方式来实现原子操作。 CAS 操作:Compare AndSet,或是 CompareAnd Swap,如今几乎所有的 CPU 指令都支持CAS 的原子操作。3、特点原子操作,是一个不受其他操作影响的操作任务单元。原子操作是在多线程环境下避免数据不一致必要手段。...原创 2022-01-09 20:03:15 · 3123 阅读 · 0 评论 -
Java Executor 和 Executors
1、Executor 是接口,基本定义线程池。package org.springframework.core.task;import java.util.concurrent.Executor;public interface TaskExecutor extends Executor { void execute(Runnable var1);}ExecutorService 接口继承了 Executor 接口并进行了扩展,提供了更多的方法我们能获得任务执行的状 态并且可以原创 2022-01-09 19:49:25 · 640 阅读 · 0 评论 -
为什么要使用线程池
1、每次执行任务创建线程并执行有一定的性能开销,因为启动一个新线程比较耗时、耗资源。2、调用 new Thread() 创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争,会导致过多占用系统资源而导致系统瘫痪,还有过多的线程,线程之间的频繁的上下文切换消耗很多系统资源。3、直接使用 new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。...原创 2022-01-09 19:35:22 · 418 阅读 · 0 评论 -
为什么不推荐使用线程组
java 中使用 ThreadGroup 类,可把线程归属到不同的线程组中,线程组中既可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构类似树形结构。不推荐使用原因:使用会存在很多安全隐患;若有需要,可使用线程池。...原创 2022-01-06 21:52:27 · 373 阅读 · 0 评论 -
Java 中线程调度算法
Java 中线程调度算法,采用时间片轮转的方式。可设置线程的优先级,会映射到下层的系统上面的优先级上,如果不是特别需要,尽量不要使用,避免线程饥饿。原创 2022-01-06 21:47:53 · 297 阅读 · 0 评论 -
死锁与活锁、死锁与饥饿区别
1、什么是死锁死锁,是指两个或两个以上的进程(或线程)执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用干预,他们都死等下去,也都将无法往下推进。产生死锁的必要条件:1、互斥条件:所谓互斥就是进程在某一时间内独占资源。2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。2、什么是活锁任务或者执行者没有被阻塞,但由于某些原创 2022-01-06 21:37:09 · 1943 阅读 · 0 评论 -
线程与进程区别
进程,是操作系统分配资源的最小单元。线程,是操作系统调度的最小单元。一个程序至少要有一个进程,一个进程至少要有一个线程。原创 2022-01-06 21:21:13 · 202 阅读 · 0 评论 -
java 中守护线程和本地线程区别
1、java 线程分两种1)守护线程(Daemon)2)用户线程(User)2、线程设置任何线程都可设置为守护线程和用户线程。方法: Thread.setDaemon(boolean);true 则把该线程 设置为守护线程,false 则为用户线程。说明:Thread.setDaemon(boolean) 须在 Thread.start()之前调用,否则运行时会抛出异常。3、两者的区别唯一区别:判断虚拟机(JVM)何时离开,Daemon Thread 是为其他线程提供服务..原创 2022-01-06 21:18:25 · 2205 阅读 · 0 评论