
Java核心技术 卷Ⅰ
文章平均质量分 92
Whaleson
这个作者很懒,什么都没留下…
展开
-
14.7 线程安全的集合
java.util.concurrent包提供了映射、有序集和队列的高效实现:ConcurrentHashMap、ConcurrentSkipListMap 、ConcurrentSkipListSet和ConcurrentLinkedQueue。 &n...原创 2019-09-09 07:46:11 · 244 阅读 · 0 评论 -
14.6阻塞队列
Blocking Queue使用队列,可以安全地从一个线程向另一个线程传递数据。阻塞队列方法方法正常动作特殊情况下的动作方法add添加一个元素如果队列满,则抛出IllegalStateException 异常element返回队列的头元素如果队列空,抛出NoSuchElementException异常offer添加一个元素并返回true如果队...原创 2019-09-03 07:45:36 · 227 阅读 · 0 评论 -
14.5同步
如果两个线程存取相同的对象,并且每个线程都调用了一个修改该对象状态的方法,根据各线程访问数据的次序,可能会产生讹误的对象。这样一个情况通常称为竞争条件。14.5.3 锁对象有两种机制防止代码块受并发访问的干扰。synchronized关键字;ReentrantLock类;ReentrantLock保护代码块的基本结构如下:private Lock myLock = new...原创 2019-08-27 07:41:57 · 210 阅读 · 0 评论 -
14.9执行器
如果程序中创建了大量的生命周期很短的线程,则该使用线程池。一个线程池包含许多组合南北运行的空闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。减少并发线程的数目。创建大量线程会大大降低性能甚至使虚拟机奔溃。...原创 2019-08-25 17:08:46 · 204 阅读 · 0 评论 -
14.8Callable与Future
Runnable封装一个异步运行的任务,可以把它想象为一个没有参数和返回值的异步方法。Callable与Runnable类似,但是有返回值。Future保存异步计算的结果。可以启动一个计算,将Future对象交给某个线程,然后忘掉它。Future对象的所有者在计算好之后可以获得它。FutureTask包装器是一种非常便利的机制,可将Callable转换成Future和Runnable...原创 2019-08-25 15:37:41 · 181 阅读 · 0 评论 -
14.1什么是线程
多进程与多线程的区别每个进程拥有自己的一套变量,而线程则共享数据。14.1.1使用多线程给其他任务提供机会将任务代码移动到实现了Runable接口的类的run方法中:Runable r=()->{};Runable创建一个Thread对象:Thread t = new Thread(r);启动线程:t.start();14.2 中断线程当线程的run方法执...原创 2019-08-13 23:17:47 · 185 阅读 · 0 评论 -
自己写一个Map
public class WhalesonMap<K,V> { Entry<K,V> [] tab; private int CAPACITY = 1 << 4;//6 @AllArgsConstructor @NoArgsConstructor @Data public class Entry<K,V>{...原创 2019-08-05 07:47:11 · 280 阅读 · 0 评论 -
hash碰撞
hash的概念hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。hash碰撞如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。为什么HashMap初始容量是2<<4 ?...原创 2019-08-05 07:44:56 · 949 阅读 · 1 评论 -
HashMap源码解读
HashMap源码分析Me: 对集合视图的迭代,HashMap的桶数加实际大小与时间成正比,也就是说,不可以把桶树设置的太多或负载因子太小。O: 对集合视图的迭代需要与HashMap 实例的“容量”(桶数)加上其大小(键值映射的数量)成比例的时间。 因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。Me: 影响HashMap实例性能的有两个参数,一个是...转载 2019-08-03 15:41:25 · 149 阅读 · 0 评论 -
9.5 算法
9.5.1 排序与混排List<String> staff = new LinkedList<>();Collections.sort(staff);//第二种方法staff.sort((Comparator.comparingDouble(Employee::getSalary)));//降序对列表进行排序staff.sort(Comparator.reve...原创 2019-07-31 07:54:06 · 292 阅读 · 0 评论 -
9.4视图与包装器
java中的视图,可以说其实就是一个具有限制的集合对象,只不过这里的不是集合对象,而是一个视图对象。例如:这里有一个Test类Test[] tests = new Test[10];List<Test> testList = Arrays.asList(tests); 这里的testList是一个视图对象,**具有访问数组元素set,get的方法。**但是如果调...原创 2019-07-30 07:50:11 · 181 阅读 · 0 评论 -
9.3映射
9.3.1 基本映射操作Java类库为映射提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。散列映射对键进行散列,树映射用键的整体顺序对元素进行排序,并将其组织成搜索树。与集一样,散列稍微快一些,如果不需要按照排列顺序访问键,就最好选择散列。如果同一个键两次调用put方法,第二个值就会取代第一个值。实际上,put将返回用这个键参数存储的上一个值...原创 2019-07-24 07:20:28 · 140 阅读 · 0 评论 -
9.2 具体的集合
处以Map结尾的类之外,其它都实现了Collection接口,而以Map结尾的类实现了Map接口。Java中的具体集合集合类型描 述ArrayList一种可以动态增长和缩减的索引序列LinkedList一种可以在任何位置进行高效地插人和删除操作的有序序列ArrayDeque一种用循环数组实现的双端队列HashSet一种没有重复元素的无序集合...原创 2019-07-16 07:44:33 · 192 阅读 · 0 评论 -
9.1Java集合框架
9.1.1将集合的接口与实现分离队列(queue)接口:“先进先出”。队列通常有两种实现方式:使用循环数组;循环数组比链表更高效。循环数组是一个有界集合,即容量有限。如果程序中要收集的对象数量没有上限,就最好使用链表来实现。使用链表;9.1.2 Collection接口iterator方法用于返回一个实现了Iterator接口的对象。可以使用这个迭代器对象一...原创 2019-07-16 06:40:19 · 196 阅读 · 0 评论 -
8.3 泛型方法
类型变量放在修饰符的后面,返回类型的前面。public static < T> T getMiddle(T ...t){ }泛型方法可以定义在普通类中,也可以定义在泛型类中。原创 2019-07-14 17:29:31 · 262 阅读 · 0 评论 -
8.2定义简单泛型类
一个泛型类就是具有一个或多个类型变量的类。变量E表示集合的元素类型。K和V分别表示关键字与值的类型。T(需要时还可以用临近的字母U和S)表示"任意类型"。泛型类可以看作是普通类的工厂。...原创 2019-07-14 15:40:45 · 232 阅读 · 0 评论 -
8.1为什么要使用泛型程序设计
8.1.1类型参数的好处在Java增加泛型之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用的数组。好处: 使得程序具有更好的可读性和安全性。...原创 2019-07-14 15:29:47 · 231 阅读 · 0 评论 -
7.5 记录日志
7.5.1基本日志全局日志记录器Logger.getGlobal().info("File -> OPen menu item selected");在适当的地方(如main开始)调用import java.util.logging.Logger;Logger.getGlobal().setLevel(Level.OFF);7.5.2高级日志创建或获取记录器:...原创 2019-07-11 07:44:03 · 193 阅读 · 0 评论 -
7.4 使用断言
7.4.1断言的概念断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句会被自动地移走。assert 的两种形式:assert 条件;assert 条件:表达式;//表达式的目的是产生一个消息字符串。如果结果为false,则抛出一个AssertionError异常。7.4.2开启和禁用断言IDEA开启断言添加 -enableassertio...原创 2019-07-10 23:18:18 · 250 阅读 · 0 评论 -
7.2捕获异常
7.2.1捕获异常如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么程序将跳过try语句块的其余代码。程序将执行catch字句中的处理器代码。7.2.3再次抛出异常与异常链在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型。try{ access the database }catch(SQLException e){ ...原创 2019-07-10 07:35:31 · 271 阅读 · 0 评论 -
7.1 处理错误
异常处理的任务就是将控制权从错误产生的地方转移到能够处理这种情况的错误处理器。异常分类异常都是派生于Throwable类的一个实例。Throwable分为Error和ExceptionError:运行时的系统内部错误。在设计Java程序时,需要关注Exception层次结构。分为两个分支:RuntimeException和其他异常。派生与RuntimeException的...原创 2019-07-09 23:24:12 · 108 阅读 · 0 评论 -
6.5 代理
利用代理可以在运行时创建一个实现了一组给定接口的新类。6.5.1何时使用代理假设由一个表示接口的Class对象(可能只包含一个接口),它的确切类型在编译时无法知道。要想构造一个实现这些接口的类,就需要使用newInstance方法或反射找出这个类的构造器。但是不能实例化一个接口,需要在程序处于运行状态时定义一个新类。代理类可以在运行时创建全新的类。调用处理器,是实现了Invo...原创 2019-07-09 22:55:56 · 192 阅读 · 0 评论 -
6.4 内部类
为什么使用内部类内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。内部类可以包中其它类隐藏起来。当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。嵌套是一种类之间的关系,而不是对象之间的关系。嵌套类的好处:命名控制;访问控制;内部类是由外部类的方法构造。内部类既可以访问自身的数据域,也可以访问创建它的外围...原创 2019-07-08 07:49:41 · 557 阅读 · 0 评论 -
6.3 lambda表达式
6.3.1为什么引入lambda表达式是一个可以传递的代码块,可以在以后执行一次或多次,6.3.2lambda表达式的语法带参数 变量的表达式就被称为lambda表达式。//按照字符长度排序Arrays.sort(planets,(first,second) -> first.length() - second.length());6.3.3 函数式接口函数式接口:...原创 2019-07-07 22:54:09 · 185 阅读 · 0 评论 -
6.2 接口示例
6.2.1接口示例javax.swing.JOptionPanestatic void showMessageDialog(Component parent,Object message);java.swing.TimerTimer(int interval,ActionListener listener)void start()void stop()java.aw...原创 2019-07-06 23:30:01 · 203 阅读 · 0 评论 -
6.1 接口
6.1.1接口概念接口不是类,而是对类的一组需求描述。接口绝不能含有实例域。不能构造接口的对象,但是可以申明接口的变量。接口变量必须引用实现了接口的类对象。Java8可以在接口中实现方法。在实现接口时,必须把方法声明为public;否则,编译器将认为这个方法的访问属性是包可见性,即类的默认访问属性,之后编译器就会给出试图提供更严格的访问权限的警告信息。在比较大整数时...原创 2019-07-06 23:22:25 · 191 阅读 · 0 评论 -
5.8 继承设计技巧
将公共操作和域放在超类;不要使用受保护的类。不使用protected的原因:(访问域)子类集合无限制,会破坏封装性。同一个包中的所有类都可以访问protected域。使用继承实现"is-a"关系除非所有继承的方法都有意义,否则不要使用继承。覆盖方法时,不要改变预期行为。使用多态,而非类型信息。//对于下main这种形式的代码:if(x is of type1) acti...原创 2019-07-06 09:11:14 · 129 阅读 · 0 评论 -
5.7 反射
能够分析类能力的类称为反射(reflective)。反射可以用来:运行时分析类的能力。在运行时查看对象。实现通用的数组操作代码。使用反射的人主要是工具构造者。5.7.1 Class类 //获取Class的方式。 e.getClass();//第一种方式 String className = "java.util.Random";//第二种方式 ...原创 2019-07-03 23:28:57 · 164 阅读 · 0 评论 -
5.6 枚举类
ordinal方法返回enum声明中枚举常量的位置,从0开始计数。 Size.MEDIUM.ordinal();java.lang.Enum < E>int compareTo(E other)如果枚举常量出现再other之前,则返回一个负值。...原创 2019-07-03 19:26:07 · 150 阅读 · 0 评论 -
5.5参数数量可变的方法
Object… args;Object… 参数类型与Object[]完全一样。原创 2019-07-03 07:47:45 · 175 阅读 · 0 评论 -
5.4 对象包装器与自动装箱
包装器类 Integer Long Float Double Short Byte Character Void Boolean(前六个类派生于公共的超类Number)。对象包装器是不可变的。对象包装器类还是final的,因此不能定义它们的子类。ArrayList<Integer> list = new ArrayList<>();由于每个值都包装在对象中,所以A...原创 2019-07-03 07:44:36 · 104 阅读 · 0 评论 -
5.3 泛型数组列表
ArraryList,使用起来有点儿像数组,但在删除和添加元素时,具有自动调节数组容量的功能。如果调用add且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。如果已经清楚或者估计出数组可能存储的元素数量,就可在填充数组之前调用ensureCapacity方法。 list.ensureCapacity(100);还可以把初...原创 2019-07-03 07:26:51 · 155 阅读 · 0 评论 -
5.2 Object:所有类的超类
如果没有明确的指出超类,Object就被认为是这个类的超类。Object类型的变量只能用于作为各种值的通用持有者。要相对其中的内容进行具体的操作,还需要清楚对象的原始类型,并进行相应的类型转换。在Java中只有基本类型不是对象,如数值、字符和布尔。5.2.1 equals方法如果两个对象的状态都相等,就认为这两个对象是相等的。子类定义equals方法时,先调用超类的eq...原创 2019-07-02 22:26:40 · 172 阅读 · 0 评论 -
5.1 类、超类和子类
5.1.1 定义子类派生于 == 继承于。已经存在的类称为父类(parent class)、基类(base class)、超类(superclass);新类称为子类(subclass)、派生类(derived class)或孩子类(child class)。在通过扩展超类定义子类的时候,仅需要指出子类与超类的不同之处。因此在设计子类的时候,应该将通用的方法放在超类中,而将具有特殊用途的方...原创 2019-07-01 23:02:25 · 1812 阅读 · 0 评论 -
4.8 类路径
4.8.1设置类路径最好采用-classpath(或cp)选项指定类路径。利用-classpath选项设置类路径是首选的方法,也可以通过设置CLASSPATH环境变量完成这个操作。其详细情况依赖于所使用的shell。在bash中,命令格式如下:export CLASSPATH=/home/user/classdir:.:/home/user/archive.jar在windows s...原创 2019-07-01 21:18:21 · 120 阅读 · 0 评论 -
4.7 类的导入
4.7.2 静态导入import语句不仅可以导入类,还增加了导入静态方法的静态域的功能。 import static java.lang.System.*; //可以使用System类的静态方法和静态域,而不必加类名前缀: out.println("Goodbye,World!"); exit(0); //导入特定的方法域 import sta...原创 2019-07-01 21:17:35 · 121 阅读 · 0 评论 -
4.10 类设计技巧
1.一定要保证数据私有;不要破坏封装性;如果public数据的表示形式很可能会改变。2.一定要对数据初始化;Java不对局部变量进行初始化,但是会对对象的实例域进行初始化。3.不要在类中使用过多的基本类型;用其它类代替多个相关的基本类型的使用。4.不是所有的域都需要独立的域访问器和域更改器;获取,需要获得或设置雇员的薪金。而一旦构造了雇员对象,就应该禁止更改雇佣日期。...原创 2019-07-01 20:52:06 · 122 阅读 · 0 评论