
java基础
osillto
这个作者很懒,什么都没留下…
展开
-
IO复用模型
进程与线程的描述一个进程至少会创建一个线程,多个线程共享一个程序进程的内存。程序的运行最终是靠线程来完成操作的。线程的数量跟CPU核数有关,一个核最多能发出两个线程。线程的操作主要分为:一:给CPU进行程序命令的执行。二:IO的操作(读取或输出数据)或者请求网络数据。IO复用形成原因如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,那我们就需要开启一百万个进程一一对应处理这些I/O流(——这就是传统意义下的多进程并发处理)。思考一下,一百万个进程,你的原创 2021-09-04 20:39:58 · 712 阅读 · 0 评论 -
数据库大表优化
1.HasMap基础key-value形式用key做hash定位 整个将k和v存储到对应位置2.解决hash冲突方法拉链法开放地址法3.jdk1.7和1.8的区别1.7头插法hash()->4次扰动先扩容再插入数组+链表1.8尾插法hash()->1次扰动数组+链表/红黑树当前链表长度>=8 数组长度>64先插入再扩容4. jdk1.8HashMap插入原理判断数组是否为空,为空进行初始化;不为空的,计算插入原创 2021-09-04 16:22:23 · 325 阅读 · 0 评论 -
java的动态绑定
Java的动态绑定又称为运行时绑定。即在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。 意思就是说,程序会在运行的时候自动选择调用那个方法。二、Demo 1. 子类重写父类中的方法,调用子类中的方法public class Father{ public void method(){ System.out.println("父类方法:"+this.getClass()); }}public class Son extends Father{原创 2021-08-28 20:12:17 · 869 阅读 · 0 评论 -
java中的包装类型
包装类型Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示基本数据类型 包装类 byte Byte boolean Boolean short Short char Char原创 2021-08-28 19:48:29 · 360 阅读 · 0 评论 -
最大子序和
给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1] 的和最大,为6 。来源:力扣(LeetCode)几个连续数字相加越来越大,首先能想到一种情况全是正数,但是题中正负都有,所以在加之前要判断一次,前面几个数加上新的数字起来有没有新数字大,我们知道只有越加越大的情况下才能出现最大值,所以这里就利用了这一点,如果越...原创 2021-08-23 21:52:37 · 70 阅读 · 0 评论 -
volatile关键字
可见性第一:使用volatile关键字会强制将修改的值立即写入主存;第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量s原创 2021-08-21 10:16:39 · 90 阅读 · 0 评论 -
锁的升级过程
HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并 获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出 同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否 存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。如果测试失败,则需 要再测试一下Mark Word中偏向锁的标识是否设置成1(..原创 2021-08-21 10:06:38 · 183 阅读 · 0 评论 -
java中的对象结构
这一张图就很好的解释了java底层中对象的存储结构,MarkWord用来表示锁的情况,MetaData指向的就是元空间中加载的类的地址,数组长度是数组对象采用的,下面是实例数据对象头HotSpot虚拟机对象的对象头部分包括两类信息:第一类是用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,官方称它为“Mark Word”。第二类类型指针2.2实例数据 实例数据部分是对象真正存储的有效信息,即我们在程序代码里面..原创 2021-08-20 21:55:42 · 270 阅读 · 0 评论 -
synchronized底层分析
首先严格来说synchronized不是真正的锁,他更像是一个加锁的操作,真正的锁是Monitor,它是属于jvm创建的一个c++的对象。首先要看一下monitor的内部结构底层将等待的线程加入到等待队列中,因此来保证原子性的操作,进入synchronized的必须是同一个对象,不加synchronized的对象不会关联Monitor其实在对象头里面存的重量级锁指针指向的就是monitor。JVM基于进入和退出Monitor对 象来实现方法同步和代码块同步,但两者的实现细节不一原创 2021-08-20 21:32:48 · 81 阅读 · 0 评论 -
.java运行常见的异常
java提供了两种异常机制。一种是运行时异常,一种是检查式异常检查式异常:我们经常遇到的IO异常及sql异常就属于检查式异常。对于这种异常,java编译器要求我们必须对出现的这些异常进行catch 所以 面对这种异常不管我们是否愿意,只能自己去写一堆catch来捕捉这些异常。运行时异常:我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。throwable err原创 2021-08-19 22:56:49 · 142 阅读 · 0 评论 -
抽象类和接口的区别
抽象类出现的根本原因:无法完整描述一个事物的类抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),所以,当我们父类的方法,必须要子类重写实现时,用抽象类。如上面的 goToClass() 方法,学生、老师去课堂的目的完全不同,必须自己实现。(1)一个类中有抽象方法,这个类就变成了抽象类。 (2)抽象类中class的前面必须有abstract修饰符。 (3)抽象类中可以有普通方法,也可以有抽象方法,而抽象方法的个数可以是0个,也可以是多个。 (4)子类继承父类,必须重写全部的抽象方法,除非这原创 2021-08-19 22:43:25 · 334 阅读 · 0 评论 -
封装、继承、多态
面向过程注重过程,就是要分析出解决问题需要的步骤,然后按步骤一步一步实现,类调用时需要实例化,开销比较大,性能比面向对象高面向对象最主要的就是把构成问题的事务分解成各个对象,把对象封装成方法,然后调用方法,优点就是易维护,易扩展,提高了可重用性。 封装就是将一个对象的属性隐藏起来,不允许外界直接访问,但是可以通过调用指定的方法进行访问(name域只能通过,get set方法访问) 继承就是子类继承父类的所有的方法,而且可以拥有自己的方法,提高了代码的重用(对扩展是开放的) 多态原创 2021-08-19 22:39:19 · 70 阅读 · 0 评论 -
反射的优缺点
Java反射是一种能够在程序运行时动态访问、修改某个类中任意属性(状态)和方法(行为)的机制(包括private实例和方法),java反射机制提供了以下几个功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。反射的优点:反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类反射的缺点1.性能问题使用反射基本上是一种解释操作,用于字原创 2021-08-19 21:16:36 · 2182 阅读 · 0 评论 -
哈夫曼树分析
给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。这是百度搜素给的定义,从严格意义上来说哈夫曼树并不是二叉的而是多叉的,二叉树只是一种形式也是最常见的形式。这一点在百度搜素中也有注明,只是需要做一下调整,构造哈夫曼树的思想是每次选k个权重最小的元素来合成一个新的元素,该元素权重为k个元素权重之和。但是当k大于2时,按照这个步骤做下去可能到最后剩下的元素原创 2021-08-19 09:57:05 · 600 阅读 · 0 评论 -
final、finally和finalize
这三个单词长得很像,但是我们知道JavaScript和Java没有任何关系,所以长得像不一定有联系。接下分析一下它们到底都是什么究极有没有联系。final在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)修饰类的时候当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。原创 2021-08-15 21:45:58 · 120 阅读 · 0 评论 -
浅谈反射、代理和Aop
反射反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性(获取方法共三种,Class.forName("类的全限定名")、对象的getClass()方法和类名.class)。获取方法①Class.forName("类的全限定名"),该方法只能获取引用类型的类类型对象。该方法会抛出异常(a.l类加载器在类路径中没有找到该类 b.该类原创 2021-08-13 22:08:35 · 425 阅读 · 0 评论 -
java基础(参数传递)
java中的参数传递都为值传递,八大基本类型在方法中传值是直接传值的,无论是在java还是c中都是这样的。而引用类型在传递时会传递过去一个它在堆中的地址。这样的参数传递方式就会导致一些在参数交换产生一些问题,下面这些数值交换方法的使用就会体现出这一点。public class Main { public static void main(String[] args) { SingleInstance instance = SingleInstance.getInstance()原创 2021-08-11 21:44:50 · 92 阅读 · 0 评论