
java基础
fldjsaldkfjoeiaf
这个作者很懒,什么都没留下…
展开
-
java反射
反射:其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容。反射的好处:大大的增强了程序的扩展性。反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象。 2. 实例化对象,获得类的属性、方法或构造函数。 3. 访问属性、调用方法、调用构造函数创建对象。一: 获取Class对象,有三种方式 : 1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。 2:每一个数据类型(基本数据类型和引用数原创 2021-11-14 10:51:58 · 109 阅读 · 0 评论 -
接口性能调优
耗时操作考虑异步处理恰当使用缓存sql优化优化程序逻辑、代码,有些数据查询了多次,改成一次查出把接口循环操作数据库的 改成批量的原创 2021-11-13 18:36:33 · 367 阅读 · 0 评论 -
Linux常用命令
tailf name.log 查看日志less [filename] 显示文件内容vim xxx.file 然后按 “i” 字母进入编辑模式 按 ESC,左下角就可以进行输入:w 保存但不退出:wq 保存并退出:q 退出:q! 强制退出,不保存pwd 显示当前工作目录ls 列出指定目录内容cp 拷贝mv 移动文件/目录, 文件/目录改名mkdir 建立目录rm 删除文件/目录chmod 更改文件/目录权限ps 显示瞬间进程执行状况ifconfig 查询、配置网络设备, 可设置网原创 2021-11-10 21:20:59 · 970 阅读 · 0 评论 -
java动态代理
代理模式代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。Spring AOP就是使用了动态代理完成了代码的动态“织入”。使用代理好处还不止这些,一个工程如果依赖另一个工程给的接口,但是另一个工程的接口不稳定,经常变更协议,就可以使用一个代理,接口变更时,只原创 2021-11-09 20:29:33 · 273 阅读 · 0 评论 -
java设计模式
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类。分别是创建型模式、结构型模式和行为型模式列举几种设计原则,这几种设计原则将贯通全文:面向接口编程,而不是面向实现。这个尤为重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不原创 2021-11-09 19:34:42 · 236 阅读 · 0 评论 -
数据结构相关
二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构特点:(1)非叶子节点最多拥有两个子节点;(2)非叶子节值大于左边子节点、小于右边子节点;(3)树的左右两边的层级数相差不会大于1;(4)没有值相等重复的节点;B树(B-tree)B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构规则:(1)排序方式:所有节点关键字是按递原创 2021-10-24 18:38:16 · 173 阅读 · 0 评论 -
线程池相关
为什么用线程池?解释下线程池参数?1、降低资源消耗;提高线程利用率,降低创建和销毁的消耗。2.提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,在执行。3.提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。一、corePoolSize 线程池核心线原创 2021-10-04 13:57:16 · 78 阅读 · 0 评论 -
并发、并行、串行的区别
并发、并行、串行的区别串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务就只能等着并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行并发允许两个任务彼此干扰。同一时间点、只有一个任务执行,交替执行。...原创 2021-10-03 14:07:27 · 81 阅读 · 0 评论 -
并发的三大特性
并发的三大特性原子性原子性:即一个操作或者多个操作中cpu不可以在中途暂停然后再调度,即不能被中断操作,要么全部执行完成,要么就都不执行。比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。2个操作必须全部完成。private long i = 0;public void calc(){i++;}1:将i从主存读到工作内存中的副本中2:+1的运算3:将结果写入工作内存4:将工作内存的值刷回主存(什么时候刷入由操作系统决定,不确定的)Jav原创 2021-10-03 14:06:46 · 410 阅读 · 0 评论 -
ThreadLocal
ThreadLocal就是提供给每个线程操作变量的工具类,做到了线程之间的变量隔离目的。ThreadLocal类用来设置线程私有变量,本身不储存值,主要提供自身引用和操作ThreadLocalMap属性值的方法,使用ThreadLocal会通过ThreadLocal的引用定位到到堆中Thread的类ThreadLocalMap里散列表里的值 从而达到线程私有。ThreadLocal的原理和使用每个Thread对象都有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中原创 2021-10-03 12:37:04 · 95 阅读 · 0 评论 -
守护线程的理解
守护线程:为所有非守护线程提供服务的线程;任何一个守护线程都是整个JVM中所有非守护线程的保姆;守护线程类似于整个进程的一个默默无闻的小喽啰;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行了,程序就结束了,理都没理守护线程,就把它中断了;注意:由于守护线程的终止是自身无法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱。守护线程的作用是什么?举例,GC垃圾回收线程:就是一个经典的守护线程,当我们的线程中不再有任何运行的Thread,程序就不会再产生垃原创 2021-10-03 12:36:22 · 190 阅读 · 0 评论 -
Thread和Runnable的区别
Thread和Runnable的区别Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,没有可比性。无论使用Runnable还是Thread,都会new Thread,然后执行run方法。用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现Runnable。为什么实现runnable接口的方式实现线程?首先,我们从代码的架构考虑,实际上,Runnable 里只有一个 run() 方法,它定义了需要执行的内容原创 2021-09-30 21:38:46 · 109 阅读 · 0 评论 -
线程安全的理解
线程安全的理解不是线程安全、应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象时,如果不用进行额外的同步控制或其他协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的。(当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类时线程安全的。如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的)堆是进程和线程共有的原创 2021-09-30 20:13:08 · 105 阅读 · 0 评论 -
线程的生命周期
线程的生命周期Java线程具有五种状态:新建、就绪、运行、阻塞、死亡新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();就绪状态(Runnable):线程对象对创建后,其他线程调用了该对象的start()方法(t.start();),线程即进入就绪状态。该状态的线程位于可运行线程池中,等待获取CPU的使用权。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;运行状原创 2021-09-30 15:13:19 · 70 阅读 · 0 评论 -
GC如何判断对象可以被回收
GC如何判断对象可以被回收引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。可达性分析法:从GC Roots开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的,那么虚拟机就判断是可回收对象。引用计数法,可能会出现A引用了B,B引用了A,这时候就算他们都不再使用了,但因为相互引用,计数器=1,永远无法被回收。GC Roots的对象有:虚拟机栈(栈帧中的本地变量表)中引用的对象本地方法原创 2021-09-28 19:30:53 · 135 阅读 · 0 评论 -
Java异常
java中的所有异常都来自顶级父类ThrowableThrowable:有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类。1、Error(错误):是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JV原创 2021-09-28 19:29:57 · 102 阅读 · 0 评论 -
java类加载器
java类加载器jdk自带有三个类加载器:BootstrapClassLoader(启动类加载器)、ExtClassLoader(扩展类加载器)、AppClassLoader(系统类加载器)。1、BootstrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%/lib下的jar包和class文件。2、ExtClassLoader是AppClassLoader的的父类加载器,负责加载%JAVA_HOME%/lib/ext文件夹下的jar包和class原创 2021-09-28 19:28:38 · 290 阅读 · 0 评论 -
什么是字节码
什么是字节码 采用字节码的最大好处是什么java 中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Ja原创 2021-09-25 17:57:11 · 191 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMapjdk7数据结构:数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)ReentrantLock+Segment+HashEntry一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构的头节点元素查询:二次hash,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部(HashEntry数组的下标(HashEntry节点链表头结点))锁:Segment分段锁,Se原创 2021-09-25 17:11:53 · 137 阅读 · 0 评论 -
HashMap和HashTable
HashMap和HashTable区别:HashMap、方法没有synchronized修饰,线程非安全,HashTable线程安全;HashMap允许key和value为null,而HashTable不允许底层实现:数组+链表实现jdk8开始链表高度到8、数组长度超过64,链表转变红黑树,元素以内部类Node节点存在计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,如果没有产生hash冲突(下标位置没有元素)。则直接创建node存入数组,如果产生hash冲突,先进行eq原创 2021-09-06 17:00:55 · 72 阅读 · 0 评论 -
ArrayList和LinkedList
ArrayList和LinkedListArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据时需要新增数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能,甚至超过linkedList(需要创建大量的node对象)。LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询,需要逐一遍历,遍历LinkedList原创 2021-09-06 16:42:14 · 75 阅读 · 0 评论 -
重载和重写
重载和重写重载(overload)发生在同一个类中,方法名必须相同,参数列表(参数类型、个数、顺序)不同。返回值、访问修饰符、异常可以相同也可以不同,不作为判断重载的条件。编译时的多态重写(override)发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,访问修饰符大于等于父类,抛出的异常范围小于等于父类。运行时多态重载和重写都是实现多态的方式,区别是重载是编译时的多态,重写是运行时多态...原创 2021-07-16 18:42:57 · 119 阅读 · 0 评论 -
String、StringBuffer、StringBuilder
String、StringBuffer、StringBuilderString是final修饰打,不可变,每次修改都会产生新打String对象StringBuffer和StringBuilder都是在原对象上操作StringBuffer是线程安全的,StringBuilder是线程不安全的StringBuffer方法都是synchronized修饰的性能:String < StringBuffer < StringBuilder经常修改字符串时使用StringBuffer、Strin原创 2021-07-10 18:23:47 · 66 阅读 · 0 评论 -
final
final类不可被继承、方法不可被重写、变量值不可变为什么局部内部类和匿名内部类只能访问局部final变量?原因是编译器实现上的困难:内部类对象的生命周期很有可能会超过局部变量的生命周期。局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类对象一样:自创建一个匿名内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才有可能会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方原创 2021-07-10 17:54:53 · 74 阅读 · 0 评论 -
== 和 equals
== 和 equals== :是判断两个变量或实例是不是指向同一个内存空间(基本数据类型比较的是值,引用数据类型比较的是内存地址equals:看类有没有重写,没有重写比较的也是地址,没有重写equals方法的类都是调用的Object的equals的方法。注意:String 中的 equals 方法是被重写过的S,string的equals方法比较的是对象的值.常量池,String s = “hello”;这种方式创建String对象时会先从常量池查找有没有这个对象,有就把它赋给当前引用,没有就创建一原创 2021-07-10 17:09:58 · 84 阅读 · 0 评论 -
JDK、JRE、JVM
JDK、JRE、JVMjdk: java develpment kit,java开发工具;jdk包含了jre,还包含了一些Java工具(调试和监视应用程序的工具javac、java、jconsole等)jre:java runtime environment,Java运行时环境;jre包含了jvm,还包含了Java核心类库。如果只是要运行Java程序只需安装jre。jvm:java virtual machine,java 虚拟机;jvm负责将.class文件转换为机器码;根据jvm版本(window原创 2021-07-07 18:37:29 · 84 阅读 · 0 评论 -
封装、继承、多态
封装、继承、多态封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。隐藏对象的属性和内部实现细节,外部调用无需修改或者关心内部实现。优点:1.提高程序安全性2.便于修改,提高可维护性3.良好的封装能够减少代码之间的耦合度继承继承是从已有的类(父类)中派生出新的类(子类),子类继承父类的属性和方法,并作出自己的改变和扩展1.Java只支持单继承,也就是只能继承一个类2.如果一个类没有声明继承关系,默认继承Object类3.子类继承原创 2021-06-24 15:24:30 · 89 阅读 · 0 评论 -
面向对象、面向过程
面向对象什么是面向对象?对比面向过程,是两种不同的处理问题的角度。面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)及各自需要做什么。面向过程优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。缺点: 没有面向对象易维护、易复用、易扩展面向对象优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更原创 2021-06-23 11:55:08 · 69 阅读 · 0 评论