随笔分类 - java编程思想
摘要:TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想象河里的流水,他们是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的
阅读全文
摘要:前置条件:让方法调用的前置条件判断更简单。 在我们的日常开发中,经常要对入参进行一定的参数校验,比如是否为空,参数的取值范围是否符合要求等等。这种参数校验如果我们单独进行校验的话,代码的重复率比较高,也不是很优雅。Guava提供了一个类PreConditions来统一校验我们的参数,同时可以抛出对应
阅读全文
摘要:null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的情况。 鉴于此google的guava库中提供了Opt
阅读全文
摘要:一个Stream表面上看与一个集合很类似,允许你改变和获取数据。但是实际上他与集合是有很大区别的: Stream自己不会存储元素。元素可能被存储在底层的集合中,或者根据需要产生出来。 Stream操作符不会改变源对象。相反,他们会返回一个持有结果的新Stream。 Stream操作符可能是延迟执行的
阅读全文
摘要:一、lambda表达式 一个lambda表达式包含三个部分: 一段代码 参数 自由变量的值,这里的自由指的是哪些不是参数并且没有在代码中定义的变量。 示例: java public interface DefaultDemo { long getId(); default String getNam
阅读全文
摘要:一、什么是 Disruptor 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者 消费者”模型的应用场合了。 可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。 我们知道 Bloc
阅读全文
摘要:java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道str
阅读全文
摘要:本文继续分析HashMap的源码。本文的重点是resize()方法和HashMap中其他的一些方法,希望各位提出宝贵的意见。 话不多说,咱们上源码。 上面一段代码的内容比较好理解,都已经根据注释就能看懂,主要的内容在下半部分:扩容后和扩容前,数据存放位置的变化。我们可以理解一下。 经过观测可以发现,
阅读全文
摘要:一直以来,HashMap就是Java面试过程中的常客,不管是刚毕业的,还是工作了好多年的同学,在Java面试过程中,经常会被问到HashMap相关的一些问题,而且每次面试都被问到一些自己平时没有注意的问题。因为HashMap不管对于毕业生,还是对于老司机来说,都非常熟悉,熟悉到你经常忽略它。 本着知
阅读全文
摘要:五、 新类库中的构件 Java SE5的java.util.concurrent引入了大量设计用来解决并发问题的新类。学习使用它们将有助于编写出更加简单而强壮的并发程序。 1. CountDownLatch 他被用来同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成。 你可以向CountD
阅读全文
摘要:二、共享受限资源 有了并发就可以同时做多件事情了。但是,两个或多个线程彼此互相干涉的问题也就出现了。如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值等诸如此类的问题。 1. 不正确地访问资源 考虑下面的例子,其中一个任务产生偶数,而其他任务消费这些
阅读全文
摘要:三、终结任务 1. 在阻塞时终结 线程状态 一个线程可以处于以下四种状态之一: 1)新建(new):当线程被创建时,他只会短暂的处于这种状态。此时,他已经分配了必须的系统资源,并执行了初始化。此刻线程已经有资格获得CPU时间了,之后调度器将把这个线程转变为可运行zhuang't状态或阻塞状态。 2)
阅读全文
摘要:注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。 一、定义注解 注解的定义看起来很像接口的定义。事实上,与其他任何Java接口一样,注解也将会编译成class文件。 除了@符号外,@Test的定义很像一个空的接口。定义注解时,会需要
阅读全文
摘要:一、基本的线程机制 并发编程使我们可以将程序划分为多个分离的、独立运行的任务。通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动。 线程模型为编程带来了便利,它简化了在单一程序中同时jiao'zhi'zai'yi'qi交织在一起的多个操作的处理。在使用线程时,CPU将轮流给每个任务分配其
阅读全文
摘要:应该在以下情况下使用异常: 在恰当的级别处理问题(在知道该如何处理的情况下才捕获异常)。 解决问题并且重新调用产生异常的方法。 进行少许修补,然后绕过异常发生的地方继续执行。 用别的数据进行计算,以代替方法预计会返回的值。 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层。 把当前运
阅读全文
摘要:一、输入和输出 编程语言的I/O类库中常使用 流 这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。 Java类库中的I/O类分成输入和输出两部分。通过继承,任何自Inputstream或Reader派生而来的类都含有名
阅读全文
摘要:1、java 容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1) Collection 。一个独立元素的序列,这些元素都服从一条或多条规则。 List 必须按照插入的顺序保存元素,而 Set 不能有重复元素。 Queue 按照排队规则来确定对象产生的顺序(通常与他们被插入的顺序相同)
阅读全文
摘要:“确定接口是理想选择,因而应该总是选择接口而不是具体的类。”这其实是一种诱饵。当然,对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂。 许多人都掉进了这种诱惑的陷阱,只要有可能就去创建接口和工厂。这种逻辑看起来是因为需要使用不同的具体实现,因此总是应该添加这种抽象性。这实际上已经变成了
阅读全文
摘要:今天继续读《java 编程思想》,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享。 继承和组合都能从现有类型生成新类型。组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。 在使用继承时,由于导出类具有基类接口,因此它可以向上转型至基类,这对多态来讲至关重要。 尽
阅读全文

浙公网安备 33010602011771号