
java
泛泛之素
君子不器
展开
-
《疯狂java讲义》学习(51):Lambda表达式
Lambda表达式Lambda这个名字来源于学术界的λ演算,具体我们就不探讨了。理解Lambda表达式,我们需要先回顾一下接口、匿名内部类和代码传递。通过接口传递代码我们之前介绍过接口以及面向接口的编程,针对接口而非具体类型进行编程,可以降低程序的耦合性,提高灵活性,提高复用性。接口常被用于传递代码,比如,我们知道File有如下方法:public File[] listFiles(File...原创 2019-02-21 11:40:41 · 526 阅读 · 0 评论 -
《疯狂java讲义》学习(46):线程池
1.线程池系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情形下,使用线程池可以很好地提高短暂的线程时,更应该考虑使用线程池。与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或Callable对象传给线程池,线程池就会启动一个线程来执行他们的run()或call()方法,当run()或call()方法执行结束后,该线程并不会死亡...原创 2019-02-16 12:49:20 · 425 阅读 · 0 评论 -
《疯狂java讲义》学习(39):常见文件类型&随机文件读写
常见文件类型处理本节简要介绍如何利用Java API和一些第三方类库,来处理如下5中类型的文件:属性文件:属性文件是常见的配置文件,用于在不改变代码的情况下改变程序的行为。CSV:CSV是Comma Separated Values 的缩写,表示逗号分隔值,是一种非常常见的文件类型。大部分日志文件都是CSV,CSV也经常用于交换表格类型的数据,待会我们会看到,CSV看上去很简单,但处理的复...原创 2019-02-09 08:43:32 · 697 阅读 · 0 评论 -
《疯狂java讲义》学习(45):线程通信&线程组
1.线程通信当线程在系统内运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,但我们可以通过一些机制来保证线程协调运行。1.1 传统的线程通信假设现在系统中有两个线程,这两个线程分别代表存款者和取钱者——现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存款、取钱的动作,而且要求每当存款者将钱存入指定账户后,取钱者就立即取出该笔钱。不允许存款者连续两次存钱,也...原创 2019-02-15 21:20:02 · 408 阅读 · 0 评论 -
《疯狂java讲义》学习(29):List集合
List集合List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1……List接口和ListIterator接口List作为Collection接口的子接口,当然可以使用Collection接口里的...原创 2019-01-30 10:24:28 · 719 阅读 · 0 评论 -
《疯狂java讲义》学习(38):文件和目录操作
文件和目录操作文件和目录操作最终是与操作系统和文件系统相关的,不同系统的实现是不一样的,但Java中的java.io.File类提供了同一的接口,底层会通过本地方法调用操作系统和文件系统的具体实现,这里我们介绍File类。File类中的操作大概可以分为三类:文件元数据、文件操作、目录操作,在介绍这些操作之前,我们先看下File的构造方法。构造方法File既可以表示文件,也可以表示目录,它的主...原创 2019-02-08 09:33:58 · 545 阅读 · 0 评论 -
《疯狂java讲义》学习(37):文件文本和字符流
文本文件和字符流字节流没有编码的概念,不能按行处理,使用不太方便,更适合的是使用字符流。文本文件的基本概念、与二进制文件的区别、编码,以及字符流和字节流的区别,然后介绍Java中的主要字符流,它们有:Reader/Writer:字符流的基类,它们是抽象类;InputStreamReader/OutputStreamWriter:适配器类,将字节流转换为字符流;FileReader/Fi...原创 2019-02-07 07:51:41 · 394 阅读 · 0 评论 -
《疯狂java讲义》学习(36):文件处理基础
文件基础技术我们再日常计算机操作中,接触和处理最多的,除了上网,大概就是各种各样的文件了,从本章开始,我们就来探讨文件处理。文件概述在本节,我们主要介绍文件有关的一些基本概念和常识,Java中处理文件的基本思路和类结构,以及接下来的章节安排。基本概念和常识下面,我们先介绍一些基本概念和常识,包括二进制思维、文件类型、文本文件的编码、文件系统和文件读写等。1.二进制思维为了透彻理解文件...原创 2019-02-06 12:39:42 · 690 阅读 · 0 评论 -
《疯狂java讲义》学习(28):Set集合
Set集合Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add方法返回false,且新元素不会被加入。Set判断两个对象相同使用equals方法。也就是说,只要两个对象使用equals方...原创 2019-01-29 11:23:45 · 745 阅读 · 0 评论 -
《疯狂java讲义》学习(35):异常处理
异常处理Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字,其中try关键字后紧跟一个花括号括起来的代码块,简称try块,它里面放置可能引发异常的代码。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。多个catch块后还可以跟一个finally块,finally块用于回收再try块里打开的屋里资源,异常机制会保...原创 2019-02-05 10:36:41 · 696 阅读 · 0 评论 -
《疯狂java讲义》学习(34):通配符
解析通配符通配符有着令人费解和混淆的语法,但通配符大量应用于Java容器类中。更简洁的参数类型限定之前的例子为了将Integer对象添加到Number容器中,我们的类型参数使用了其他类型参数作为上界,我们提到,这种写法有点烦琐,它可以替换为更为简洁的通配符形式:public void addAll(DynamicArray<? extends E> c) { for(i...原创 2019-02-04 07:55:53 · 561 阅读 · 0 评论 -
《疯狂java讲义》学习(22):系统相关操作
系统相关Java程序在不同操作系统上运行时,可能需要取得平台相关属性,或者调用平台命令来完成特定功能。Java提供了System类和Runtime类来与程序的运行平台进行交互。System类System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类Field和类方法,允许直接通过System类来调用这些Field和方法。System类提供了代...原创 2019-01-23 10:37:54 · 818 阅读 · 0 评论 -
《疯狂java讲义》学习(33):泛型
基本概念和原理“泛型”的字面意思实施广泛的类型。类、接口和方法代码可以应用于非常广泛的类型,代码与他们能够操作的数据类型不再绑定在一起,同一套代码可以用于多种数据类型,这样,不仅可以复用代码,降低耦合,而且可以提高代码的可读性和安全性。一个简单泛型类举个例子简单说明泛型的基本概念、基本原理和泛型的优点。1.基本概念例子代码如下:public class Pair<T> {...原创 2019-02-03 14:21:19 · 505 阅读 · 0 评论 -
《疯狂java讲义》学习(40):内存映射文件
内存映射文件内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持。这里我们介绍内存映射文件的基本用法基本概念所谓内存映射文件,就是讲文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字节数组的操作,而字节数组的操作直接映射到文件上。这种映射可以是映射文件全部区域,也可以是映射一部分区域。不过,这种映射是操作系统提供的一种假象,文件一般不会...原创 2019-02-10 11:54:11 · 462 阅读 · 0 评论 -
《疯狂java讲义》学习(52):函数式处理:基本用法
函数式数据处理:基本用法上一节介绍了Lambda表达式和函数式接口,本节探讨它们的应用:函数式数据处理,针对常见的集合数据处理,Java 8引入了一套新的类库,位于包java.util.stream下,称为Stream API。这套API操作数据的思路不同于我们之前介绍的容器类API,它们是函数式的,非常简洁、灵活、易读。具体有什么不同呢?本节先介绍一些基本的API,下节讨论一些高级功能。接口...原创 2019-02-22 11:01:56 · 360 阅读 · 0 评论 -
《疯狂java讲义》学习(50):使用代理服务器
1.使用代理服务器从Java 5开始,Java在java.net包下提供了Proxy和ProxySelector两个类,其中Proxy代表一个代理服务器,可以在打开URLConnection连接时指定Proxy,创建Socket连接时也可以指定Proxy;而ProxySelector代表一个代理选择器,它提供了对代理服务器更加灵活的控制,它可以对HTTP、HTTPS、FTP、SOCKS等进行分别...原创 2019-02-20 09:58:53 · 614 阅读 · 0 评论 -
《疯狂java讲义》学习(44):线程同步
1线程同步多线程编程是有趣的事情,它很容易突然出现“错误情况”,这是有系统的线程调度具有一定的随机性造成的,不过即使程序偶然出现问题,那也是由于编程不当引起的。当使用多个线程来访问同一个数据时,很容易“偶然”出现线程安全问题。1.1线程安全问题关于线程安全问题,有一个经典的问题——银行取钱的问题。银行取钱的基本流程基本上可以分为如下几个步骤。用户数据账户、密码,系统判断用户的账户、密码是...原创 2019-02-14 14:47:41 · 413 阅读 · 0 评论 -
《疯狂java讲义》学习(55):组合式异步编程
组合式异步编程Java 8的新功能,主要是一个新的类CompletableFuture,它是对并发编程的增强,它可以方便地将多个有一定依赖关系的异步任务以流水线的方式组合在一起,大大简化多异步任务的开发。之前介绍了那么多并发编程的内容,还有什么问题不能解决?CompletableFuture到底能解决什么问题?与之前介绍的内容有什么关系?具体如何使用?基本原理是什么?本节进行详细讨论,我们先来...原创 2019-02-25 12:42:32 · 447 阅读 · 0 评论 -
《疯狂java讲义》学习(49):基于UDP协议的网络编程
基于UDP协议的网络编程UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象。Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送、接收的数据报。UDP协议基础UDP协议是英文User Da...原创 2019-02-19 17:55:07 · 453 阅读 · 0 评论 -
《疯狂java讲义》学习(54):Java8的日期和时间API
Java8的日期和时间API本节介绍Java 8对日期和时间API的增强。我们在之前介绍了Java 8以前的日期和时间API,主要的类是Date和Calendar,由于他的设计有一些不足,Java 8引入了一套新的API,位于包java.time下。表示日期和时间Java 8中表示日期和时间的类有多个,主要的有:Instant:表示时刻,不直接对应年月日信息,需要通过时区转换;Loca...原创 2019-02-24 16:24:56 · 365 阅读 · 0 评论 -
《疯狂java讲义》学习(43):线程生命周期和控制
1线程的生命周期当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的声明周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead) 5种状态。尤其是当线程启动以后,它不可能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。1.1新建和就绪状...原创 2019-02-13 13:05:04 · 422 阅读 · 0 评论 -
《疯狂java讲义》学习(42):多线程
多线程大部分时候我们都是做着单线程编程,只有一条顺序执行,如果遇到阻塞就会停滞,但是单线程的程序往往功能非常有限,例如,我们开发一个简单的服务器程序,这个服务器程序需要向不同的客户端提供服务时,不同的客户端之间应该互不干扰,否则会让客户端感觉非常沮丧。多线程听上去是非常专业的概念,其实非常简单——单线程的程序(前面介绍的绝大部分程序)只有一个顺序执行流,多线程的程序则可以包括多个顺序执行流,多个...原创 2019-02-12 21:45:27 · 532 阅读 · 0 评论 -
《疯狂java讲义》学习(48):TCP协议的网络编程
1.基于TCP协议的网络编程TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。1.1 TCP协议基础IP协议是Int...原创 2019-02-18 13:41:29 · 524 阅读 · 1 评论 -
《疯狂java讲义》学习(53):函数式处理:强大方便的收集器
函数式数据处理:强大方便的收集器对于collect方法,前面只是演示了其最基本的应用,它还有很多强大的功能,比如,可以分组统计汇总,实现类似数据库查询语言SQL中的group by功能。具体都有哪些功能?有什么用?如何使用?基本原理是什么?让我们逐步进行探讨,先来进一步理解collect方法。理解collect上一篇中,过滤得到90分以上的学生列表,代码是这样的:List<Stude...原创 2019-02-23 11:40:03 · 328 阅读 · 0 评论 -
《疯狂java讲义》学习(47):Java网络基础
1.网络编程的基础知识1.1 网络基础知识所谓计算机网络,就是把分布在不同地里区域的计算机与专门的外部设备用通信线路连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。计算机网络是现代通信技术与计算机技术相结合的产物,计算机网络可以提供一下一些主要功能:资源共享。信息传输与集中处理。均衡负荷与分布处理。综合信息服务。计算机...原创 2019-02-17 14:09:13 · 458 阅读 · 0 评论 -
《疯狂java讲义》学习(30):Queue集合
Queue集合Queue用于模拟队列这种数据结构,队列通常是“先进先出”(FIFO)的容器。队列的头部保存在队列中存放时间最短的元素。新元素插入(offer)到队列尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。Queue接口中定义了如下几个方法:void add(Object e):将指定元素加入此队列的尾部。Object element():...原创 2019-01-31 12:12:40 · 599 阅读 · 0 评论 -
《疯狂java讲义》学习(41):标准序列化机制
标准序列化机制简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。基本用法要让一个类支持序列化,只需要让这个类实现接口java.io.Serializable。Serializable没有定义任何方法,只是一个标记接口。比如,对于前面章节提到的Student类,为支持序列化,可改为:public class Student implements Serializable...原创 2019-02-11 11:36:55 · 502 阅读 · 0 评论 -
《疯狂java讲义》学习(32):Collections类和Enumeration
操作集合的工具类:CollectionsJava提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。排序操作Collections提供了如下几个方法用于对List集合元素进行排序。static void reverse(List list)...原创 2019-02-02 14:06:05 · 677 阅读 · 0 评论 -
《疯狂java讲义》学习(27):Collection和Iterator接口
Java集合概述在编程时,常常需要集中存放多个数据。我们可以使用数组来保存多个对象,但数组长度不可变化,如果需要保存数量变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据,如成绩表:语文—79,数学—80,这种数据看上去像两个数组,但这两个数组的元素之间有一定的关联关系。为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要...原创 2019-01-28 11:18:46 · 618 阅读 · 0 评论 -
《疯狂java讲义》学习(31):Map相关类
MapMap用于具有保存映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。key和value之间存在单向一对一关系,即通过制定的key,总能找到唯一的、确定的value。从Map...原创 2019-02-01 19:11:20 · 635 阅读 · 0 评论 -
《疯狂java讲义》学习(12):包装类
增强包装类为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper Class)的概念,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类。除了int和char有点例外之外,其他的基本数据类型对应的包装类都是将其首字母大写即可。把基本数据类型变量包装成包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个包装类中除了...原创 2019-01-13 11:04:18 · 638 阅读 · 0 评论 -
《疯狂java讲义》学习(17):接口
更彻底的抽象:接口抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(interface),接口里不能包含普通方法,接口里的所有方法都是抽象方法接口的概念同一个类的内部状态数据、各种方法的实现细节完全相同,类是一种具体实现体。而接口定义了一种规范,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的...原创 2019-01-18 14:17:37 · 803 阅读 · 0 评论 -
《疯狂java讲义》学习(7):封装
封装在前面程序中经常出现通过某个对象的直接访问其Field的情形,这可能引起一些潜在的问题,比如将某个Person的age Field直接设为1000,这在语法上没有任何问题,但显然违背了现实。因此,Java程序推荐将类和对象的Field进行封装。封装的意义封装作为面向对象三大特征之一,作用是将对象的状态隐藏在对象内部,通过该类的方法对内部信息的操作和访问,对一个类或者对象实现良好的封装,可...原创 2019-01-07 19:29:29 · 677 阅读 · 0 评论 -
《疯狂java讲义》学习(11):初始化块
初始化块Java使用构造器来对单个对象进行初始化操作,使用构造器先完成整个Java对象的状态初始化,然后将Java对象返回给程序,从而让该Java对象的信息更加完整。与构造器作用非常类似的是初始化块,它也可以对Java对象进行初始化操作。使用初始化块初始化块是Java类里可出现的第4种成员,一个类里面可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化...原创 2019-01-12 12:13:02 · 675 阅读 · 6 评论 -
《疯狂java讲义》学习(3):数组类型
数组类型数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。数组定义与初始化定义数组Java语言支持两种语法格式来定义数组:type[] arrayName;type arrayName[];对这两种语法格式而言,通常推荐使用第一种格式。因为第一种格式不仅具有更好的语意,而...原创 2019-01-02 20:13:47 · 669 阅读 · 0 评论 -
《疯狂java讲义》学习(16):抽象类
抽象类当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体。但在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确地知道这些子类如何实现这些方法。例如定义了一个Shape类,这个类应该提供一个计算周长的方法callPerimeter(),但不同Shape子类对周长的计算方法是不一样的,即Shape类无法准确地知道其子类计算周长的方法...原创 2019-01-17 13:29:55 · 752 阅读 · 0 评论 -
《疯狂java讲义》学习(6):成员变量和局部变量
成员变量和局部变量在Java语言中,根据定义变量位置的不同,可以将变量分成两大类:成员变量局部变量成员变量和局部变量的运行机制存在较大差异成员变量和局部变量差异###成员变量成员变量指的是在类范围里定义的变量,也就是前面所介绍的Field;局部变量指的是在方法里定义的变量。变量划分如下图:类Field的作用域与这个类的生存范围相同;而实例Field则从该类的实例被创建起开始存...原创 2019-01-06 21:19:37 · 722 阅读 · 0 评论 -
《疯狂java讲义》学习(10):继承与组合
类重现继承是实现类重用的重要手段,但继承带来了一个最大的坏处:破坏封装。相比之下,组合也是实现类重用的重要方式,而采用组合方式来实现类重用则能提供更好的封装性。使用继承的注意点子类使扩展父类使,可以直接访问父类的Field和方法,但是有一个严重的问题:继承严重破坏了父类的封装性。前面介绍封装时提到:每个类都应该封装它内部信息和实现细节,而只暴露必要的方法给其他类使用。但在继承关系中,子类可以...原创 2019-01-11 12:04:01 · 667 阅读 · 0 评论 -
《疯狂java讲义》学习(2):流程控制
流程控制不论哪一种编程语言,都会提供两种基本的流程控制结构:分支结构和循环结构。其中分支结构用于实现根据条件来选择性地执行某段代码,循环结构则用于实现根据循环条件重复执行某段代码。顺序结构任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转分支结构Java提供了两种常见的分支控制结构:if条件语句if语句使用布尔表达式或布尔值作为分支...原创 2019-01-01 18:53:23 · 651 阅读 · 0 评论 -
《疯狂java讲义》学习(5):方法
方法详解方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分。但从功能上来看,方法完全类似于传统结构化程序设计里的函数。值得指出的是,Java里的方法不能独立存在,所有的方法都必须定义在类里。方法在逻辑上要么属于类,要么属于对象。方法的属性不论是从定义方法的语法来看,还是从方法的功能来看,都不难发现方法和函数之间的相似性。实际上,方法确实是由传统的函数发展而来的,方法与传统的函数有...原创 2019-01-05 16:04:28 · 612 阅读 · 0 评论