java
文章平均质量分 76
qianye_97
这个作者很懒,什么都没留下…
展开
-
[java]克隆和序列化
1、克隆先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。浅克隆一般步骤:被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSuppo原创 2021-09-27 10:48:30 · 343 阅读 · 1 评论 -
[java] 集合类
1、数组ArrayList和集合LinkedList的比较数组开辟的是一块连续空间,适合下标访问,查找效率高。 LinkedList 采用双向链表实现的,存储是分散的,适合插入和删除。数组能存放基本数据类型和对象,而集合类存放的都是对象,集合类不能存放基本数据类型。数组和集合存放的对象皆为对象的引用地址。数组容易固定无法动态改变,集合类容量动态改变。数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数集合以类的形式存在,具有封装、继承、多态原创 2021-09-24 22:40:24 · 154 阅读 · 0 评论 -
[java] 面向对象
1、面向对象和面向过程面向过程面向过程编程强调的是怎么去做,例如完成某件事情之前,先思考完成这件事情需要哪些步骤,然后逐一去实现,自身完成所有的底层实现。清理教室垃圾这件事情,你可以思考先从第一排扫到第十排,还是从第一列扫到第十列。面向对象面向对象编程忽略了如何去做的概念,强调的是让谁去做,自身忽略这件事的底层实现,底层实现交给某个能够完成这件事的对象去完成。清理教室垃圾这件事情,你并不想自己动手,所以让同桌帮忙进行清理,也就是将怎么去做交给了同桌去思考及实现。2、三大特性封装封装是面向对象编原创 2021-08-23 13:52:35 · 102 阅读 · 0 评论 -
[java] 反射
什么是反射反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。获取 Class 对象的几种方法调用某个对象的 getClass()方法Person p=new Person();Class clazz=p.getClass();调用某个类的 class 属性来获取该类对应的 Class 对象Class clazz=Person.cla原创 2021-07-27 16:33:20 · 82 阅读 · 0 评论 -
[java] JUC包下的常用类
atomic包atomic下运用了CAS的AtomicBoolean、AtomicInteger、AtomicReference等原子变量类AtomicInteger count = new AtomicInteger();//获取值count.get();//自增count.incrementAndGet();locks包AbstractQueuedSynchronizer(AQS)AQS就是一个并发包的基础组件,用来实现各种锁,各种同步组件的。它包含了state变量、加锁线程、等待队原创 2021-07-22 11:20:06 · 1403 阅读 · 1 评论 -
[java] java 8新特性
视频链接:https://www.bilibili.com/video/BV1ut411g7E9?p=14&spm_id_from=pageDriver1、lambda表达式2、函数式接口java8四大内置函数式接口Java内置四大核心函数式接口:名称函数式接口内置函数用途消费型接口Consumer< T >void accept(T t)对类型为T的对象应用操作:提供型接口Supplier< T >T get()返回类型为转载 2021-07-19 14:18:20 · 121 阅读 · 0 评论 -
[java] IO,NIO,AIO
BIO:同步阻塞IO,NIO:同步非阻塞IO,AIO:异步非阻塞IO阻塞/非阻塞,同步/异步用户进程发起请求从内核中获取数据那么这时候有两种情况:操作系统还没有准备后数据,那么这时候怎么办,有两种方法:让用于进程等着(这种情况就是阻塞)如果没有数据就返回一个ERROR,不需要用户进程干等(这种情况就是非阻塞)过了一会儿操作系统准备好数据了,这时候又有两种方法:啥也不管,等着用户进程再次来请求才把数据给它(这种情况就是同步)负责到底,数据准备好,直接给到用户进程,并且还发出原创 2021-06-28 21:36:15 · 120 阅读 · 0 评论 -
[java] 红黑树
首先要明白为什么有了AVL树之后还会出现这么多树的变种?AVL树: 平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。红黑树: 平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于原创 2021-06-28 19:08:47 · 79 阅读 · 0 评论 -
[java] 异常
error 和 exceptionError类对象由Java虚拟机生成并抛出,大多数错误与程序员所执行的操作无关。比如说内存溢出。不可能指望程序能处理这样的情况。发生Error时,虚拟机会重启线程exception 一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能的避免这类异常的发生。异常体系结构所有异常都继承自java.lang.Throwable,它有两个直接的子类ErrorExceptionRuntimeExceptionCheckExceptionIOExc原创 2021-06-28 16:12:07 · 60 阅读 · 0 评论 -
[java] 线程
创建线程的方法需要从 Java.lang.Thread 类派生一个新的线程类,重载它的 run()方法;public class ThreadTest extends Thread{ public void run(){ for(int i=0;i<20;i++){ System.out.println("this is run way"+i); } } public static void main(Strin原创 2021-06-28 11:04:31 · 87 阅读 · 1 评论 -
[java] 锁的分类及死锁
1、乐观锁和悲观锁悲观锁: 悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会 block 直到拿到锁。java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如 RetreenLock。乐观锁: 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在原创 2021-06-24 22:14:25 · 146 阅读 · 0 评论 -
[java] 线程池
线程池参数线程池核心线程数大小,最大线程数,存储的队列,拒绝策略,空闲线程存活时长,空闲线程存活时间单位,线程工厂运行流程首先判断核心线程池里的线程是否都在执行任务,如果不是则直接从核心线程池中创建一个线程来执行,如果都在忙则判断任务队列是否也满了,没满的话将任务放进去等待执行,当存储队列满了的话,就开始增加线程池创建的线程数量,如果当线程数量也达到了最大,就开始执行拒绝策略工作队列newCachedThreadPool使用的是SynchronousQueue 同步队列。一个不缓存任务的阻塞队原创 2021-06-06 22:42:28 · 139 阅读 · 0 评论 -
[java] hashmap
1、HashMap1.1 hashMap 内部具体如何实现的?Hashmap 基于数组实现的,通过对 key 的 hashcode & (数组的长度-1)得到在数组中位置,如当前数组有元素,则数组当前元素 next 指向要插入的元素(头插法),这样来解决 hash 冲突的,形成了拉链式的结构。需要注意的是,HashMap 在 JDK1.8 的版本中引入了红黑树结构做优化,当链表元素个数大于等于 8 时,链表转换成树结构;若链表元素个数小于等于 6 时,树结构还原成链表。解释:因为红原创 2021-05-27 11:04:56 · 108 阅读 · 0 评论 -
[java] Synchronized理解
1、修饰成员方法例如下面这个场景,Phone类有两个成员方法,打电话和发短信,均用synchronized修饰,然后主方法里新建一个Phone对象,开两个线程分别执行两个方法,为了加强对比,我在发短信方法里加了一个2s延时。输出: 发短信在前 打电话在后说明: 尽管我在发短信发短信方法里加了延时,打电话还是在后面输出的,说明这两个线程拿到的是同一个锁,谁先拿到谁执行!即synchronized 修饰成员方法时锁的对象是方法的调用者!import java.util.concurrent.TimeUn原创 2021-05-26 15:06:02 · 170 阅读 · 0 评论 -
[java] 后端场景题
Java常见场景题1、如果一个外卖配送单子要发布,现在有200个骑手都想要接这一单,如何保证只有一个骑手接到单子?网上看到有大神这样说,说的太概述了,我还是不知道具体要怎么操作如果只是单机,采用volatile关键字修饰该订单采用CAS操作对其进行乐观锁操作。采用redis,zookeeper分布式锁加锁。消息队列 实现幂等接口所以我自己模拟写了一个,案例如下public class sub1 { static int USER_NUM=10000;//模拟并发数,也就是有这么多个用原创 2021-05-25 16:45:44 · 7468 阅读 · 1 评论 -
[java] 设计模式
单例模式public class Singleton { private static final Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }简单工厂模式interface Fruit{ public void buy();}c原创 2021-05-08 17:02:14 · 285 阅读 · 0 评论 -
[java] 面试题库
1、为什么重写 equals 还要重写 hashcode?1.若重写了equals(Object obj)方法,则有必要重写hashCode()方法。2.若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数。3.若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。4.若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true。5.若两个对象原创 2021-03-30 22:12:03 · 344 阅读 · 0 评论 -
[java] 生产者和消费者问题
原理在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。实例public class TestPC { public static void main(String[] args) { SynCo原创 2021-03-29 15:32:33 · 80 阅读 · 0 评论 -
[java] 线程不安全实例及解决办法
线程不安全实例买票问题public class UnSafeBuyTicket { public static void main(String[] args) { BuyTicket station =new BuyTicket(); new Thread(station,"我").start(); new Thread(station,"你们").start(); new Thread(station,"黄牛").start(原创 2021-03-29 14:47:06 · 154 阅读 · 0 评论 -
[java] lambda表达式
用处:避免匿名内部类定义过多使代码看起来更简洁示例:public class TestLambda { // 3. 静态内部类 static class Love2 implements ILove{ @Override public void say(){ System.out.println("I love you2"); } } public static void main(Stri原创 2021-03-29 09:29:01 · 69 阅读 · 0 评论