注:博客内容主要摘抄自参考阅读中的两篇博文~ 前言 最近在翻阅《阿里巴巴Java开发手册》时发现了这样一条【推荐】性的原则: // 使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分割符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。 String str = "a,b,c,,"; String[] ary = str.split(","); // 预期大于 3,结果是 3 System.out.println(ary.length); 比较好奇产生上述结果的原因,因此决定分析一波源码。 简介 split(String regex, int limit)一般根据正则表达式分割字符串,limit限定分割后产生的字符串个数,超过数量限制的情况下前 limit-1 个子字符串正常分割,最后一个子字符串包含剩下的所有字符。重载方法split(String regex)将 limit 设置为 0。 public String[] split 继续阅读 >>


董恒毅 19/01/20 20:40:14
一、判断题 String字符串在创建后可以被修改。 ( 0 ) 引用一个类的属性或调用其方法,必须以这个类的对象为前缀。 ( 0 final 类名 ) 当调用一个正在进行线程的stop()方法时,该线程便会进入休眠状态。 ( 0 ) 如果一个类声明实现一个接口,但没有实现接口中的所有方法,那么这个类必须是abstract类。 ( 1 ) 构造函数名应与类名相同,返回类型为void。 ( 0 ) 把数组中元素按某种顺序排列的过程叫做查找。 ( 0 ) 对于abstract类,不能创建该类的对象。 ( 1 ) 所有异常都必须捕获。 ( 0 ) 可以使用protected修饰符来防止方法和数据被不同包的非子类访问。 ( 1 ) 在Java程序中,可以使用private来修饰一个类。 ( 1 ) 不允许使用final来修饰abstract方法。 ( 0 ) 可以使用protected修饰符来防止方法和数据被不同包的非子类访问。 ( 1 ) An e 继续阅读 >>


刘生玺 19/01/02 17:51:10
多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果就是按顺序执行,也就是同步的,阻塞的. synchronized同步方法 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized同步方法中的代码 synchronized(this)同步代码块 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码 其实Java还支持对"任意对象"作为"对象监视器"来实现同步的功能. 这个任意对象大多数是实例变量及方法的参数 synchronized(非this对象x)同步代码块 在多个线程持有"对象监视器"为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象 继续阅读 >>


贺含悦 18/12/26 22:31:44
Java中,想要创建一个线程池有两种方式,分别是使用Executors的工厂方法创建和直接使用ThreadPoolExecutor去创建一个线程池。 在阿里巴巴开发手册中有讲,在有多线程开发的需求时,强制使用线程池,避免因为“过度切换”而引起的资源耗尽问题,并且创建线程池时需通过ThreadPoolExecutor的方式去创建。原文如下: 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。 【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下: 1)FixedThreadPool和SingleThreadPool:   允许的请 继续阅读 >>


祝一迪 18/11/26 12:05:26
布局管理器 FlowLayout流式布局管理器 BorderLayout 边界布局管理器 GridLayout 网格布局管理器 CardLayout卡片布局管理器 GridBagLayout 网格包布局管理器 容器中的布局通常是有布局管理器控制,每个Container都有一个与他相关的缺省布局管理器,Panel容器默认的是流式布局管理器,Frame默认是BorderLayout,我们可以通过调用setLayout来改变布局管理器。 package projects1; import java.awt.Button; public class Title { public static void main(String[] args) { MyFrame3 tt= new MyFrame3("example"); tt.init(); } } class MyFrame extends Frame{ public MyFrame(String title) { //设置框体标 继续阅读 >>


畅柯 18/11/25 22:15:16
1.什么是监听器? web监听器是一种能监听某个对象状态变化的组件,重点在于监听域对象(比如ServletContext,HttpSession,ServletRequest)的变化。可以在某些动作前后增加处理 ,实现监控。 2.监听器的相关概念 事件源 :指被监听的对象 request session context 监听器: 监听事件源的对象 ,有8个 注册监听器: 监听器与事件源绑定 相应行为: 监听到事件源变化的时,去做什么事情 3.监听器的作用 统计在线人数,利用HttpSessionLisener 加载初始化信息:利用ServletContextListener 统计网站访问量 实现访问监控 4.监听器原理 使用代理设计模式,如下图                   图片来自高新强老师的网课 什么是代理设计模式? 简单来讲就是某一个对象发生某一个事件时,通知另一个对象,让另一个对象做某事。 5. 监听器的编写步骤 编写一个监听器类去实现监听器接口 继续阅读 >>


陈健源 18/11/25 16:48:57
最近在开发的过程中有一个点让我比较感兴趣,就是使用Lambda表达式的方式来实现Comparator接口。 1. 关于Comparator和Comparable 既然提到了Comparator,那就大致来说一下Comparator和Comparable接口的区别。 Comparator是一种策略模式,即被比较的对象自身不需要做任何改变(实现任何排序接口),而是通过实例化一个Comparator策略来实现对象之间的排序。 Comparable支持对象自身进行改变(对象自身实现Comparable接口),从而具有排序功能。 举个例子来说,一组对象需要用Collection的sort方法进行排序,有两种方法,要么是对象实现Comparable接口,自身具有可排序属性;要么是实现一个Comparator比较器,在调用sort方法时传入。 下面再来说一说Lambda表达式。 2. Lambda表达式 我们都知道,Lambda表达式是Java里面的函数式编程,那么在使用Lambda表达式首先要满足这样一个条件:首 继续阅读 >>


祝一迪 18/11/06 21:33:23
注:本篇博客主要内容来源于网络,侵删~ 引言 我们假设你已经熟练掌握了CAS,原子变量类等的相关概念。这篇博客中,我们主要讨论原子变量类的使用。 原子变量类 原子变量类共12个,分4组: 计数器:AtomicInteger,AtomicLong,AtomicBoolean,AtomicReference。 域更新器:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater。 数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。 复合变量:AtomicMarkableReference,AtomicStampedReference。 在每组中我会选择其中一个较有代表性的进行分析与举例。 AtomicReference 使用说明 AtomicReference的作用是对"对象"进行原子操作。 源码分析 public class AtomicR 继续阅读 >>


董恒毅 18/10/03 13:51:16
注:本篇博客部分内容引用自:Java并发编程:Lock 引言 在Java 5.0之前,协调对共享对象的访问可以使用到的机制只有synchronized和volatile。在Java 5.0之后,增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内置锁的方法,而是在内置锁不再适用的情况下,作为一种可选择的高级功能。 既生synchronized,何生Lock synchronized主要在功能上存在一些局限性。 如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。 再举个例子:当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。 如果采用synchronized关键字来实现 继续阅读 >>


董恒毅 18/09/27 15:46:50
为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05