<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[whdAlive 's blog]]></title><description><![CDATA[Coding than talking]]></description><link>https://blog.youkuaiyun.com/whdAlive</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; whdAlive]]></copyright><item><title><![CDATA[LeetCode 随机 - 两两交换链表中的节点]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/89028815</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/89028815</guid><author>whdAlive</author><pubDate>Thu, 04 Apr 2019 17:01:07 +0800</pubDate><description><![CDATA[24. 两两交换链表中的节点
给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
示例:
给定 1-&gt;2-&gt;3-&gt;4, 你应该返回 2-&gt;1-&gt;4-&gt;3.

代码
/**
 * Definition for singly-linked list.
 * public class ListNo...]]></description><category></category></item><item><title><![CDATA[LeetCode 随机 - Z 字形变换]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/89028504</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/89028504</guid><author>whdAlive</author><pubDate>Thu, 04 Apr 2019 16:52:42 +0800</pubDate><description><![CDATA[6. Z 字形变换
将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时，排列如下：
L   C   I   R
E T O E S I I G
E   D   H   N

之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定...]]></description><category></category></item><item><title><![CDATA[LeetCode 随机 - 全排列 II]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/89028398</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/89028398</guid><author>whdAlive</author><pubDate>Thu, 04 Apr 2019 16:49:57 +0800</pubDate><description><![CDATA[47. 全排列 II
给定一个可包含重复数字的序列，返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

代码
class Solution {
    public static List&lt;List&lt;Integer&gt;&gt; permuteUnique(int[] nums) {
      ...]]></description><category></category></item><item><title><![CDATA[LeetCode 高级 -  Remove Invalid Parentheses]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/82194286</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/82194286</guid><author>whdAlive</author><pubDate>Wed, 29 Aug 2018 23:06:27 +0800</pubDate><description><![CDATA[Remove Invalid Parentheses

删除最小数量的无效括号，使得输入的字符串有效，返回所有可能的结果。

说明: 输入可能包含了除 ( 和 ) 以外的字符。

示例 1:

输入: &quot;()())()&quot;
输出: [&quot;()()()&quot;, &quot;(())()&quot;]

示例 2:



输入: &quot;(a)())()&quot;
输出: [&quot;(a)()()&quot;, &quot;(a())()&quot;]

示例 3:

]]></description><category></category></item><item><title><![CDATA[Java 之路 (二十) -- Java I/O 上（BIO、文件、数据流、如何选择I/O流、典型用例）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/82019977</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/82019977</guid><author>whdAlive</author><pubDate>Fri, 24 Aug 2018 15:42:33 +0800</pubDate><description><![CDATA[前言

Java 的 I/O 类库使用 流 这个抽象概念，代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。流 屏蔽了实际的 I/O 设备中处理数据的细节。

数据流是一串连续不断的数据的集合，简单理解的话，我们可以把 Java 数据流当作是 管道里的水流。我们只从一端供水（输入流），而另一端出水（输出流）。对输入端而言，只关心如何写入数据，一次整体全部输入还是分段输入等；对于输...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十九) -- 注解（语法、预定义注解、元注解、重复注解、注解与反射）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81978089</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81978089</guid><author>whdAlive</author><pubDate>Thu, 23 Aug 2018 11:36:57 +0800</pubDate><description><![CDATA[前言

官方注解的定义如下：


  注解（一种元数据形式）提供有关不属于程序本身的程序的数据。注解对它们注解的代码的操作没有直接影响。
  
  注解有许多用途，其中包括：
  
  
  编译器的信息 - 编译器可以使用注解来检测错误或抑制警告。
  编译时和部署时处理 - 软件工具可以处理注解信息以生成代码，XML文件等。
  运行时处理 - 可以在运行时检查某些注解。
  


第一次看时...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十八) -- 容器深入研究（容器接口，实现类特性及对比）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81809426</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81809426</guid><author>whdAlive</author><pubDate>Sat, 18 Aug 2018 15:36:11 +0800</pubDate><description><![CDATA[1. 接口

首先，放上层次图（少了Queue）。

 

Collection 继承了 Iterator 接口（事实上，该接口是所有集合的总接口），定义了集合的遍历操作。

前面我们已经介绍过集合类的基础知识，这里就简单回顾以下：


**Collection：**Collection 是一个接口，没有直接实现类。它用来传递集合并在需要最大通用性时对其进行操作。
List：有序集合（或称为序列）...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十七) -- 数组（基本概念与使用、数组与泛型、数组操作、Arrays 类）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81777917</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81777917</guid><author>whdAlive</author><pubDate>Fri, 17 Aug 2018 15:11:03 +0800</pubDate><description><![CDATA[学完复杂的泛型，来学点简单的。本文介绍 Java 数组的相关知识。





1. 基本概念

数组是一个容器对象，它包含固定数量的单个类型的值。&amp;amp;nbsp;创建数组时，将建立数组的长度。&amp;amp;nbsp;创建后，其长度是固定的。

 

数组中的每个项成为元素，每个元素由其数组索引访问。

举个简单例子：



class ArrayDemo {
    public static void main...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十六) -- 泛型下（通配符、类型擦除、泛型的限制）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81751208</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81751208</guid><author>whdAlive</author><pubDate>Fri, 17 Aug 2018 00:56:34 +0800</pubDate><description><![CDATA[7. 通配符

通配符，即 “?”，用来表示未知类型。

通配符可用作各种情况：作为参数，字段或局部变量的类型；有时也作为返回类型；通配符从不用作泛型方法调用、泛型类实例创建或超类型的类型参数。



7.1 上限有界的通配符

使用上限通配符来放宽对变量的限制。

声明上限通配符的语法：&amp;amp;lt;? extends 上限&amp;amp;gt;

举个例子：



public static double sum...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十五) -- 泛型上（泛型类、泛型方法、有界类型参数、泛型与继承、类型推断）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81751200</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81751200</guid><author>whdAlive</author><pubDate>Fri, 17 Aug 2018 00:52:44 +0800</pubDate><description><![CDATA[Thinking in Java 中关于泛型的讲解篇幅实在过长，前后尝试阅读这一章，但总是觉得找不到要点，很迷。于是放弃 Thinking in Java 泛型一章的阅读，转而官方教程，本章可以算作官方教程的中文版。


  放上官方教程地址：
  
  The Java™ Tutorials - Generics






1.为什么使用泛型

简单来说，泛型使类型在定义类、接口和方法时成为参...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十四) -- 类型信息（RTTI、Class 对象的加载、Class 引用的获取与泛化、instanceof 关键字、反射基础与简单使用示例）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81708472</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81708472</guid><author>whdAlive</author><pubDate>Wed, 15 Aug 2018 17:52:23 +0800</pubDate><description><![CDATA[学习内容：


传统的 RTTI  
Class 对象的加载
获取 Class 对象引用的方式
ClassforName
类字面常量
Class 引用的泛化
instanceof 关键字
反射 
相关类
简单使用示例




前言

运行时类型信息使得我们可以在程序运行时发现和使用类型信息，Java 中运行时识别对象和类的信息有如下两种方式： 


传统的 RTTI ：假定我们在编译时已经知道所有...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十三) -- 字符串（String、正则表达式）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81668759</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81668759</guid><author>whdAlive</author><pubDate>Tue, 14 Aug 2018 15:58:32 +0800</pubDate><description><![CDATA[
  个人吐槽：对于这章，第一遍读和重读之后果然看法不同：第一次读时觉得，文章用了大篇幅来介绍 API，这样我可以比较容易理解这个方法是干嘛的，以此理解这个类是干嘛的；但是重读之后觉得，文章居然用了这么大篇幅在讲 API（尤其是正则表达式），如果我需要知道具体某个方法怎么用，直接去官方文档查多好啊，这种情况下，我更希望得到某个方法可能出现的坑，而不只是方法的介绍（毕竟，这往往需要踩过坑之后总结的，...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十二) -- 异常（基本常识、try-catch-finally、throw、throws、使用指南）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81635007</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81635007</guid><author>whdAlive</author><pubDate>Mon, 13 Aug 2018 18:43:37 +0800</pubDate><description><![CDATA[
Java 的基本理念是 “结构不佳的代码不能运行”
错误回复在我们编写的每个程序中都是基本的元素
Java 的主要目标之一是创建供他人使用的程序构件
Java 的异常处理的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成，并且通过这种方式可以使你更加自信：你的应用中没有未处理的错误




1. 初识异常

正式介绍异常之前，先来看一个例子：



public static vo...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十一) -- 持有对象（Collection、List、Set、Queue、Map、Iterator、foreach）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81588259</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81588259</guid><author>whdAlive</author><pubDate>Sat, 11 Aug 2018 16:45:48 +0800</pubDate><description><![CDATA[本章将简单介绍一下常用的集合类的特点，同时并不会深入源码分析原理，本文目的仅仅在于对 Java 集合类有一个整体认识

关于 API，本文不涉及过多，建议直接查看 Java 官方文档


  https://docs.oracle.com/javase/9/docs/api/overview-summary.html






1. 容器概述



1.1 引入原因

Java 中，数组用来保存...]]></description><category></category></item><item><title><![CDATA[Java 之路 (十) -- 内部类（概念、分类、特性、意义、"多重继承"、继承）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81584021</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81584021</guid><author>whdAlive</author><pubDate>Sat, 11 Aug 2018 10:32:52 +0800</pubDate><description><![CDATA[1. 内部类基础



1.1 什么是内部类

内部类的定义如下：


可以将一个类的定义放在另一个类的定义内部，这就是内部类


更具体一点，对于编程思想而言：


内部类允许将逻辑相关的类组织在一起，并控制位于内部的类的可视性。
内部类就像是一种代码隐藏机制：将类置于其他类的内部，它了解外围类，能与之通信




1.2 内部类的分类

内部类分为以下四类：


成员内部类：最最普通的内部类，...]]></description><category></category></item><item><title><![CDATA[Java 之路 (九) -- 接口（抽象类方法、接口、多重继承、接口与解耦等）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81542233</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81542233</guid><author>whdAlive</author><pubDate>Thu, 09 Aug 2018 18:48:32 +0800</pubDate><description><![CDATA[我们前面学过通过“隐藏实现”可以将接口与实现分离，然而它仅仅作为基础，而本章的接口以及下一章的内部类 为我们提供了一种将接口和实现分离的更加结构化的方法。

话不多说，进入正题。





1. 抽象类和抽象方法


  抽象类是普通的类与接口之间的一种中庸之道。




1.1 什么是抽象类/方法

抽象方法


定义：指的是一些只有方法声明，而没有具体方法体的方法。
声明语法：通过 abstr...]]></description><category></category></item><item><title><![CDATA[Java 之路 (八) -- 多态（向上转型、多态、绑定、构造器与多态、再再谈初始化和类的加载、协变返回类型、向下转型）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81517978</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81517978</guid><author>whdAlive</author><pubDate>Thu, 09 Aug 2018 00:12:01 +0800</pubDate><description><![CDATA[多态 是继 数据抽象 和 继承 之后的第三种基本特征。 
多态也称作动态绑定、后期绑定或运行时绑定。


  多态的一些具象表现。
  
  
  允许不同类的对象对同一消息做出响应
  同一个行为具有多个不同表现形式或形态的能力 
  只有在运行时才会知道引用变量所指向的具体实例对象
  


封装：通过合并特征和行为创建新的数据类型。 
实现隐藏：通过将细节私有化，把接口和实现分离开来 
多态...]]></description><category></category></item><item><title><![CDATA[Java 之路 (七) -- 复用类（组合、继承、代理、向上转型、final、再谈初始化和类的加载、方法覆盖）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81507847</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81507847</guid><author>whdAlive</author><pubDate>Wed, 08 Aug 2018 14:39:24 +0800</pubDate><description><![CDATA[学习内容


两种代码复用机制 - 组合 &amp;amp;amp; 继承 
以及中庸之道 - 代理
组合 和 继承 
如何选择使用
如何结合使用
向上转型
final 关键字






1. 组合



1.1 组合的概念

​   在新的类中产生现有类的对象，由于新的类是由现有类的对象所组成，所以这种方法成为组合。



1.1.1 组合的写法及样例

只需要在当前类中声明另一个类的对象作为其成员变量即可，...]]></description><category></category></item><item><title><![CDATA[Java 之路 (六) -- 访问权限控制（Package、Public、protected、friendly、private）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81486949</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81486949</guid><author>whdAlive</author><pubDate>Tue, 07 Aug 2018 19:23:09 +0800</pubDate><description><![CDATA[这一章内容比较少，也比较基础。

不多废话，下面开始这一章的学习吧。



学习内容


包 package
访问权限 public、protected、默认、private






1. Package

(1) 原因：为了更好的组织类，Java 提供了包机制，用来区别类名的命名空间。

(2) 包的作用：


利用操作系统的层次化的文件结构，将特定包的 .class 文件都置于一个目录下。...]]></description><category></category></item><item><title><![CDATA[Java 之路 (五) -- 初始化和清理（构造器与初始化、方法重载、this、垃圾回收器、枚举类型）]]></title><link>https://blog.youkuaiyun.com/whdAlive/article/details/81482196</link><guid>https://blog.youkuaiyun.com/whdAlive/article/details/81482196</guid><author>whdAlive</author><pubDate>Tue, 07 Aug 2018 15:31:35 +0800</pubDate><description><![CDATA[学习内容：


构造器
方法重载
this 关键字
垃圾回收器的清理
初始化问题
枚举类型


这一章内容有一点点多，需要注意的地方也很多。下面就开始我的表演了。





1. 构造器

(1) 概念：


一个创建对象时被自动调用的特殊方法。


(2) 作用：


通过构造器，创建对象，并确保对象得到初始化。


(3) 命名：


构造器的名称必须与类名相同。


(4) 特殊：


构造...]]></description><category></category></item></channel></rss>