<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>接口开发 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E6%8E%A5%E5%8F%A3%E5%BC%80%E5%8F%91/</link><description>Recent content in 接口开发 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Nov 2017 21:06:43 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E6%8E%A5%E5%8F%A3%E5%BC%80%E5%8F%91/index.xml" rel="self" type="application/rss+xml"/><item><title>Java 注解全面解析</title><link>https://pangyd.com/post/178-java/</link><pubDate>Wed, 22 Nov 2017 21:06:20 +0800</pubDate><guid>https://pangyd.com/post/178-java/</guid><description>&lt;p style="text-align: center">&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="550|338">&lt;/p>&lt;p>注解定义看起来很像接口的定义。事实上，与其他任何接口一样，注解也将会编译成class文件。&lt;/p>&lt;blockquote>&lt;p>@Target(ElementType.Method)&lt;/p>&lt;p>@Retention(RetentionPolicy.RUNTIME)&lt;/p>&lt;p>public @interface Test {}&lt;/p>&lt;/blockquote>&lt;p>除了@符号以外，@Test的定义很像一个空的接口。定义注解时，需要一些元注解（meta－annotation），如@Target和@Retention&lt;/p>&lt;p>@Target用来定义注解将应用于什么地方（如一个方法或者一个域）&lt;/p>&lt;p>@Retention用来定义注解在哪一个级别可用，在源代码中（source），类文件中（class）或者运行时（runtime）&lt;/p>&lt;p>在注解中，一般都会包含一些元素以表示某些值。当分析处理注解时，程序可以利用这些值。没有元素的注解称为标记注解（marker annotation）&lt;/p>&lt;p>四种元注解，元注解专职负责注解其他的注解，所以这四种注解的Target值都是ElementType.ANNOTATION_TYPE&lt;/p>&lt;table width="736" class="layui-table">&lt;tbody>&lt;tr class="firstRow">&lt;th style="text-align: center">注解&lt;/th>&lt;th style="text-align: center">说明&lt;/th>&lt;/tr>&lt;tr>&lt;td>@Target&lt;/td>&lt;td>表示该注解可以用在什么地方，由ElementType枚举定义&lt;br data-filtered="filtered">CONSTRUCTOR：构造器的声明&lt;br data-filtered="filtered">FIELD：域声明（包括enum实例）&lt;br data-filtered="filtered">LOCAL_VARIABLE：局部变量声明&lt;br data-filtered="filtered">METHOD：方法声明&lt;br data-filtered="filtered">PACKAGE：包声明&lt;br data-filtered="filtered">PARAMETER：参数声明&lt;br data-filtered="filtered">TYPE：类、接口（包括注解类型）或enum声明&lt;br data-filtered="filtered">ANNOTATION_TYPE：注解声明（应用于另一个注解上）&lt;br data-filtered="filtered">TYPE_PARAMETER：类型参数声明（1.8新加入）&lt;br data-filtered="filtered">TYPE_USE：类型使用声明（1.8新加入）&lt;br data-filtered="filtered">PS：当注解未指定Target值时，此注解可以使用任何元素之上，就是上面的类型&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Retention&lt;/td>&lt;td>表示需要在什么级别保存该注解信息，由RetentionPolicy枚举定义&lt;br data-filtered="filtered">SOURCE：注解将被编译器丢弃（该类型的注解信息只会保留在源码里，源码经过编译后，注解信息会被丢弃，不会保留在编译好的class文件里）&lt;br data-filtered="filtered">CLASS：注解在class文件中可用，但会被VM丢弃（该类型的注解信息会保留在源码里和class文件里，在执行的时候，不会加载到虚拟机（JVM）中）&lt;br data-filtered="filtered">RUNTIME：VM将在运行期也保留注解信息，因此可以通过反射机制读取注解的信息（源码、class文件和执行的时候都有注解的信息）&lt;br data-filtered="filtered">PS：当注解未定义Retention值时，默认值是CLASS&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Documented&lt;/td>&lt;td>表示注解会被包含在javaapi文档中&lt;/td>&lt;/tr>&lt;tr>&lt;td>@Inherited&lt;/td>&lt;td>允许子类继承父类的注解&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>&lt;/p>&lt;section class="">&lt;section data-by="96weixin">&lt;section style="text-align: center">&lt;section>&lt;img data-src="https://pangyd.com/uploads/2017/11/74c10f869f038762.jpg" data-type="jpeg" class="" data-ratio="1.09" data-w="100" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/section>&lt;section>&lt;h2>&lt;span>2. 注解元素&lt;/span>&lt;/h2>&lt;/section>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;span>– 注解元素可用的类型如下：&lt;/span>&lt;/p>&lt;p>– 所有基本类型（int,float,boolean,byte,double,char,long,short）&lt;/p>&lt;p>– String&lt;/p>&lt;p>– Class&lt;/p>&lt;p>– enum&lt;/p>&lt;p>– Annotation&lt;/p>&lt;p>– 以上类型的数组&lt;/p>&lt;p>如果使用了其他类型，那编译器就会报错。也不允许使用任何包装类型。注解也可以作为元素的类型，也就是注解可以嵌套。&lt;/p>&lt;p>元素的修饰符，只能用public或default。&lt;/p>&lt;p>&lt;span>– 默认值限制&lt;/span>&lt;/p>&lt;p>编译器对元素的默认值有些过分挑剔。首先，元素不能有不确定的值。也就是说，元素必须要么具有默认值，要么在使用注解时提供元素的值。&lt;/p>&lt;p>其次，对于非基本类型的元素，无论是在源代码中声明，还是在注解接口中定义默认值，都不能以null作为值。这就是限制，这就造成处理器很难表现一个元素的存在或缺失状态，因为每个注解的声明中，所有的元素都存在，并且都具有相应的值。为了绕开这个限制，只能定义一些特殊的值，例如空字符串或负数，表示某个元素不存在。&lt;/p>&lt;blockquote>&lt;p>@Target(ElementType.Method)&lt;/p>&lt;p>@Retention(RetentionPolicy.RUNTIME)&lt;/p></description></item><item><title>Java面试基础知识--重点</title><link>https://pangyd.com/post/170-java/</link><pubDate>Fri, 17 Nov 2017 21:31:24 +0800</pubDate><guid>https://pangyd.com/post/170-java/</guid><description>&lt;p>1.面向对象的三大特性&lt;/p>&lt;div class="content rich" data-reactid=".0.1.0.0.0.1.1.1">&lt;p>&lt;span>继承、封装、多态&lt;/span>&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>什么是继承?&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。&lt;/span>&lt;/p>&lt;p>&lt;span>②继承是具有传递性的，就像现实中孙子不仅长得像爸爸而且还像他爷爷。&lt;/span>&lt;/p>&lt;p>&lt;span>③继承来的属性和方法是隐式的，也就是在本类里面是看不见的。&lt;/span>&lt;/p>&lt;p>&lt;span>④一个类只能有一个父类，也就是类只能是单继承。&lt;/span>&lt;/p>&lt;p>&lt;span>⑤一个接口可以有多个父类，也就是接口可以是多继承。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>实际项目开发中，一个类继承于另一个类，那么前者就是后者的子类，反则反之。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>什么是封装?&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>对象数据和操作该对象的指令都是对象自身的一部分，能够实现尽可能对外部隐藏数据。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>实际项目开发中，使用封装最多的就是实体类，常常和 JavaBean (类必须是具体的和公共的，并且具有无参数的构造器)一起使用。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>那么，实体类有那些东西呢&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>答：私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>什么是多态?&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>①多态就是对象拥有多种形态：引用多态和方法多态。&lt;/span>&lt;/p>&lt;p>&lt;span>②引用多态：父类的引用可以指向本类对象、父类的引用可以指向子类的对象。&lt;/span>&lt;/p>&lt;p>&lt;span>③方法多态：创建本类对象时，调用的方法为本类的方法；创建子类对象时，调用的方法为子类重写的方法或者继承的方法。&lt;/span>&lt;/p>&lt;p>&lt;span>④存在多态的必要条件：继承、重写。&lt;/span>&lt;/p>&lt;p>&lt;span>⑤多态的作用是消除类型之间的耦合关系。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>在实际项目开发中，A 类继承 B 类，如果在 A 类中不重写 B 类的方法的时候，输出的仍旧是 B 类方法里面的信息(B b=new A());如果在A类中重写 B 类的方法的时候，输出的是 A 类方法里面的信息(B b=new A())。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;/p>&lt;section class="" data-tools="135编辑器" data-id="90150">&lt;section>&lt;section data-width="100%">&lt;p class="" data-brushtype="text">&lt;span>2.Java集合框架树&lt;/span>&lt;/p>&lt;/section>&lt;/section>&lt;/section>&lt;p>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>Collection 接口：&lt;/span>&lt;/span>&lt;span>它是 Java 集合框架的一个根接口，也是List、Set和 Queue 接口的父接口。同时它定义了可用于操作 List、Set 和 Queue 的方法—增删改查。&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p></description></item><item><title>Java后端程序员1年工作经验总结</title><link>https://pangyd.com/post/169-java1/</link><pubDate>Wed, 15 Nov 2017 19:26:07 +0800</pubDate><guid>https://pangyd.com/post/169-java1/</guid><description>&lt;p>&lt;span>&lt;span>1.引言&lt;/span>&amp;nbsp;&lt;/span>&lt;br>&lt;/p>&lt;p>　毕业已经一年有余，这一年里特别感谢技术管理人员的器重，以及同事的帮忙，学到了不少东西。这一年里走过一些弯路，也碰到一些难题，也受到过做为一名开发却经常为系统维护和发布当救火队员的苦恼。遂决定梳理一下自己所学的东西，为大家分享一下。&amp;nbsp;&lt;br>　　经过一年意识到以前也有很多认识误区，比如：&amp;nbsp;&lt;br>　　偏爱收集，经常收集各种资料视频塞满一个个硬盘，然后心满意足的看着容量不行动。&amp;nbsp;&lt;br>　　不重基础，总觉得很多基础东西不需要再看了，其实不懂的地方很多，计算机程序方面任何一个结果都必有原因，不要只会用不知道原理，那是加工厂出来的。现在ide查看代码那么方便，ctrl+点击就进入了JDK查看实现细节。&amp;nbsp;&lt;br>　　好高骛远，在计算机基础不牢固的情况下，总想着要做架构，弄分布式，搞大数据之类。&amp;nbsp;&lt;br>　　不重视性能，只求能实现功能，sql查询是不是可以优化，是否有算法妙用，大对象是否要清除。&amp;nbsp;&lt;br>　　不重视扩展性，模块之间紧密耦合，常用方法不提取成工具类，调用关系混乱等问题。&amp;nbsp;&lt;br>　　……&amp;nbsp;&lt;br>　　本文重点不在这些，故只列举了一小部分，下面进入正题。&lt;/p>&lt;p>&lt;span>2.语法基础&lt;/span>&lt;/p>&lt;p>　2.1 Java类初始化顺序&amp;nbsp;&lt;br>　　这是所有情况的类初始化顺序，如果实际类中没有定义则跳过：父类静态变量——父类静态代码块——子类静态代码块——父类非静态变量——父类非静态代码块——父类构造函数——子类非静态变量——子类非静态代码块——子类构造函数&amp;nbsp;&lt;br>　2.2 值传递和引用传递&amp;nbsp;&lt;br>　　可能很多人对此不屑一顾，心想老子都工作一年了，对这些还不熟悉吗？但实际情况并非这样，JDK中东西全部熟悉了吗？以一个最简单的例子开始，你觉得下图中代码执行完之后fatherList中的元素是什么？&amp;nbsp;&lt;br>&lt;/p>&lt;p>&lt;img class="" data-ratio="0.2854077253218884" data-src="https://pangyd.com/uploads/2017/11/74c10f869f038762.jpg" data-type="png" data-w="932" title="" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;br>&lt;/p>&lt;p>　　这是一个最基础的值传递和引用传递的例子，你觉得好简单，已经想跃跃欲试的挑战了，那么请看下面的，StringBuffer很好理解，但是当你执行一遍之后发现是不是和预想中的输出不一样呢？String不是引用类型吗，怎么会这样呢？如果你无法理解，那么请看下String的实现源码，了解下其在内存中分配的实现原理。&amp;nbsp;&lt;br>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>　2.3 集合的使用&amp;nbsp;&lt;br>　　这部分几乎每个人都会用到，而且大家还都不陌生。下图来源于互联网，供大家复习一下。但是利用集合的特性进行巧妙的组合运用能解决优化很多复杂问题。Set不可重复性，List的顺序性，Map的键值对，SortSet/SortMap的有序性，我在工作中有很多复杂的业务都巧妙的使用了这些，涉及到公司保密信息，我就不贴出代码了。工作越久越发现这些和越巧妙。&amp;nbsp;&lt;br>　&lt;/p>&lt;p>&lt;img class="" data-ratio="0.9415094339622642" data-src="https://pangyd.com/uploads/2017/11/74c10f869f038762.jpg" data-type="jpeg" data-w="530" title="" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;br>&lt;/p>&lt;p>　2.3 异常处理&amp;nbsp;&lt;br>　　1.看着try、catch、finally非常容易，如果和事务传播结合在一起，就会变得极其复杂。&amp;nbsp;&lt;br>　　2.finally不一定必须执行，return在catch/finally中处理情况（建议亲自操刀试一下）。&amp;nbsp;&lt;br>　　3.catch中可以继续抛自定义异常（并把异常一步步传递到控制层，利用切面抓取封装异常，返回给调用者）。&amp;nbsp;&lt;br>　2.4 面向对象思想&amp;nbsp;&lt;br>　　一提起面向对象，大家都知道抽象、封装、继承、和多态。但是实际工作经验中又知道多少呢，对于项目中如何巧用估计更不要提了。&amp;nbsp;&lt;br>　　共性的机会每个都需要用的建立基类，如每个控制层方法可能要通过security获取一个登录用户id，用于根据不同的用户操作不同的数据，可以抽象出一个应用层基类，实现获取id的protect方法。同理DAO层可以利用泛型提取出一个包含增删改查的基类。&amp;nbsp;&lt;br>　　多态的Override：基类的引用变量不仅可以指向基类的实例对象，也可以指向其子类的实例对象，如果指向子类的实例对象，其调用的方法应该是正在运行的那个对象的方法。在策略模式中使用很普遍。&amp;nbsp;&lt;br>　　提到面向对象，就不可避免的要说设计模式，在工作中，一个技术大牛写的一个类似策略模式（更复杂一点），十分巧妙的解决了各种业务同一个方法，并且实现了订单、工单、业务的解耦，看得我是非常佩服。我想很多面试中都会问道单例模式吧，还没有理解的建议去看一看。&lt;/p>&lt;p>&lt;span>3.多线程&lt;/span>&lt;/p>&lt;p>　3.1 线程安全&amp;nbsp;&lt;br>　　这个是老生常谈的问题了，但是确实是问题和bug高发区。线程同步问题不需要单独写了，想必大家都清楚，不太熟悉的建议百度一下。&amp;nbsp;&lt;br>　3.1.1 线程安全问题&amp;nbsp;&lt;br>　　1.代码中如果有同步操作，共享变量要特别注意（这个一般都能意识到）&amp;nbsp;&lt;br>　　2多个操作能修改数据表中同一条数据的。（这个容易被忽略，业务A可能操作表a，业务B也可以操作表a，业务A、B即使在不同的模块和方法中，也会引起线程安全问题。例如如果一个人访问业务A接口，另一个人访问业务B接口，在web中每个业务请求都是会有单独的一个线程进行处理的，就会出现线程安全问题）。&amp;nbsp;&lt;br>　　3.不安全的类型使用，例如StringBuffer、StringBuild，HashTable、HashMap等。在工作中我就遇到过有人在for循环进行list的remove，虽然编译器不报错，程序可以运行，但是结果却可想而知。&amp;nbsp;&lt;br>　　4.Spring的bean默认是单例的，如果有类变量就要特别小心了（一般情况下是没人在控制层、业务层、DAO层等用类变量的，用的话建议是final类型，例如日志log，gson等）。&amp;nbsp;&lt;br>　　5.多个系统共享数据库情况，这个其实和分布式系统类似&amp;nbsp;&lt;br>　　用户重复提交问题（即使代码中从数据库读取是否存在进行限制不能解决问题）&amp;nbsp;&lt;br>　3.1.2 线程安全解决&amp;nbsp;&lt;br>　　在需要同步的地方采用安全的类型。&amp;nbsp;&lt;br>　　JDK锁机制，lock、tryLock，synchronized，wait、notify、notifyAll等&amp;nbsp;&lt;br>　　Concurrent并发工具包，在处理一些问题上，谁用谁知道。强烈建议查看源码！&amp;nbsp;&lt;br>　　数据表加锁。（除非某个表的访问频率极低，否则不建议使用）&amp;nbsp;&lt;br>　　涉及分布式的，采用中间件技术例如zookeeper等解决。&amp;nbsp;&lt;br>　3.2 异步&amp;nbsp;&lt;br>　　异步使用场景不影响主线程，且响应较慢的业务。例如IO操作，第三方服务（短信验证码、app推送、云存储上传等）。&amp;nbsp;&lt;br>　　如果异步任务很多，就需要使用任务队列了，任务队列可以在代码级别实现，也可以利用redis（优势太明显了）。&amp;nbsp;&lt;br>　3.3 多线程通信&amp;nbsp;&lt;br>　　这方面文章非常多，这里不在详述。&amp;nbsp;&lt;br>　　1.共享变量方式（共享文件、全局变量，信号量机制等）&amp;nbsp;&lt;br>　　2.消息队列方式&amp;nbsp;&lt;br>　　3. 忙等，锁机制&amp;nbsp;&lt;br>　3.4多线程实现&amp;nbsp;&lt;br>　　1.集成Thread类，重写（这里的重写指的是override）run方法，调用start方法执行。&amp;nbsp;&lt;br>　　2.实现Runable接口，实现run方法，以Runable实例创建thread对象。&amp;nbsp;&lt;br>　　3.实现Callable接口，实现call方法，FutureTask包装callable接口，FutureTask对象创建thread对象，常用语异步操作，建议使用匿名内部类，方便阅读和使用。&amp;nbsp;&lt;br>　　额外需要说明的是：&amp;nbsp;&lt;br>　　1.理解thread的join方法；&amp;nbsp;&lt;br>　　2.不要认为volitate是线程安全的（不明白原因的建议去看jvm运行时刻内存分配策略）；&amp;nbsp;&lt;br>　　3.sleep时间片结束后并不保证立马获取cpu。&amp;nbsp;&lt;br>　　4.ThreadLocal能够为每一个线程维护变量副本，常用于在多线程中用空间换时间。&amp;nbsp;&lt;br>&lt;/p></description></item><item><title>Java入门学习进阶知识点汇总</title><link>https://pangyd.com/post/152-java/</link><pubDate>Wed, 01 Nov 2017 20:04:15 +0800</pubDate><guid>https://pangyd.com/post/152-java/</guid><description>&lt;p style="text-align: left">&lt;span style="text-align: justify">入门阶段，主要是培养Java语言的编程思想。了解Java语言的语法，书写规范等，掌握Eclipse、MyEclipse等开发工具，编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本的增删改查管理。&lt;/span>&lt;/p>&lt;p style="text-align: left">&lt;strong style="text-align: justify">&lt;span>注意：&lt;/span>&lt;/strong>&lt;span style="text-align: justify">此阶段知识点的学习，需要真实的项目进行驱动学习，让你轻松理解各知识点。&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;span>&lt;/span>&amp;nbsp;&lt;img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-size="638|404">&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;strong>1 计算机基础知识&lt;/strong>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&amp;nbsp;&lt;span>针对零基础学习的人，从对计算机操作等知识的了解，延伸到Java语言的发展与开发工具的使用上。主要是了解怎样执行计算机命令，认识Java这门语言，感受编程语言Java怎么开发程序。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(1)&amp;nbsp;计算机基础&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>零基础学习的人先了解计算机相关知识，进而再去了解Java语言。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(2)&amp;nbsp;DOS常用命令&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解什么是DOS，并掌握DOS控制台的打开方式，同时熟悉常用的DOS命令，例如：盘符切换、进入指定目录、删除文件等，完成使用DOS命令对计算机进行操作和控制。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(3)&amp;nbsp;Java概述&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解Java语言的发展史、Java语言平台版本、Java语言的特点，以及JRE与JDK。JRE是Java的运行环境，JDK是Java开发工具包，它包含了Java的开发工具以及JRE。所以安装了JDK就不用再单独安装JRE了。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(4)&amp;nbsp;JDK环境安装配置&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解了什么是JDK，以及JDK的重要性，下一步我们就来学习如何安装和配置JDK环境。在安装JDK之前，我们首先需要下载JDK，针对不同的系统，我们需要下载不用版本的JDK。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(5)&amp;nbsp;环境变量配置&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解path、classpath环境变量，理解path变量和classpath变量的作用，并掌握path变量和classpath变量的配置方式。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>(6)&amp;nbsp;Java程序入门&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>当JDK、环境变量配置完毕，我们就可以开始&amp;nbsp;编写Java程序。编写Java程序可以使用如下几种工具：notepad（微软操作系统自带）、Editplus、Notepad++、Eclipse、MyEclipse。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;/span>&amp;nbsp;&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;strong>&amp;nbsp;&lt;span>2 编程基础&lt;/span>&lt;/strong>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&amp;nbsp;&lt;span>此模块学习主要是了解编程的具体流程，学习Java基础语法的格式等。具体要掌握不同数据类型的变量定义与使用，掌握不同运算符的运算规则，掌握流程控制语句的执行流程，编写方法的声明与调用，创建数组并访问数组元素等知识。&lt;/span>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>&amp;nbsp;&lt;span>(1)&amp;nbsp;注释&lt;/span>&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>在程序开发工程中，用于解释和说明程序的文字我们称之为注释，Java中的注释分为以下几种：单行注释、多行注释、文档注释。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>&amp;nbsp;&lt;span>(2)&amp;nbsp;关键字&lt;/span>&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解Java关键字的含义及特点，掌握关键字使用的注意事项。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>( &lt;span>3)&amp;nbsp;标识符&lt;/span>&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>了解什么是标识符，标识符的组成规则，以及标识符使用时的注意事项。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>( &lt;span>4)&amp;nbsp;常量与变量&lt;/span>&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>理解常量与变量的含义，并掌握常量与变量的区别、变量的定义格式以及变量的赋值。&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;strong>&lt;span>( &lt;span>5)&amp;nbsp;数据类型&lt;/span>&lt;/span>&lt;/strong>&lt;/p>&lt;p style="text-align: justify">&lt;span>掌握Java语言的数据类型，如基本数据类型：byte、short、int、long、float、double、char、boolean，以及引用类型：类、接口、数组。&lt;/span>&lt;/p></description></item><item><title>分享优秀Java程序员应有的编程风格</title><link>https://pangyd.com/post/142-java/</link><pubDate>Sun, 22 Oct 2017 21:36:06 +0800</pubDate><guid>https://pangyd.com/post/142-java/</guid><description>&lt;p>今天突发奇想，对编码习惯和编程风格很感兴趣，于是乎，找了一下关于编程风格（Java篇）的资料，希望对爱好编码或者开始学习编码的同学有帮助！&lt;/p>&lt;p>来自《The Elements of Java Style》-《Java编程风格》一书，值得一读的书籍，会让你在细节上节省很多时间，合作之间更加愉快！&lt;/p>&lt;p>好处不多说了，但是有几个原则如下：&lt;/p>&lt;p>1.保持原有风格&lt;/p>&lt;p>2.坚持最小惊奇原则&lt;/p>&lt;p>3.第一次就做对&lt;/p>&lt;p>4.记录所有非规范行为&lt;/p>&lt;p>格式规范：&lt;/p>&lt;p>1.缩进嵌套的代码：在每个代码块和嵌套中加入缩进，缩进代码，加强可读性。这些地方包括【类定义，内部类定义，方法定义，静态块，for循环语句，if-else语句，try、catch和finally块，匿名内部类，while语句，do-while语句】&lt;/p>&lt;p>2.断开很长的句子：第一，如果包含了逗号，那么在每一个逗号后面都另起一行，把逗号后面的每一个表达式都和逗号前面的表达式的第一个字母对齐。第二，应该在优先级最低的运算符之前断行。&lt;/p>&lt;p>3.使用空白：关键字和左括号之间，右括号和紧随其后的关键字，除了”.”之外的运算符与其前后的表达式之间用空格隔开。每个逻辑上独立的方法和代码段之间，定义类或者接口的成员之间，每个类和接口之间应该加入空白行。&lt;/p>&lt;p>4.不要直接使用Tab控制符：不同环境对Tab控制符的解释也是不同的。&lt;/p>&lt;p>命名约定：&lt;/p>&lt;p>1.名称应该具有实际意义&lt;/p>&lt;p>2.使用人们熟悉的名称&lt;/p>&lt;p>3.谨慎使用过长的名字，可以使用简明通用的缩写&lt;/p>&lt;p>4.尽量保留元音字母&lt;/p>&lt;p>5.缩写词的第一个字母大写&lt;/p>&lt;p>6.不要使用大小写来区分的名字&lt;/p>&lt;p>包命名：&lt;/p>&lt;p>1.用你所在组织的域名的倒序小写形式作为包的根限定词&lt;/p>&lt;p>2.使用单独的小写词作为每个包的根名&lt;/p>&lt;p>3.仅当新旧版本二进制兼容的时候，其包可以使用相同的名字，否则，请使用新名字&lt;/p>&lt;p>类型命名：&lt;/p>&lt;p>1.类和接口名中的每个单词的第一个字母大写&lt;/p>&lt;p>类命名：&lt;/p>&lt;p>1.用名词命名类&lt;/p>&lt;p>2.具有成组相关属性，静态服务或者常量的类名字使用复数形式&lt;/p>&lt;p>接口命名：&lt;/p>&lt;p>1.用名词或者形容词命名接口&lt;/p>&lt;p>方法命名：&lt;/p>&lt;p>1.方法名中的第一个单词小写，其后每个单词的第一个字母大写&lt;/p>&lt;p>2.用动词命名方法&lt;/p>&lt;p>3.遵循JavaBean中命名属性访问函数方法：set，get，is&lt;/p>&lt;p>变量命名：&lt;/p>&lt;p>1.变量命中的第一个单词小写，其后的每个单词的第一个字母大写&lt;/p>&lt;p>2.用名词命名变量&lt;/p>&lt;p>3.集合引用名要用复数形式&lt;/p>&lt;p>4.为不重要的临时变量简历并使用一套标准名字&lt;/p>&lt;p>字段命名：&lt;/p>&lt;p>1.使用this字段变量可以区分开局部变量&lt;/p>&lt;p>参数命名：&lt;/p>&lt;p>1.构造函数或者”set”方法给字段分配参数赋值，参数名应该和字段名相同&lt;/p>&lt;p>常量命名：&lt;/p>&lt;p>1.常量的每个单词均大写，单词之间使用下划线连接&lt;/p>&lt;p>文档约定：&lt;/p>&lt;p>1.为使用和维护你的代码的人编写文档&lt;/p>&lt;p>2.注释和代码要同步&lt;/p>&lt;p>3.使用积极的语气，省略无用的词语&lt;/p>&lt;p>注释类型：&lt;/p>&lt;p>1.用文档注释来描述编程接口&lt;/p>&lt;p>2.用标准注释格式隐藏代码而不必删除它们&lt;/p>&lt;p>3.用单行注释解释实现细节&lt;/p>&lt;p>文档注释：&lt;/p>&lt;p>1.在编写代码前描述编程接口&lt;/p>&lt;p>2.为公用，受保护，包，私有成员建立文档&lt;/p>&lt;p>3.为每个包编写总结和概述&lt;/p>&lt;p>4.为包的每个应用程序或组编写概述&lt;/p>&lt;p>注释风格：&lt;/p>&lt;p>1.对所有文档注释使用统一的格式和组织结构&lt;/p>&lt;p>2.关键字，标识符和常量应放到…标签中&lt;/p>&lt;p>3.将代码放入&lt;/p>&lt;p>…标签中&lt;/p>&lt;p>4.在标识符第一次出现的时候用{@link}标签&lt;/p>&lt;p>5.为Javadoc标签简历并使用一套固定的顺序&lt;/p>&lt;p>6.使用第三人称叙述的形式&lt;/p></description></item><item><title>Java总结篇系列：Java泛型</title><link>https://pangyd.com/post/128-java-java/</link><pubDate>Sun, 08 Oct 2017 20:14:45 +0800</pubDate><guid>https://pangyd.com/post/128-java-java/</guid><description>&lt;p>首先，我们看下下面这段简短的代码:&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>public class GenericTest { &amp;nbsp; &amp;nbsp;public static void main(String[] args) {&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List list = new ArrayList();&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list.add("qqyumidi");&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list.add("corn");&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list.add(100); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; list.size(); i++) {&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String name = (String) list.get(i); // 1&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.out.println("name:" + name);&lt;/p>&lt;p>&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p></description></item><item><title>Java面试常被问到的题目+解答</title><link>https://pangyd.com/post/125-java/</link><pubDate>Thu, 05 Oct 2017 21:24:02 +0800</pubDate><guid>https://pangyd.com/post/125-java/</guid><description>&lt;p class="">&lt;span>摘要：&lt;/span>&amp;nbsp;第一，anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)? 不行,对于匿名内部类,看到的一句话说的很到位: new &amp;lt;类或接口&amp;gt; &amp;lt;类的主体&amp;gt; 这种形式的new语句声明一个新的匿名类，他对一个给定的类进行扩展，或实现一个给定的接口。&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第一，anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>不行,对于匿名内部类,看到的一句话说的很到位:&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>new &amp;lt;类或接口&amp;gt; &amp;lt;类的主体&amp;gt;&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>这种形式的new语句声明一个新的匿名类，他对一个给定的类进行扩展，或实现一个给定的接口。他还创建那个类的一个新实例，并把他作为语句的结果而返回。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>这就是匿名类的实质,它本身就是一个类的继承或一个接口的实现,所以继承其它类或借口是无意义的.在eclipse中冶证实了我的想法.无论是继承其它类还是实现其它借口都显示Syntax error on token。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第二，staticnestedclass和innerclass的不同，说得越多越好(面试题有的很笼统)。&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>static nested class 指静态嵌套类,或称嵌套类,是C++中常用的说法,inner class指内部类,是JAVA中的说法。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>内部类是一个类内部类的统称,具体分为四种：成员类,静态成员类，局部类，匿名类。其中匿名类是局部类的特殊情况。对于成员类和静态成员类都存在于类的顶层代码中。相当于类的静态方法和非静态方法的关系。区别在于成员类依赖于类实例而静态成员类不依赖。所以前者只能访问实例方法和成员而后者只能访问静态方法和成员。它们都用于创建一个只和当前类有关。和其它类无关的依赖类.是否静态取决于是否依赖类的实例。局部类相当于局部变量。存在于类的局部代码中。相当于在main()中随意定义和使用类。唯一的不同是它只能使用final型的局部变量。这和垃圾回收机制有关。即局部变量会在代码块结束后被回收。而对象不一定。所以对象只能使用final的局部变量。同样，局部类存在的局部代码块也可以有静态和非静态的差别。局部类罪常见的应用就是匿名类。匿名类就是无名子的局部类。常在SWING设计中的添加监听中出现。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>static nested class相当于inner class中的静态成员类。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第三，&amp;amp;和&amp;amp;&amp;amp;的区别。&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>这个问得很少。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&amp;amp;和^,&amp;lt;&amp;lt;,&amp;lt;&amp;lt;&amp;lt;,|同属于位运算符,其中&amp;amp;是按位与,例如,1&amp;amp;1=1，1&amp;amp;0=0，&amp;amp;&amp;amp;是逻辑运算符,处理真假值，例如,true&amp;amp;&amp;amp;true=true。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>如果你想学习Java可以来这个群，首先是二二零，中间是142，最后是906，里面可以学习和交流，也有资料可以下载。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第四，hashmap和hashtable的区别。&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>常问。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>hashmap可以看做是hashtable的替代者，HashMap的Value和Key都可为NULL，而HashTable不可以，同时，HashTable是线程同步的，而HashMap不是.HashTable用Iterator遍历，HashMap用Enumeration遍历。HashTable中hash数组默认大小是11，增加的方式是 old*2+1。HashMap中hash数组的默认大小是16，而且一定是2的指数。计算index的方法不同，HashTable直接利用hashcode()得出，HashMap对hashcode重新计算得出。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第五，collection和collections的区别。&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>你千万别说一个是单数一个是复数。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>collection是结合类的上级接口，子接口有List和Set等，Collections是java.util下的一个工具类，提供一些列静态方法对集合搜索排序线程同步化等。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第六，什么时候用assert。&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>api级的技术人员有可能会问这个。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>在调试和优化中使用，用于判断逻辑表达式真假,若为假，终止程序并返回异常.assert比if的优点在于可以选择是否开启assert检查，也就是说assert产生的测试代码可以在正式发布时候选择忽略，这带来极大便利，默认assert检查是关闭的。此外，Junit相比assert来说，有着相似但更强大的测试能力。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第七，gc是什么?为什么要有gc?&lt;/span>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>基础。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>GC 即 garbage collection(垃圾收集)，是JAVA用于回收内存的一种方式，主要的实现方法有引用计数，标记回收，复制清除等，GC可以避免内存泄露和堆栈溢出，有效提高内存的利用效率，同时将程序员从繁琐的内存管理中释放出来。&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;br>&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;span>&lt;span>&lt;span>第八，string s=new string("xyz");创建了几个stringobject?&lt;/span>&lt;/span>&lt;/span>&lt;/p></description></item><item><title>开发人员需要掌握的英文词汇，必须要学会的</title><link>https://pangyd.com/post/116/</link><pubDate>Wed, 27 Sep 2017 11:59:42 +0800</pubDate><guid>https://pangyd.com/post/116/</guid><description>&lt;p>当年学习Java时想过，英语不好或者一窍不通，能不能学好Java开发；就这个问题请教了开发前辈，答案是不懂英文也可以学好Java，但必须要学会一些常用英文词汇，必竟Java是英文开发创造的，以下整理了开发中常用的词汇及中文含义；当然知道这些远远不够，我们可以在学习工作过程中慢慢积累，渐渐会发现原来学会了这么多英文，好了，开始学习吧&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>我以英文首字母进行排序：&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>1、Abstract class 抽象类:抽象类是不允许实例化的类，因此一般它需要被进行扩展继承。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>2、Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>3、Anonymous class 匿名类:当你需要创建和使用一个类，而又不需要给出它的名字或者再次使用的使用，就可以利用匿&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>名类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>4、Anonymous inner classes 匿名内部类:匿名内部类是没有类名的局部内部类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>5、API 应用程序接口:提供特定功能的一组相关的类和方法的集合。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>6、Array 数组:存储一个或者多个相同数据类型的数据结构，使用下标来访问。在Java中作为对象处理。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>7、Base class 基类:即被扩展继承的类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>8、Call stack 调用堆栈:调用堆栈是一个方法列表，按调用顺序保存所有在运行期被调用的方法。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>9、Casting 类型转换 :即一个类型到另一个类型的转换，可以是基本数据类型的转换，也可以是对象类型的转换。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>10、Char 字符:容纳单字符的一种基本数据类型。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>11、Child class 子类:见继承类Derived class&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>12、Class 类:面向对象中的最基本、最重要的定义类型。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>13、Class members 类成员:定义在类一级的变量，包括实例变量和静态变量。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>14、Class methods 类方法:类方法通常是指的静态方法，即不需要实例化类就可以直接访问使用的方法。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>15、Class variable 类变量:见静态变量Static variable&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>16、Collection 容器类:容器类可以看作是一种可以储存其他对象的对象，常见的容器类有Hashtables和Vectors。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>17、Collection interface 容器类接口:容器类接口定义了一个对所有容器类的公共接口。&lt;/p></description></item><item><title>Java集合类</title><link>https://pangyd.com/post/96-java/</link><pubDate>Fri, 08 Sep 2017 21:07:49 +0800</pubDate><guid>https://pangyd.com/post/96-java/</guid><description>&lt;p>看了一些所谓大&lt;a target="_self" href="https://pangyd.com/contribute/">公司&lt;/a>的JAVA面试问题，发现对于JAVA集合类的使用都比较看重似的，而自己在这方面还真的是所真甚少，抽空也学习学习吧。&lt;/p>&lt;p>&lt;/p>&lt;p>java.util包中包含了一系列重要的集合类，而对于集合类，主要需要掌握的就是它的内部结构，以及遍历集合的迭代模式。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>接口：Collection&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类，Java SDK提供的类都是继承自Collection的“子接口”如List和Set。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>所有实现Collection接口的类都必须提供两个标准的构造函数：无参数的构造函数用于创建一个空的Collection，有一个Collection参数的构造函数用于创建一个新的Collection，这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>主要的一个接口方法：boolean add(Ojbect c)&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>虽然返回的是boolean，但不是表示添加成功与否，这个返回值表示的意义是add()执行后，集合的内容是否改变了（就是元素的数量、位置等有无变化）。类似的addAll，remove，removeAll，remainAll也是一样的。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>用Iterator模式实现遍历集合&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Collection有一个重要的方法：iterator()，返回一个Iterator（迭代器），用于遍历集合的所有元素。Iterator模式可以把访问逻辑从不同的集合类中抽象出来，从而避免向客户端暴露集合的内部结构。典型的用法如下：&lt;/p>&lt;blockquote>&lt;p>Iterator it = collection.iterator(); // 获得一个迭代器&lt;/p>&lt;p>while(it.hasNext()) {&lt;/p>&lt;p>Object obj = it.next(); // 得到下一个元素&lt;/p>&lt;p>}&lt;/p>&lt;/blockquote>&lt;p>不需要维护遍历集合的“指针”，所有的内部状态都由Iterator来维护，而这个Iterator由集合类通过工厂方法生成。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>每一种集合类返回的Iterator具体类型可能不同，但它们都实现了Iterator接口，因此，我们不需要关心到底是哪种Iterator，它只需要获得这个Iterator接口即可，这就是接口的好处，面向对象的威力。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>要确保遍历过程顺利完成，必须保证遍历过程中不更改集合的内容（Iterator的remove()方法除外），所以，确保遍历可靠的原则是：只在一个线程中使用这个集合，或者在多线程中对遍历代码进行同步。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>由Collection接口派生的两个接口是List和Set。 　&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>List接口&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>List是有序的Collection，使用此接口能够精确的控制每个元素插入的&lt;a target="_self" href="https://pangyd.com/contribute/">位置&lt;/a>。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。和下面要提到的Set不同，List允许有相同的元素。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素，还能向前或向后遍历。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>LinkedList类&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List：List list = Collections.synchronizedList(new LinkedList(...));&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>ArrayList类&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。&lt;/p>&lt;p>每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>和LinkedList一样，ArrayList也是非同步的（unsynchronized）。&lt;/p>&lt;p>&lt;br>&lt;/p></description></item><item><title>优秀Java程序员的编程风格</title><link>https://pangyd.com/post/81-java/</link><pubDate>Mon, 28 Aug 2017 20:27:03 +0800</pubDate><guid>https://pangyd.com/post/81-java/</guid><description>&lt;p>格式规范：&lt;/p>&lt;p>1.缩进嵌套的代码：在每个代码块和嵌套中加入缩进，缩进代码，加强可读性。这些地方包括【类定义，内部类定义，方法定义，静态块，for循环语句，if-else语句，try、catch和finally块，匿名内部类，while语句，do-while语句】&lt;/p>&lt;p>2.断开很长的句子：第一，如果包含了逗号，那么在每一个逗号后面都另起一行，把逗号后面的每一个表达式都和逗号前面的表达式的第一个字母对齐。第二，应该在优先级最低的运算符之前断行。&lt;/p>&lt;p>3.使用空白：关键字和左括号之间，右括号和紧随其后的关键字，除了”.”之外的运算符与其前后的表达式之间用空格隔开。每个逻辑上独立的方法和代码段之间，定义类或者接口的成员之间，每个类和接口之间应该加入空白行。&lt;/p>&lt;p>4.不要直接使用Tab控制符：不同环境对Tab控制符的解释也是不同的。&lt;/p>&lt;p>命名约定：&lt;/p>&lt;p>1.名称应该具有实际意义&lt;/p>&lt;p>2.使用人们熟悉的名称&lt;/p>&lt;p>3.谨慎使用过长的名字，可以使用简明通用的缩写&lt;/p>&lt;p>4.尽量保留元音字母&lt;/p>&lt;p>5.缩写词的第一个字母大写&lt;/p>&lt;p>6.不要使用大小写来区分的名字&lt;/p>&lt;p>包命名：&lt;/p>&lt;p>1.用你所在组织的域名的倒序小写形式作为包的根限定词&lt;/p>&lt;p>2.使用单独的小写词作为每个包的根名&lt;/p>&lt;p>3.仅当新旧版本二进制兼容的时候，其包可以使用相同的名字，否则，请使用新名字&lt;/p>&lt;p>类型命名：&lt;/p>&lt;p>1.类和接口名中的每个单词的第一个字母大写&lt;/p>&lt;p>类命名：&lt;/p>&lt;p>1.用名词命名类&lt;/p>&lt;p>2.具有成组相关属性，静态服务或者常量的类名字使用复数形式&lt;/p>&lt;p>接口命名：&lt;/p>&lt;p>1.用名词或者形容词命名接口&lt;/p>&lt;p>方法命名：&lt;/p>&lt;p>1.方法名中的第一个单词小写，其后每个单词的第一个字母大写&lt;/p>&lt;p>2.用动词命名方法&lt;/p>&lt;p>3.遵循JavaBean中命名属性访问函数方法：set，get，is&lt;/p>&lt;p>变量命名：&lt;/p>&lt;p>1.变量命中的第一个单词小写，其后的每个单词的第一个字母大写&lt;/p>&lt;p>2.用名词命名变量&lt;/p>&lt;p>3.集合引用名要用复数形式&lt;/p>&lt;p>4.为不重要的临时变量简历并使用一套标准名字&lt;/p>&lt;p>字段命名：&lt;/p>&lt;p>1.使用this字段变量可以区分开局部变量&lt;/p>&lt;p>参数命名：&lt;/p>&lt;p>1.构造函数或者”set”方法给字段分配参数赋值，参数名应该和字段名相同&lt;/p>&lt;p>常量命名：&lt;/p>&lt;p>1.常量的每个单词均大写，单词之间使用下划线连接&lt;/p>&lt;p>文档约定：&lt;/p>&lt;p>1.为使用和维护你的代码的人编写文档&lt;/p>&lt;p>2.注释和代码要同步&lt;/p>&lt;p>3.使用积极的语气，省略无用的词语&lt;/p>&lt;p>注释类型：&lt;/p>&lt;p>1.用文档注释来描述编程接口&lt;/p>&lt;p>2.用标准注释格式隐藏代码而不必删除它们&lt;/p>&lt;p>3.用单行注释解释实现细节&lt;/p>&lt;p>文档注释：&lt;/p>&lt;p>1.在编写代码前描述编程接口&lt;/p>&lt;p>2.为公用，受保护，包，私有成员建立文档&lt;/p>&lt;p>3.为每个包编写总结和概述&lt;/p>&lt;p>4.为包的每个应用程序或组编写概述&lt;/p>&lt;p>注释风格：&lt;/p>&lt;p>1.对所有文档注释使用统一的格式和组织结构&lt;/p>&lt;p>2.关键字，标识符和常量应放到&amp;lt;code&amp;gt;…&amp;lt;/code&amp;gt;标签中&lt;/p>&lt;p>3.将代码放入&amp;lt;pre&amp;gt;…&amp;lt;/pre&amp;gt;标签中&lt;/p>&lt;p>4.在标识符第一次出现的时候用{@link}标签&lt;/p>&lt;p>5.为Javadoc标签简历并使用一套固定的顺序&lt;/p>&lt;p>6.使用第三人称叙述的形式&lt;/p>&lt;p>7.编写独立的概述&lt;/p>&lt;p>8.省略概述中动作和服务的主语&lt;/p>&lt;p>9.省略事物概述中的对象和动词&lt;/p>&lt;p>10.使用this而不是the来指代当前类中的实例&lt;/p>&lt;p>11.方法名或者构造函数名不需圆括号，除非你想突出一个特殊的签名&lt;/p>&lt;p>注释内容：&lt;/p>&lt;p>1.每个类、接口、字段和方法都编写概述&lt;/p>&lt;p>2.完整描述每个方法的签名&lt;/p>&lt;p>3.包含示例&lt;/p>&lt;p>4.为前置、后置、不变条件编写文档&lt;/p>&lt;p>5.为已知的缺陷和不足编写文档&lt;/p>&lt;p>6.为同步语法编写文档&lt;/p></description></item></channel></rss>