冒泡排序和选择排序过程介绍
1.冒泡排序冒泡排序就是通过对比前一个和后一个数的大小,按照规则进行顺序的调换。每一轮对比之后最大或者最小值都会浮到最上面或者沉到最低下。
如:对这一数组进行冒泡排序:int a[5]{34,12,56,4,7}; 假设为从小到大排序
一共需要比较length-1轮:
第一轮: a.34和12比较,12比34小,那么调换位置,此时为:12,34,56,4,7,然后在对该序列进行排序
b.然后就是34和56进行对比,34比56小,不用调换顺序,此时依旧为:12,34,56,4,7,然后在对该序列进行排序
c.然后再就是56和4鸡西宁对比,4比56小,所以将56和4调换顺序,此时序列就是:12,34,4,56,7
d.再然后就对比56和7,7比56小,所以将二者位置进行调换,此时完成第一轮调换,序列为:12,34,4,7,56
我们可以看到第一轮排序之后,已经将序列中的最大值沉到最底部了。
第二轮:此时的排序此时交第一轮要减1,
a.先是12和34对比,前者比后者小,所以不用调换位置,序列时:12,34,4,7,56
...
java内部类讲解,成员内部类,局部内部类,匿名内部类,静态内部类
1 前言java中的类,除了定义在包(package)中之外,还可以定义在一个类的内部,主要有4种,分别是成员内部类,局部内部类,匿名内部类,静态内部类。接下通过代码分析,了解一下什么是java内部类。
2 java内部类介绍2.1 成员内部类成员内部类,顾名思义,也就是该内部类相当于该外部类的一个成员一样,和该外部类中的成员属性或者成员方法同级。
12345678910111213class Circle { private double radius = 0; public Circle(double radius) { this.radius = radius; } class Draw { //内部类 public void drawSahpe() { System.out.println("drawshape"); } }}
2.1.1 成员内部类访问外部 ...
JVM面试题以及字节码讲解
0 前言关于java字节码指令的含义,可以参考这篇博客:Java字节码指令含义解释与指令查询
1 try..catch..finally1.1 catch1.1.1 catch单个异常查看相应的java代码:
12345678910public class FinallyDemo { public static void main(String[] args) { int i = 10; try{ i = 20; }catch (NegativeArraySizeException e){ i = 30; } }}
接下来通过javap -v xxx.class命令,来查看该段源码的字节码反编译之后的信息:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 ...
Java字节码指令含义解释与指令查询
1 反编译获得java字节码信息首先看一段java源代码,然后编译后产生了一个.class文件,使用命令:javap -v xxx.class将其反编译。
123456789101112public class Code { public static void main(String[] args) { int i = 0; int x = 0; while(i < 10){ x = x++; i++; } System.out.println("x="+x);//x=? System.out.println("i="+i);//i=? }}
执行完反编译命令javap -v Code.class之后的信息:
1234567891011121314151617181920212223242526272829303132333435 ...
Java线程安全的集合
1 线程安全的集合
Vector
为什么Vecter是线程安全的呢?查看源代码:
从上面的代码可以看到,每个方法都加上了synchronized关键字,所以它是线程安全的。但是因为它的所有方式都加上了synchronized关键字,那么无论你是否需要对其进行多线程访问时,它都会对其进行锁定,执行效率会很低。现在已经弃用。
HashTable
HashTable和Vector类似,都是在每个方法上加上synchronized关键字来达到线程安全的目的。我们可以从下面的源代码可以看出:
2 java.util.concurrent下的线程安全集合java.util包下有一个concurrent包,下面的集合都是线程安全的集合,当需要使用线程来操作集合时,就调用该包下面的集合。下面看一段线程不安全的集合代码:
1234567891011121314151617181920212223import java.util.LinkedList;import java.util.List;public class ThreadSafe { public ...
什么是内存泄漏?
1 内存泄漏的定义
内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来。
2 内存泄漏导致的后果内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏带来的后果可能是不严重的,有时甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
程序运行后置之不理,并且随着时间的流逝消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求即使在程序终止之后也不会被释放 ...
Java线程内部堆内存溢出,并不会导致主线程退出
1 代码123456789101112public class HeapThread { private static final int _8M = 8 * 1024 * 1024; //vm 参数:-Xmx20m 设置堆内存为20M public static void main(String[] args) throws InterruptedException { new Thread(()->{ List<byte[]> list = new ArrayList<>(); list.add(new byte[_8M]); list.add(new byte[_8M]); }).start(); Thread.sleep(2000L); }}
运行结果:
从运行结果可以看出,线程内部的堆内存溢出,并不会导致主线程结束。
写在最后欢迎大家关注鄙人 ...
JVM虚拟机参数介绍
JVM参数大全
参数名称
含义
默认值
-Xms
初始堆大小
物理内存的1/64(<1GB)
默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx
最大堆大小
物理内存的1/4(<1GB)
默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn
年轻代大小(1.4or lator)
注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:NewSize
设置年轻代大小(for 1.3/1.4)
-XX:MaxNewSize
年轻代最大值(for 1.3/1.4)
-XX:PermSize
设置持久代(perm ...
markdown语法介绍
1 标题123456# 这是一级标题## 这是二级标题### 这是三级标题#### 这是四级标题##### 这是五级标题###### 这是六级标题
这是一级标题这是二级标题这是三级标题这是四级标题这是五级标题这是六级标题2 字体1234**这是加粗的文字***这是倾斜的文字*`***这是斜体加粗的文字***~~这是加删除线的文字~~
这是加粗的文字这是倾斜的文字`这是斜体加粗的文字这是加删除线的文字
3 引用123>这是引用的内容>>这是引用的内容>>>>>>>>>>这是引用的内容
这是引用的内容
这是引用的内容
这是引用的内容
4 分割线1234-------********
5 图片123![图片alt](图片地址 ''图片title'')实例:![微信公众号](https://jums.club/images/wechataccount.jpg)
6 超链接1234[显示的名字](链接地址) ...
java垃圾回收算法介绍
1 垃圾回收算法
标记算法
该算法分成两步完成:
在java程序运行过程中,当有些对应没有被gc root所引用时,那么该对象就会被标记。
当标记完之后,那些被标记的对应,就会被清除掉,也就是释放内存。释放之后,会那段内存的起始位置加入到内存的空内存地址库。当再有新对象被创建时,首先会查找地址库中的内存块是否有符合条件(内存大小是否够用)的,如果有,就将其分配给新对象,否则就另外开辟一段。
优点:
清理速度很快
只需要将被标记的对象的起始地址记录下来,就可以完成清理工作,所以速度很快
缺点:
容易产生内存碎片
从上图中可以看到,由于很多被释放掉的对象都是穿插着的,所以很难有一块完整的空内存,有时候总的空内存是足够分配给一块新的需要大内存的对象的,但是由于非常零碎,所以没办法利用。
标记整理
该算法还是分两步:
首先第一步和标记算法一样,都是先给没有被gc root引用的对象进行标记
这一步,该算法做了一个整理的操作:也就是将一些还在被gc root引用的对象向前移动,这里的移动包括数据,以及一些引用的地址,都需要做修改,所以这一步 ...