Java学习笔记
文章平均质量分 70
由此及彼
代码可以更优雅。
展开
-
一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)
给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。例子:[AABBCCDEEFFGG], 答案: D秒写简单算法,注意边界条件,遍历即可: private static char findSingleCharacter1(char[] input, int n) { int i; for (i = 0; i < n - 2; i =原创 2016-09-29 10:56:11 · 583 阅读 · 0 评论 -
JavaSE:3min讲解权限修饰符
一个项目有很多类,但是有些类,并不希望被其他类使用。每个类中都有成员和方法,但是并不是每个成员和方法都允许在其他类中调用。如何能做到访问控制呢?就需要使用访问权限修饰符。Java中的访问权限修饰符有4种,但是仅有3个关键字,因为不写访问权限,在Java中被称为默认权限,或同包权限,本文中以(default)代替。下面按照权限从小到大的顺序对4中访问权限分别介绍。1.私有权限(p原创 2016-10-28 14:04:37 · 317 阅读 · 0 评论 -
JavaSE:3min看一道匿名内部类的经典面试题
接下来我们一步步分析OuterAnonyTest.method().show();:看到OuterAnonyTest.method(),类名直接调方法,说明OuterAnonyTest里有一个静态方法method。看到OuterAnonyTest.method().show() ,链式编程,说明method返回对象所以才能继续调方法,又因为接口里有show方法,所以准确的说,method返回了接口。抽丝剥茧,一步步分析,得出答案。原创 2016-11-09 13:47:35 · 320 阅读 · 0 评论 -
算法优解(5)-删除单链表的倒数第k个节点
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出以及删除节点的打印,将这道题完善成了一个小Demo,和各位共勉。题目:* 给定一个单链表,删除它的倒数第k个节点。* 例如给定链表: 1→2→3→4→5,删除它的倒数第二个节点后变为 1→2→3→5。方法:* 第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针原创 2016-11-09 19:54:18 · 1021 阅读 · 0 评论 -
JavaSE-3min回顾并优化Object的equals方法
JavaSE基础学习,今天我们花3min回顾一下Object的equals方法并对equals方法进行优化。先看最好的教材,官方API文档:equalspublic boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返原创 2016-11-10 16:07:51 · 245 阅读 · 0 评论 -
算法优解(6)-反转单向链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出操作,将这道题完善成了一个小Demo,和各位共勉。 题目:* 反转单向链表这道题太常见了,必知必会。核心算法: public static Node reverseList(Node head){ Node pre = null; Node next = null; while(head !=原创 2016-11-10 19:21:47 · 371 阅读 · 0 评论 -
你不可不知的static(1)-引入及特点
在《Java编程思想》中有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:方便在没有创建对象的情况下来原创 2016-10-08 14:01:24 · 322 阅读 · 0 评论 -
一道折半算法变种的面试题
经验之谈:当你看到排好序、查找、logN等字眼时,请第一时间想到折半。一个排好序的整型数组,然后把数组中的元素循环左移若干位置。编程实现一种在新的数组中查找某个指定值的算法。要求时间复杂度为O(logN)。比如原数组是[1,4,9,10,15,16]循环左移2个位置得到[9,10,15,16,1,4]元素:15偏移量:2位置:4->2直接看核心算法,做一下边原创 2016-10-08 14:54:07 · 287 阅读 · 0 评论 -
你不可不知的interface(2)-成员特点
今天我们一起学习一下接口的成员特点(构造方法、成员变量、成员方法)。首先是构造方法:我们先定义一个接口,然后写一下他的构造方法:interface Inter{ public Inter(){}}写完后发现有啥问题吗?报错:Interfaces cannot have constructors这就是我们的第一条结论:接口没有构造方法。然后是成员变量原创 2016-10-20 19:35:46 · 312 阅读 · 0 评论 -
Java实现二叉树的构建以及3种遍历方法
对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成! 首先介绍树的构建方法,把一个数组的值赋值给一棵二叉树,然后附上具体的代码实现。1.树的构建方法 2.具体代码 package tree; import java.util.LinkedList; impo转载 2016-10-08 19:26:33 · 471 阅读 · 0 评论 -
JavaSE-3min回顾Object的finalize和clone方法
JavaSE基础学习,今天我们花3min回顾一下Object的finalize和clone方法。 先回顾finalize,看最好的教材,官方API文档:finalizeprotected void finalize() throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写fina原创 2016-11-11 11:55:51 · 259 阅读 · 0 评论 -
算法优解(4)-有序链表公共部分
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出,将这道题完善成了一个小Demo,和各位共勉。题目:* 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。因为是有序链表,链表对应遍历比较即可,题目比较简单,看代码:我们先定义一个节点类,包括自身的值和指向下一个节点的引用,以及一个构造函数为自身赋值。class Node{原创 2016-11-08 19:52:44 · 369 阅读 · 0 评论 -
你不可不知的interface(1)-引入及特点
面向对象编程的一大特征就是抽象。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。今天,我们就来学习一下接口的引入和特点。回到我们的猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了。但是,现在有很多的驯养员或者是驯兽师,可以训练出:猫钻火圈,狗跳高,狗做计算等。而这些额外的动作,并不是所有猫或者狗一开始就具备的,这应该属于经过特殊的培训训练出来的。所以,这些原创 2016-10-18 14:37:41 · 462 阅读 · 0 评论 -
你不可不知的final(2)-修饰局部变量(失手率极高的一道面试题)
final就是拒绝修改,防止世界被熊孩子破坏,维护世界和平!今天我们看一道失手率极高的面试题,final修饰局部变量。final修饰局部变量又可以分为修饰基本数据类型的局部变量和引用类型的局部变量两种情况。我们先看final修饰基本数据类型的局部变量: int x = 10; x = 100; final int x = 10; x = 100;原创 2016-10-15 12:26:01 · 836 阅读 · 0 评论 -
LeetCode上一道经典的面试题-O(1)实现LRU Cache
你遇到过这个题吗?实现一个LRU Cache。要求查询和插入都在O(1) 时间内完成。遇到过?很正常。没遇到?早晚会遇到。(鬼脸)这是LeetCode上一道十分经典的题目,也是非常火的面试题。原题:Design and implement a data structure for Least Recently Used (LRU) cache. It sho原创 2016-09-30 11:04:23 · 10290 阅读 · 0 评论 -
JavaSE:1min讲解引用类型参数(3)-接口
参数包括基本类型和引用类型,基本类型没什么好说的,今天我们要说的是引用类型,第三篇文章说的是接口作为参数。 我们先定义一个Hobby接口并在里面声明一个hobby方法。interface Hobby{ public abstract void hobby();}我们再定义一个HobbyDemo类并在里面定义一个hobbyDemo方法,参数为Hobby接口:class H原创 2016-10-26 10:58:37 · 280 阅读 · 0 评论 -
各大排序算法性能比较
所谓排序,即将原来无序的一个序列重新排列成有序的序列。排序方法中涉及到稳定性,所谓稳定性,是指待排序的序列中有两个或两个以上相同的项,在排序前和排序后看这些相同项的相对位置有没有发生变化,如果没有发生变化,即该排序方法是稳定的,如果发生变化,则说明该排序方法是不稳定的。如果记录中关键字不能重复,则排序结果是唯一的,那么选择的排序方法稳定与否就无关紧要了;如果关键字可以重复,则在选择排序转载 2016-11-07 15:40:19 · 380 阅读 · 0 评论 -
一道失手率极高的成员内部类面试题
有了前几篇成员内部类的基础,今天我们看一道失手率极高的成员内部类面试题。我们先定义一个OuterTest类和它的成员变量num(10),在定义一个OuterTest类的内部类InnerTest和它的成员变量num(20),最后定义内部类InnerTest的成员函数show和show的局部变量num(30)。那么问题来了,如何在main中调用show打印num,输出30、20、10?代码原创 2016-11-07 17:25:37 · 310 阅读 · 0 评论 -
Java字符串拼接效率分析及最佳实践
java连接字符串有多种方式,比如+操作符,StringBuilder.append方法,这些方法各有什么优劣(可以适当说明各种方式的实现细节)?按照高效的原则,那么java中字符串连接的最佳实践是什么?有关字符串处理,都有哪些其他的最佳实践?废话不多说,直接开始, 环境如下:JDK版本: 1.8.0_65CPU: i7 4790内存: 16G转载 2016-10-17 13:51:36 · 355 阅读 · 0 评论 -
Java字符串拼接那些事
关于Java字符串拼接,你一般用哪种方法?+还是StringBuilder?使用+来拼接字符串,使用javap命令来反编译代码,可以看出实际上编译器会自动创建StringBuilder,调用它的append方法来拼接字符串。如果在一个for循环语句中,循环100次,使用+来拼接字符串的话,就会创建100次StringBuilder对象,这样就很消耗内存,所以,在进行复杂字符串拼接的时候原创 2016-10-17 13:55:52 · 434 阅读 · 0 评论 -
JavaSE:1min讲解链式编程
今天我们花1min了解一下链式编程。我们先定义一个StudentChain类和他的study方法:class StudentChain{ public void study(){ System.out.println("Chain:Good Good Study."); }}然后我们定义一个StudentChainDemo类和他的getStudent方法,方法返回的是Stud原创 2016-10-27 10:55:23 · 382 阅读 · 0 评论 -
你不可不知的final(3)-初始化时机(失手率比较高的一道面试题)
final就是拒绝修改,防止世界被熊孩子破坏,维护世界和平! 继《你不可不知的final(2)-修饰局部变量(失手率极高的一道面试题)》后,今天我们再看一道失手率比较高的面试题,final的初始化时机。我们先看这一段代码:class Init{ int num = 10; public Init(){ System.out.println("Init()-1:" + num原创 2016-10-17 19:49:32 · 412 阅读 · 1 评论 -
JavaSE:3min讲解匿名内部类的使用
有了前几篇内部类的基础,现在我们进一步学习没名字的内部类,即匿名内部类。我们先写一段常规代码:定义一个接口PersonAnonyInnerClass和它的抽象方法study:interface PersonAnonyInnerClass{ public abstract void study();}定义接口的实现类StudentAnonyInnerClass并重写study方法原创 2016-11-08 11:45:12 · 294 阅读 · 0 评论 -
JavaSE:3min讲解常见的修饰符
今天我们一起学习一下7大常见修饰符,包括权限修饰符(4):private,protected,默认,public和状态修饰符(2):static,final以及抽象修饰符(1):abstract。下面我们分别对常见的类及其组成的修饰进行Demo验证:1.类://类://private:Illegal modifier for the class ClassPermissionTest原创 2016-10-31 10:49:01 · 985 阅读 · 0 评论 -
一个经典例子让你彻彻底底理解java回调机制
以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:Class A实现接口CallBack callback转载 2016-11-28 19:36:57 · 253 阅读 · 0 评论 -
项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)
NullPointerException空指针异常可以说是我们开发中最常遇到的Bug,因此我们处处判空,胆战心惊。处处判空确实可以解决空指针异常的Crash。但处处判空未免过于草木皆兵,而且写出来的代码十分不优雅,多余判断效率低下,这不是我们的Style!这里,我们由点到面,借鉴一下Android API中Splitter类的split方法和TextView类的setText方法,我们原创 2017-02-06 15:36:50 · 1124 阅读 · 0 评论 -
聊聊并发(六)——ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Concurr转载 2017-01-16 11:10:21 · 257 阅读 · 0 评论 -
RxJava系列1(简介)
前言提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅力。它能帮助我们简化代码逻辑,提升代码可读性。这对于开发效率的提升、后期维护成本的降低帮助都是巨大的。个人预测RxJava一定是2016年的一个大趋势,所以也有打算将它引入到公司现有的项目中来,写这一系列的文章主要也是为了团队转载 2017-01-16 14:47:02 · 349 阅读 · 0 评论 -
JavaSE系列:从源码和API分析StringBuffer(概述、构造方法)
下面我们将从概述、构造方法···几个方面简单介绍StringBuffer:概述,提到StringBuffer,下意识的蹦出两点,1.我们如果通过String对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题。2.线程安全的可变(长度和内容)字符序列。ps:线程安全:同步,依次顺序执行,安全性高;线程不安原创 2017-01-06 11:40:53 · 287 阅读 · 0 评论 -
JavaSE系列:必知必会的异常(概述)
你能保证自己写的程序永远不出错?就算程序不出错,你能保证用户总是按你的意愿输入?就算用户聪明且配合,你能保证程序的操作系统永远稳定?你能保证程序的硬件不会突然坏掉?你能保证网络永远畅通?···正因为太多的无法保证情况,因此我们需要异常机制。通过异常机制我们可以使异常处理代码和正常业务代码分离,让程序代码更佳优雅,提高程序的健壮性,今天我们简单了解一下异常。(异常概述)原创 2017-01-16 21:04:54 · 293 阅读 · 0 评论 -
聊聊并发(一)深入分析Volatile的实现原理
引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深转载 2017-01-24 14:51:28 · 222 阅读 · 0 评论 -
一个登录Demo初识MVP
从我们的项目到招聘网站的JD,处处可见Android MVP 模式的身影。项目越来越庞大,开发越来越多,MVP的优势越来越明显。今天我们通过一个简单的登录Demo,初步学会MVP的使用。首先,什么是MVP?MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了V原创 2017-03-08 16:20:45 · 429 阅读 · 0 评论 -
项目实战:滚动刷新场景(从ArrayList到LinkedList)
如果有这样一个需求,有这样一个列表显示数据,现假设一共显示25项,初始状态为空。首先从0-24添加数据,满了之后,覆盖最早数据,即继续从0-24追加数据。习惯性思维ArrayList开始搞。java.util 类 ArrayListjava.lang.Object java.util.AbstractCollection java.util.Abstra原创 2016-09-20 17:16:35 · 3961 阅读 · 6 评论 -
项目实战:超实用小工具isFastClick解决重复点击按钮问题
相信大家在项目开发中都遇到过这种case,点击按钮时,由于手机一时卡顿或者手速过快,造成按钮重复多次点击,跳转生成多个Activity(然后一个个关)或者其他重复操作。现在,就让我们通过几行代码一劳永逸的解决它。小工具的核心思想就是借助System.currentTimeMillis()计算多次点击按钮的时间差,如果这个时间差很小,我们就认为这是无效的重复点击。封装一个Utils工原创 2017-04-01 13:46:31 · 1665 阅读 · 0 评论 -
项目实战:关于format(String)你不知道的那些事
在项目中有一种很常见的case就是字符串拼接,以我们专车下单页的企业规则校验场景为例,如图,我们来分析这一句提示文案:立即叫车服务不符合企业用车规则,无法用车它是由两部分组成,动态的当前服务类型(立即叫车)+静态的固定文案(服务不符合企业用车规则,无法用车)。因为我们现在有很多服务类型(立即叫车、预约用车、日租、半日租、接机、送机、定制···),我们需要根据用户选择的服务类原创 2017-03-16 11:36:27 · 519 阅读 · 0 评论 -
算法之美:取球游戏
前言:在编程问题中,取球游戏的一般解题模板伪代码: f(局面x){//——>胜(true)负(false) 边界条件处理。。。。。 For(我所有可能的走法){ 试着走一步——>局面y 胜负t = f(y);转载 2017-01-03 13:59:45 · 1431 阅读 · 0 评论 -
简谈我所理解的面向对象
“什么是面向对象?”这个问题往往会问到刚毕业的新手or实习生上,也是往往作为一个技术面试的开头题。在这里我们不去谈如何答(fu)好(yan)问(guo)题(qu),仅谈谈我所理解的面向对象。为什么“面向对象”?最早的时候是面向过程。想象一下一堆C语言or汇编堆砌在一起的函数互相调(shang)用(hai)的场景————什么?你说你没学过C语言?那么你就想象一下一个复杂的SQL语转载 2016-11-24 10:51:47 · 415 阅读 · 0 评论 -
算法优解(9)-单链表的选择排序
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。题目:给定一个无序单链表的头结点head,实现单链表的选择排序。要求额外空间复杂度O(1)。思路:从未排序链表中找到最小节点small的前一节点smallPre,从而在未排序链表中删除最小节点small,并将最小节点small添加到已排序链表中,由此逐渐原创 2016-11-16 19:43:17 · 862 阅读 · 0 评论 -
JavaSE:3min讲解内部类
首先什么是内部类?把一个类Inner定义在另一个类Outer的内部,Inner类就被称为内部类。class Outer{ class Inner{ }}然后我们看一下内部类的访问规则:A:可以直接访问外部类的成员,包括私有:class Outer{ private int num = 10; class Inner{ public void show()原创 2016-11-01 20:08:59 · 289 阅读 · 0 评论 -
JavaSE-String API compareTo源代码分析
曾记否我们在JavaSE-String API 其他功能接触的compareTo,今天我们深入源代码一探究竟。请看这样一段代码:public class CompareToTest { /** * 权兴权意-2016.11.17 * JavaSE-String API compareTo源代码分析 */ public static void main(String[] a原创 2016-11-17 14:47:30 · 389 阅读 · 0 评论