- 博客(47)
- 收藏
- 关注
原创 【剑指offer】正则表达式 -- Java 实现
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路:当模式中的第二个字符不是“*”时:1、如果字符串第一个字符和模式中的第一个字符相匹配,那么...
2019-12-18 22:12:54 147
原创 基数排序
要点基数排序与本系列前面讲解的七种排序方法都不同,它不需要比较关键字的大小。它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。不妨通过一个具体的实例来展示一下,基数排序是如何进行的。 设有一个初始序列为: R {50, 123, 543, 187, 49, 30, 0, 2, 11, 100}。我们知道,任何一个阿拉伯数,它的各个位数上的基数都是以09...
2019-10-16 20:03:59 180
原创 归并排序
基本思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分而治之可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可...
2019-10-16 20:00:44 147
原创 希尔排序
要点希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。该方法因DL.Shell于1959年提出而得名。希尔排序的基本思想是:把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。我们来通过演示图,更深入的...
2019-10-16 19:56:20 295
原创 冒泡排序、选择排序、直接插入排序
我们来了解一下Java中常见的三种排序方式,这里我们说的是1.冒泡排序2.选择排序3.插入排序排序中要考虑到的主要因素是时间复杂度和空间复杂度,时间我们可以用System.currentTimeMillis()这个来查看。下面我们依次来说明:1、冒泡排序所谓冒泡排序就是从前到后遍历选出最大值放到最后一个,然后在遍历剩下的找出剩下中最大的放到倒数第二个,依次直至遍历到最后一个,也就...
2019-10-16 18:31:18 483
原创 堆排
堆排序堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是...
2019-10-16 18:03:52 109
原创 数组
1、数组实现增、删、改、查/** * 1) 数组的插入、删除、按照下标随机访问操作; * 2)数组中的数据是int类型的; *//** * 测试数据注意事项: * * 插入数据: * 1、判断空数组插入数据。 * 2、输入下标索引超出下标范围。 * 3、将数据插入到尾部。 * * 查找数据: * 1、输入下标超出下标范围 * * * 删除数据: * 1、索引超出...
2019-10-13 16:02:05 109
原创 快速排序之非递归实现
接下来我们来看快速排序的非递归1、首先我们要借用一个栈来将第一趟排序后的左右子问题的标志进行入栈也就是它(low high)的下标(ps:图上为了清楚一点就把下标换成了值这样比较容易看)2、出栈 //非递归 public static void Quicks(int[] array){ int[] stack = new int[array.length]; int top =...
2019-10-10 12:51:26 357
原创 快速排序之递归实现
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。简单来说就是找基准。使基准前面的数都比它大(小),后面的数都比它小(大)。再采用分治思想将问题一次次分为规模较小的子问题,通过这样进行排序,最终实现整个序列的有序。1,找基准...
2019-10-10 12:45:57 1467
原创 Mysql总结之索引
MySQl索引1,索引的概念 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列 或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 目的:提高查询的效率2,索引的用法创建索引单列索引create table user (id int primary key,name varchar(20),age ...
2019-10-10 11:38:37 113
原创 Mysql总结之基本语句
MysqlDDL(数据库定义语言)1、数据库查看所有数据库:SHOW DATABASES;切换(选择要操作的)数据库: USE 数据库名;创建数据库: CREATE DATABASE [IF NOT EXITS] 数据库名[CHARSET = utf8];删除数据库: DROP DATABASE [IF EXITS] 数据库名;修改数据库编码: ALTER DATABASE 数据库...
2019-10-10 11:09:43 250
原创 【剑指offer】替换空格 -- Java 实现
一、题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。1. 调用自带函数public class Solution { public String replaceSpace(StringBuffer str) { return str.toString()...
2019-09-12 16:11:00 115
原创 【剑指 offer】二维数组中的查找 -- Java 实现
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。一、暴力法分析挨个遍历数组,如果找到就返回 true代码public class Solution { public boolean Find(int target, int []...
2019-09-12 15:42:23 112
原创 Callable实现多线程及线程运行状状态
Callable实现多线程从最传统来讲如果要进行多线程的实现肯定要依靠的就是Runnable,但是Runnable接口有一个缺点:当线程执行完毕之后无法获取一个返回值,所以从JDK1.5之后就提出了一个新的线程实现接口:java.util.concurrent.Callable接口,首先来观察这个接口的定义:可以发现Callable定义的时候可以设置一个泛型,此泛型的类型就是返回数据的类型,这...
2019-08-02 14:39:07 682
原创 Thread与Runnable关系
经过一系列的分析之后可以发现,在多线程的实现过程之中已经有了两种做法:Thread类、Runnable接口,如果从代码的结构本身来讲肯定是使用Runnable是最方便的,因为其可以避免单继承的局限,同时也可以更好的进行功能的扩充。但是从结构上也需要来观察Thread与Runnable的联系,打开Thread类的定义:Public class Thread extends Object impl...
2019-08-01 15:12:46 274
原创 基于Runnable接口实现多线程
虽然可以通过Thread类的继承来实现多线程的定义,但是在Java程序里面对于继承永远都是存在有单继承局限的,所以在Java里面有提供有第二种多线程的主体定义结构形式:实现java.lang.Runnable接口,此接口定义如下:@FunctionalInterface //从JDK1.8引入了Lambda表达式之后就变成了函数式接口public interface Runnable{ ...
2019-08-01 11:41:55 432
原创 Thread类实现多线程
如果要想在Java之中实现多线程,那么就需要有一个专门的线程主体类进行线程的执行任务的定义,而这个主体类的定义是有要求的,必须实现特定的接口或者继承特定的父类才可以完成。继承Thread类实现多线程Java里面提供有一个java.lang.Thread的程序类,那么一个类只要继承了此类就表示这个类为线程的主体类;这个类就可以直接实现多线程处理了,因为还需要Thread类中提供的一个run()方...
2019-07-31 15:49:58 1257
原创 进程与线程
在Java语言之中最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言),所以在整个Java技术的学习里面,如果不能够对多线程的概念有一个全面并且细致的了解,则在日后进行一些项目设计的过程之中尤其是并发访问设计的过程之中就会出现严重的技术缺陷。如果想要理解线程,首先就需要了解一下进程的概念,在传统的DOS系统的时代,其本身有一个特征:如果你的电脑上出现了病毒,那么多有的程序将无法执行,...
2019-07-31 12:40:49 210 2
原创 Java集合9——Set接口实现类Hashset
HashSet简介它继承AbstractSet,实现了Set接口,Cloneable,java.io.SerializableHashSet是一个没有重复元素的集合它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用null1、成员变量static final long serialVersionUID = -5024744406713321676L; //Ha...
2019-07-20 10:54:01 173 3
原创 Java集合8——WeakHashMap
学习WeakHashMap之前,我们先来学习一下Java的四种引用:Java中提供了一个Reference抽象类,此类定义所有引用对象共有的操作,与垃圾收集器密切配合实现的。主要是为了决定某些对象的生命周期,有利于JVM进行垃圾回收。而继承此类的有四种引用,分别是StrongReference(强引用),SoftReference(软引用),WeakReference(弱引用),PhantomR...
2019-07-18 11:35:49 331 1
原创 Java集合7——LinkedHashMap
LinkedHashMap特点:public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>继承于HashMap null: 数据重复性: 安全性:hashtable\vector 底层数据结构:不同点: HashMap:无法保证数据有序 LinkedHashMap保证...
2019-07-17 14:52:26 146
原创 HashMap的三种遍历方式
public class TestHashMap { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < 5; i++) { ...
2019-07-16 23:30:47 282
原创 Java集合5——Map的实现类HashMap
HashMap学习基于JDK 1.7版本学习源码实现(1.7和1.8的区别)public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable继承了AbstractMap,主要是实现map接口,当前Has...
2019-07-16 23:09:50 226
原创 Java集合4——List实现类之Vector
Vector简介以下源码都是jdk1.7.8.0Vector 是古老的实现类,继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用...
2019-07-11 16:38:13 253
原创 Java集合3——List实现类之LinkedList实现
LinkedList简介以下源码是 jdk1.7.8.0LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口,能对它进行队列操作。LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。LinkedList 实现了Cloneabl...
2019-07-11 16:19:42 172
原创 Java集合2——List实现类之ArrayList详解
一、ArrayList简介以下源码为jdk1.7.8.0**ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。public class ArrayList<E> extends Ab...
2019-07-11 14:54:26 185
原创 Java集合1——集合框架
一、集合框架图:可以看得出Java集合框架由Collection和Map两个根接口组成的Collection接口: Set:元素无序、不可重复的集合 ---类似高中的“集合” 实现类:HashSet TreeSet List:元素有序,可重复的集合 ---”动态”数组 实现类:ArrayList Linke...
2019-07-11 10:44:33 147
原创 Java进阶篇(三)——Java集合类
集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对集合进行遍历。集合的长度是可变的,用来存放对象的引用。常见的集合类有List集合、Set集合、Map集合。一.集合类接口 以下接口的常用方法有很多,这里只提其中重要的几个方法,其它方法在使用时...
2019-07-07 12:22:59 197
原创 Java进阶篇(二)——抽象类、内部类
之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性。一、抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类。抽象类不能被实例化,也就是不能创建其对象。使用abstract关键字定义抽象类,直接上例子。下面是一个抽象类的定义,在class前直接加上abstract关键字。最后一句“public abstract void voice();”是一个抽象方法,没有实际意...
2019-07-07 12:07:36 199
原创 Java进阶篇(一)——接口、继承与多态
前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等。本篇的主题是接口、继承与多态,在看下面的内容之前,首先需要了解一下继承和多态。继承机制的使用可以复用一些定义好的类,减少重复代码的编写;多态机制的使用可以动态调整对象的调用,降低对象之间的依存关系。有了这些概念,再来看接口是做什么...
2019-07-04 15:17:04 331 1
原创 Java面试经典问题的总结
最近在看面试题的时候遇到很多同类型的题,我自己先总结下来以下内容,以后每次遇到新的问题我都会追加上来一、解释一下静态绑定,动态绑定,多态1)静态绑定是编译时期就确定的函数调用,jvm反编译指令是invokeStatic,例如类的静态函数的调用都是静态绑定。2)动态绑定是运行时期才确定的函数调用,jvm反编译指令是invokeVirtual,例如多态调用时,对象的普通方法的调用都是动态绑定。...
2019-07-04 14:20:29 185
原创 Java中i++和++i的区别以及多线程中i++线程安全问题
一、i++和++i的区别i++ :先引用后增加 (先在i所在的表达式中使用i的当前值,后让i加1)++i :先增加后引用 (让i先加1,然后在i所在的表达式中使用i的新值)i-- :先引用后自减 (先在i所在的表达式中使用i的当前值,后让i减1)–i :先自减后引用 (让i先减1,然后在i所在的表达式中使用i的新值)我们举个例子:public static void main(...
2019-07-03 17:12:11 1115
原创 Java方法重写与重载的区别
一、方法重写(0veriding)在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访...
2019-07-03 16:11:33 112
原创 this()和super()关键字的区别
一、this关键字this只能用于实例有关的代码块中,如实例方法,构造方法,实例初始化代码块或实例变量的初始化代码块等,this就代表当前或者正在创建的实例对象的引用,通常可以利用这一关键字实现与局部变量同名的实例变量的调用。在构造方法中还可以用this来代表要显式调用的其他构造方法。除此之外,使用this关键字都将引发编译时错误。1.在类的构造方法中使用this关键字在构造方法内部使...
2019-07-03 15:38:49 297
转载 Java入门篇(六)——类和对象
写到这里终于写到了入门篇的最后一个知识点了。类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能。Java是面向对象的语言,因此掌握类与对象是学习Java语言的基础。类和对象的概念就不在此描述了,这篇随笔还是主要从代码方面入手,在学习本篇前建议先了解一下类和对象的概念、实例的概念以及面向对象程序的特点,也即封装、继承、多态。一、类 类是封装对象的...
2019-07-01 16:00:57 171
转载 Java入门篇(五)——字符串/String类
前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的。其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基本数据类型一样使用,声明与初始化等操作都是相同的,是程序经常处理的对象,所以学好String的用法很重要。一、创建字符串 在Java中用String类的构造方法来创建字符串变量,常用构造方法如下...
2019-07-01 15:53:00 172
转载 Java入门篇(四)——数组
上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的、用一个标识符封装到一起的基本类型数据序列或对象序列。数组是具有相同数据类型的一组数据的集合,根据维数不同可以分为一维数组、二维数组和多维数组。大家可以将一维看作直线,二维看作平面、三维看成立体空间。一、一维数组 1. 创建一维数组数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定...
2019-07-01 15:25:32 597
转载 Java入门篇(三)——Java流程控制
前两篇已经了解了Java语言基础,本篇开始Java的流程控制。流程控制对任何一门编程语言都是至关重要的,它提供了控制程序步骤的基本手段。一、复合语句 Java语言的复合语句是以整个块区为单位的语句,又称块语句。复合语句由“{”开始,“}”结束。对于复合语句,我们只需要知道,复合语句为局部变量创建了一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用,如果在某个变量的作...
2019-07-01 15:07:57 129
转载 Java入门篇(二)——Java语言基础(下)
六、运算符 1. 赋值运算符赋值运算符即“=”,是一个二元运算符(即对两个操作数进行处理),其功能是将右方操作数所含的值赋值给左方的操作符。其中左方必须是一个变量,而右边所赋的值可以使任何数值或表达式,例子如下:int a = 10; // 将10赋给aint b = 5; // 将5赋给bint c = a+b; // 将变量a...
2019-07-01 14:58:28 173
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人