java基础
fall_hat
这个作者很懒,什么都没留下…
展开
-
ArrayLIst、HashMap
1原创 2023-02-23 00:32:52 · 201 阅读 · 0 评论 -
Comparable 接口和 Comparator 接口
Comparable接口Comparable是一个排序接口。若一个类实现了Comparable接口,即代表该类实现了compareTo方法,该方法规定了该类的对象的比较规则(两个对象如何比较“大小”)。Comparator接口Comparator是比较器接口。若我们只需要控制某些对象的次序,而类本身并不支持排序(即没有实现Comparable接口),对于这种情况,我们可以通过建立一个比较器(即关于该类的一个Comparator接口实现类)来进行排序。比较器需实现方法compare(T o1, T o原创 2022-04-27 17:31:44 · 166 阅读 · 0 评论 -
jvm内存溢出
内存溢出和内存泄漏区别内存溢出Out Of Memory是指程序在申请内存时,没有足够的内存空间供其使用,出现Out Of Memory内存泄漏Memory Leak是指程序在申请内存后,由于某种原因无法释放已申请的内存空间,导致这块内存无法再次被利用,造成系统内存的浪费memory leak会最终会导致out of memory。内存溢出分类栈内存溢出(StackOverflowError)程序所要求的栈深度过大导致,可以写一个死递归程序触发。如何解决一般是程序问题,最大可能是递归原创 2022-04-27 00:24:42 · 417 阅读 · 0 评论 -
内存溢出场景
内存溢出原因内存中加载的数据量过大。如一次性从数据库中读大量数据集合类中有对对象类的引用,使用完后未清空,使得JVM不能回收代码有死循环或者循环产生过多对象实体使用的第三方软件的bug启动参数内存值设置过小内存溢出如何避免static静态对象和变量不要滥用及时关闭各种连接和流,如文件流,sftp连接...原创 2022-04-26 23:47:04 · 191 阅读 · 0 评论 -
ReentrantReadWriteLock
ReentrantReadWriteLock是混合式锁,当有读锁被其它线程持有期间,写锁线程只能堵塞等待前面所有的读锁释放,写锁堵塞之后进来的读锁只能排队到写锁线程后面,当读锁释放完毕后写锁获取成功,写锁释放完毕后,排在写锁后面的读锁可以同时获取到读锁。...原创 2022-04-25 12:46:03 · 91 阅读 · 0 评论 -
java的unsafe
概念Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数是private的,因此我们无法在外部对Unsafe进行实例化。获取UnsafeUnsafe无法实例化,原创 2022-04-24 21:01:13 · 1123 阅读 · 0 评论 -
ArrayList如何变得线程安全
arraylist原创 2022-04-20 20:36:56 · 2975 阅读 · 0 评论 -
java开发面试点
java面试知识点整理原创 2022-04-20 20:02:53 · 612 阅读 · 0 评论 -
java的常量池
java常量池java的常量池有三个概念,静态常量池,运行时常量池,字符串常量池JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。静态常量池用于存放编译期生成的各种字面量和符号引用,而当类加载到内存中后,jvm就会将静态常量池中的内容存放到运行时常量池中。而字符串常量池存的是引用值,其存在于运行时常量池之中。静态常量池静态常量池也就是Class文件中的常量池。静态常量池用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常原创 2020-11-03 10:36:31 · 218 阅读 · 0 评论 -
java的全局变量和局部变量
对基本数据类型来说,对于类变量(static)和全局变量,如果不显式地对其赋值而直接使用,则系统会为其赋予默认的零值,而对于局部变量来说,在使用前必须显式地为其赋值,否则编译时不通过。对于同时被static和final修饰的常量,必须在声明的时候就为其显式地赋值,否则编译时不通过;而只被final修饰的常量则既可以在声明时显式地为其赋值,也可以在类初始化时显式地为其赋值,总之,在使用前必须为其显式地赋值,系统不会为其赋予默认零值。对于引用数据类型reference来说,如数组引用、对象引用等,如果没..原创 2020-11-02 19:52:47 · 370 阅读 · 0 评论 -
java锁的分类
自旋锁自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。public class SpinLock { private AtomicReference<Thread> cas = new AtomicReference<Thread>(); public void lock() { Thread current = Thread.currentThread();原创 2020-10-27 17:28:06 · 196 阅读 · 0 评论 -
Java线程池实现原理
https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html原创 2020-07-13 07:55:06 · 126 阅读 · 0 评论 -
Java 8的CompletableFuture
123原创 2020-07-07 07:36:55 · 192 阅读 · 0 评论 -
ThreadLocal原理
不自己写了,看到别人写的一篇,写的太好了。https://juejin.im/post/59db31c16fb9a00a4843dc36原创 2020-06-30 16:59:31 · 168 阅读 · 0 评论 -
java对象锁和类锁的区别
syn锁住的是资源对象锁锁的是当前对象资源类锁锁的是class对象资源如果是对象锁,则同一对象竞争this如果是类锁,因为一个类只有一个class对象,所以不管怎么样,进来都要锁住原创 2020-06-28 16:37:21 · 383 阅读 · 0 评论 -
Java 为什么不推荐使用 Stack
因为 Stack 是 JDK 1.0 的产物。它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗?当初 JDK1.0 在开发时,可能为了快速的推出一些基本的数据结构操作,所以推出了一些比较粗糙的类。比如,Vector、Stack、Hashtable等。这些类中的一些方法加上了 synchronized 关键字,容易给一些初级程序员在使用上造成一些误解!而且在之前的几个版本中,性能还不怎么好。基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要原创 2020-06-01 12:31:04 · 2762 阅读 · 4 评论 -
java判断Long类型是否等于一个数字
源码中显示,Long中有一个静态的内部类LongCache,专门用于缓存-128至127之间的值,一共256个元素。如果值在[-128, 127]之间,会放在缓存里面,而超过这个范围就要new一个新的对象,也就是说==不能判断对象是否相等。当然,如果值是在[-128, 127]之间的话是测不出来什么问题的所以不能用==判断1.用Long.longvalue()== 数字2.用 Object.equals(object)...原创 2020-05-29 10:29:33 · 11490 阅读 · 0 评论 -
JUC之CAS
CAS是什么CAS的全称为Compare-And-Swap,它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能。那么为什么CAS会出现呢?它的作用是怎样的?...原创 2020-04-17 00:58:32 · 138 阅读 · 0 评论 -
JUC之AQS
AQS是什么AQS:Abstract Queued Synchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架,JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。它是JUC并发包中的核心基础组件。AQS解决了实现同步器时涉及当的大量细节问题,例如获取同步状态、FIFO同步队列。基于AQS来构建同步器可以带来很多好处。它不仅能够极大地减少实现工作,而且...原创 2020-04-17 00:10:38 · 166 阅读 · 0 评论 -
java的ThreadLocal变量
简介ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本...原创 2020-03-11 18:08:55 · 166 阅读 · 0 评论 -
明明白白的Java集合框架
Java集合框架图ListSetHashSetHashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static fin...原创 2020-03-09 19:11:13 · 117 阅读 · 0 评论 -
明明白白的java的IO流
IO类架构图原创 2020-03-09 18:10:04 · 103 阅读 · 0 评论 -
反射,根据数据库的值来将某个字段置为空
反射,根据数据库的值来将某个字段置为空原创 2020-03-06 18:51:58 · 808 阅读 · 0 评论 -
java虚拟机的jps命令
介绍列出系统中所有的 Java 应用程序。参数-q:只输出进程 ID-m:输出传入 main 方法的参数-l:输出完全的包名,应用主类名,jar的完全路径名-v:输出jvm参数-V:输出通过flag文件传递到JVM中的参数可以同时使用多个参数。...原创 2020-03-04 17:37:40 · 404 阅读 · 0 评论 -
java的LockSupport
LockSupport简介位于java.util.concurrent.locks包下,线程的阻塞原语,用来阻塞线程和唤醒线程,每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在线程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。但是注意许可不可重入,也就是说只能调用一次park()方法,否则会一直阻塞。...原创 2020-03-04 14:57:04 · 189 阅读 · 0 评论 -
java的yield
没用过 yield,感觉没什么鸟用。暂停的时候不会释放资源如果一定要用它的话,一句话解释就是:yield 方法可以很好的控制多线程,如执行某项复杂的任务时,如果担心占用资源过多,可以在完成某个重要的工作后使用 yield 方法让掉当前 CPU 的调度权,等下次获取到再继续执行,这样不但能完成自己的重要工作,也能给其他线程一些运行的机会,避免一个线程长时间占有 CPU 资源。...原创 2020-03-04 13:22:35 · 213 阅读 · 0 评论 -
明明白白的java中断机制
java中断机制中断线程在 run() 方法中,如果语句执行到了最会一句,或是遇到 return 方法,或是方法中出现了没有被捕获的异常,run() 方法将会执行结束。在java中,Thread中的interrupt() 方法被调用时,线程中断状态将被置位,由于线程在运行期间,会不断的检测这个状态位,以判断程序是否被中断。检测线程是否被中断在实际开发中,要判断中断状态位是否被置位,首先使用...原创 2020-03-04 13:16:03 · 203 阅读 · 0 评论 -
明明白白的JAVA多线程之wait/notify
调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于synchronized(obj){…}的内部才能够去调用obj的wait与notify/notifyAll三个方法,否则就会报错。当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。当执行notify/notifyAll方法时,会唤醒...原创 2020-03-04 00:17:42 · 103 阅读 · 0 评论 -
java中的lock
Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是java.util.concurrent.locks里的一个类,通过这个类可以实现同步访问;Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程...原创 2020-03-03 00:44:51 · 281 阅读 · 0 评论 -
明明白白的java的volatile
使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原子级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchroni...原创 2020-03-02 23:23:01 · 169 阅读 · 1 评论 -
java的synchronized关键字
public class SynMethod { private static final Object staticLockObj = new Object(); /** * 对象锁,代码级别,同一对象争用该锁,this为SynMethod实例,synchronized的锁绑定在this对象上 */ public void method1() { ...原创 2020-03-02 10:27:11 · 104 阅读 · 0 评论 -
明明白白的Java的守护线程
如果非守护线程全部结束,则程序结束,同时杀死所有守护线程。线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现thread.setDaemon(true)必须在thread.start()之前设置,不能把正在运行的常规线程设置为守护线程在Daemon线程中产生的新线程也是Daemon的守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候...原创 2020-03-02 10:26:04 · 96 阅读 · 0 评论 -
多线程的数量设定
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。线程的等待时间越大,线程数就要设置越大1、CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 ...原创 2020-02-25 18:44:28 · 2349 阅读 · 0 评论 -
java的泛型方法
public class Da { public static <A,T>T add(A a, T b) { return b; } public static void main(String[] args) { String a = "aaa"; Integer b = 9; System...原创 2020-01-21 17:33:45 · 104 阅读 · 0 评论 -
Java获取当前时间30天之前的时间的五种方法
//方法一 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String maxDateStr = "2018-01-01"; String minDateStr = ""; Calendar calc =Calendar.getInstance(...原创 2020-01-15 20:39:02 · 13725 阅读 · 0 评论 -
根据jar包生成javadoc
找到source后缀的jar包在该jar包所在的目录里建立 source文件夹,javadoc文件夹进入到source文件夹,在source文件夹里面进入到cmd。执行 jar vxf …/***-sources.jarjavadoc -d javadoc -sourcepath source -subpackages com.xxx.xxxx如果出现 “错误: 编码GBK的不可映射...原创 2020-01-10 11:32:53 · 848 阅读 · 0 评论 -
java线程池的监控
ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es); while (true) { System.out.println(); int queueSize = tpe.getQueue().size(); System.out.println("当前排队线程数:" + queueSize...原创 2020-01-02 18:38:08 · 126 阅读 · 0 评论 -
The specified size exceeds the maximum representable size
使用32位的jvm支持的内存也最多为2的32次方,就是4G。出现此问题是jvm设置的最大内存大于32位jvm最大支持内存。换为64位的jdk即可。原创 2019-12-31 17:01:52 · 2118 阅读 · 0 评论 -
java switch字符串类型
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量(final)。...原创 2019-11-21 17:23:47 · 317 阅读 · 0 评论 -
java的String.format()
从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 format()。这个方法到现在用的人还是不多,实在是一种浪费。本文带你快速过一遍这个方法的功能,将来你要用到格式化文本的时候,可能就不需要再借用第三方类库或自己去实现了。首先看一个简单例子:String formatted = String.format("%s今年%d岁。", “小李”, 30); // “小李今...原创 2019-11-21 16:31:05 · 600 阅读 · 0 评论