java基础
Tiger--Chen
这个作者很懒,什么都没留下…
展开
-
冒泡排序原理及java代码实现
冒泡排序的关键是:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数(冒泡排序的关键是找准内外排序次数,外循环执行N-1次,内循环执行N-i次(这里的N-i是因为外循环是i是从1开始的不是0)。如下面的代码:思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小...原创 2018-05-19 14:01:02 · 495 阅读 · 0 评论 -
算法:深度优先算法和广度优先算法(基于邻接矩阵)
本文转载自http://www.cnblogs.com/liuyihai/p/8762581.html1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法。 另一种是基于链表的的邻接表。 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接。...转载 2018-08-09 22:13:59 · 1043 阅读 · 0 评论 -
进程与线程
什么是线程和进程?进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。进程与线程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间...原创 2018-07-03 14:43:44 · 170 阅读 · 0 评论 -
面向对象的四个特征与“六原则一法则”解析
面向对象的四个特征主要有抽象、继承、封装和多态四个方面,下面是我们来详细分析它们的含义: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了...原创 2018-07-02 11:03:40 · 342 阅读 · 0 评论 -
ConcurrentHashMap1.8讲解
https://www.cnblogs.com/study-everyday/p/6430462.htmlhttps://www.jianshu.com/p/c0642afe03e0以上两篇文章综合看原创 2018-06-10 17:54:14 · 437 阅读 · 1 评论 -
序列化和反序列化解析
一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对...原创 2018-05-30 15:09:22 · 991 阅读 · 2 评论 -
AtomicStampedReference使用方法
我们都知道在使用CAS也就是使用compareAndSet(current,next)方法进行无锁自加或者更换栈的表头之类的问题时会出现ABA问题,Java中使用AtomicStampedReference来解决CAS中的ABA问题,它不再像compareAndSet方法中只比较内存中的值也当前值是否相等,而且先比较引用是否相等,然后比较值是否相等,这样就避免了ABA问题。那么AtomicStam...原创 2018-06-12 16:19:05 · 9801 阅读 · 0 评论 -
并发中volatile关键字解析
1.volatile关键字的两层语义一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。先看一段代码,假如线程1先执行,线程2后执行:12345678//线程1boolean stop = false;while(!...原创 2018-05-28 16:18:23 · 154 阅读 · 0 评论 -
Executor, ExecutorService 和 Executors 间的不同
参考: Executor, ExecutorService 和 Executors 间的不同UML简要类图关系:下面详细看一下三者的区别:Executor vs ExecutorService vs Executors正如上面所说,这三者均是 Executor 框架中的一部分。Java 开发者很有必要学习和理解他们,以便更高效的使用 Java 提供的不同类型的线程池。总结一下这三者间的区别,以便大...转载 2018-05-16 19:57:57 · 365 阅读 · 0 评论 -
Comparable和Comparator的区别
初次碰到这个问题是之前有一次电话面试,问了一个小时的问题,其中有一个问题就问到Comparable和Comparator的区别,当时没答出 来。之后是公司入职时候做的一套Java编程题,里面用JUnit跑用例的时候也用到了Comparator接口,再加上JDK的大量的类包括常见的 String、Byte、Char、Date等都实现了Comparable接口,因此要学习一下这两个类的区别以及用法。 ...转载 2018-05-16 19:56:02 · 119 阅读 · 0 评论 -
深入理解java线程池—ThreadPoolExecutor
java的线程池真的是很绕,以前一直都感觉新建几个线程一直不退出到底是怎么实现的,也就有了后来学习ThreadPoolExecutor源码。学习源码的过程中,最恶心的其实就是几种状态的转换了,这也是ThreadPoolExecutor的核心。花了将近小一周才大致的弄明白ThreadPoolExecutor的机制,遂记录下来。线程池有多重要#####线程是一个程序员一定会涉及到的一个概念,但是线程的...转载 2018-05-16 19:48:56 · 166 阅读 · 0 评论 -
java线程池
为什么用线程池 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 线程池ThreadPoolExecutor 既然Android中线程池来自于Java,那么研究Android线程池其实也可以说是研究Java中的线程池在J...原创 2018-06-03 18:31:14 · 156 阅读 · 0 评论 -
快排的原理分析及java代码实现
1、基本思想:快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:对于给定的一组记录,选择...原创 2018-05-19 14:08:47 · 1124 阅读 · 0 评论 -
选择排序原理分析与java代码实现
1、选择排序改进了冒泡排序,将必要的交换次数从 O(N^2 )减少到 O(N)次(理解选择排序可以先看一下我的上一篇冒泡排序的博客)不幸的是比较次数仍然保持为 O(N^2 )。然而,选择排序仍然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。(一般来说,在 Java 语言中不是这种情况,Java 中只是改变了引...原创 2018-05-19 14:05:21 · 184 阅读 · 1 评论 -
插入排序算法原理及java代码实现
1、简介与原理在大多数情况下,插入排序算法是这三种排序中最好的一种。虽然插入排序算法仍然需要 O(N^2N2)的时间,但是在一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。尽管它比冒泡排序算法和选择排序算法都更麻烦一些,但它也并不很复杂。它经常被用在较复杂的排序算法的最后阶段,例如快速排序。插入排序原理即:局部有序,先把第一个数据看成一个有序数组,然后把第二个数据插入到这个“有序数组”中,...原创 2018-05-19 14:02:09 · 498 阅读 · 0 评论 -
两数之和:给定一个整数数组,找出其中两个数相加等于目标值
有三种思路: 第一个思路:遍历数组i从第一个数开始,j从(i+1)开始,直到找到合适的值。这个算法的时间复杂度为O(n2),空间复杂度为O(1)。第二个思路:在前一个算法的基础上降低时间复杂度。我们可以将数组排序,然后定义两个指针,一个指针i从左向右,另一个从j右向左。 ①如果data[i]+data[j] < tager ,则++i ②如果data[i]+data[j] > ...原创 2018-08-02 21:36:20 · 4237 阅读 · 0 评论