摘要:
***并发的目的1 通常是提高运行在单处理器上的程序的性能。(因为阻塞的存在)2 在单CPU机器上使用多任务的程序在任意时刻只在执行一项工作,因此,可以不用并发。并发的好处是:程序设计可以极大的简化。某些类型的问题,如仿真,没有并发很难解决。**困难最基本的困难在于协调不同线程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。***阻塞如果程序中的某个任务因为改程序控制范围之外的某些条件而导致不能继续执行,则这个任务或现场就阻塞了。如果没有并发,整个程序都会停下来,直至外部条件发生变化。但如果使用并发来编写程序,那么当一个任务阻塞时,程序中的其他任务还可以继续执行。***进 阅读全文
摘要:
***File File类实际描述的是FilePath。 File path = new File("./bin/OutputVerifier.py"); //得到文件 File path = new File("./bin"); //得到文件夹 String[] list = path.list(); //得到path下文件和文件夹列表 File.list(FilenameFilter filter)File假如是一个Directory,可以通过list()方法得到这个目录下所有的文件和目录的名称数组,list()方法,一种是没有参数,一种是实现Fil 阅读全文
摘要:
***Collections类publicstatic<T> List<T> nCopies(intn, T o)用单个对象的引用填充Collectionpublicstatic<T>voidfill(List<?superT> list, T obj) {替换已经在list中存在的元素,不能添加新的元素。***填充容器所有Collection子类型都有接受另一个Collection对象的构造器,用接受对象中的元素来填充新的容器。***可选操作执行各种不同的添加和移除的方法在Collection接口中都是可选操作,这意味着实现类 并不需要为这些方 阅读全文
摘要:
***数组的特点数组与其他容器的区别:效率、类型和保存基本类型的能力。java中数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但其代价是数组对象的大小被固定,并且在其生命周期不可被改变。数组之所有优于泛型之前的容器,因为:1 可以创建一个数组去持有某个类型,通过编译器检查来防止插入的错误类型和抽取不当类型。2 数组可以持有基本类型数组和泛型之后的容器都是类型检查的,差异在与数组使用[]访问元素,而容器使用get set add等方法。两者十分相似,切换容易,容器具有更多的功能。自动包装机制出现后,容器可以与数组一样方便的处理基本类型, 阅读全文
摘要:
***概述泛型实现了参数化类型的概念,使代码可以应用于多种类型。泛型的最初目的是为了使类或方法具有最广泛的表达能力,这点可以通过解耦类或方法与所使用的类型之间的约束来实现。在创建参数化类型的一个实例时,编译器为你负责转型操作,并且保证类型的正确性。***简单泛型许多原因促使泛型的出现,最显著的一个是为了创造容器类。有时,需要能同时持有多个对象。但通常只会使用容器来存储一种类型的对象。泛型的主要目的之一就是指定容器要持有的对象类型,有编译器来保证类型的正确性。***元组一次方法调用就能返回多个对象,经常会需要类似的功能。解决办法是创建一个对象,用它来持有想要返回的多个对象。元组是将一组对象直接打 阅读全文
摘要:
***识别对象和类的信息1 RTTI,它假定在编译时已知所有类型2 反射,它允许在运行时发现和使用类的信息***RTTIRTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。1 传统的类型转换 如 (Shape)shape2 通过查询Class对象可以获得运行时所需的信息。3if(petinstanceofPet)4if(pair.getKey().isInstance(pet))***Class对象java使用Class对象来执行其RTTI。每个类都有一个Class对象。JVM使用类加 阅读全文
摘要:
***不可变String String类中的每个看起来会修改String值的方法,实际上是创建了新的String对象。***StringBuilder 简单的字符串操作可以使用java的操作符+,复杂的字符串拼接等操作(比如有循环),应优先采用StringBuilder,因为如果采用默认操作符,在循环体内,java编译器会在每次循环时new一个StringBuilder来操作字符串,效率会低。***格式化输出 public class SimpleFormat { public static void main(String[] args) { i... 阅读全文
摘要:
***基本概念 使用异常的好处是,它往往能够降低错误处理代码的复杂度。如果不使用异常,就必须检查特定的错误,在程序的很多地方进行处理。而使用异常则不必在方法调用处进行检查,因为异常机制能够捕获这个错误,并且只需在一个地方处理。而且能把执行过程代码和错误处理代码相分离。***Checked vs UnChecked异常除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception.***基本异常 当抛出异常后,java会使用ne 阅读全文
摘要:
***基本概念 java容器类库用途是保存对象。分为2类: 1 Collection一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与插入的顺序相同)。 2 Map一组成对的键值对对象,允许使用键来查找值,将数字和对象关联到一起。映射表允许我们使用另一个对象来查找某个对象,也被称为关联数组或字典。 应尽量使用接口去声明对象,如:List<Apple>apples=newArrayList<Apple>(); 创建出一个具体类的对象,将其转型为对应的接口,在其余的代 阅读全文
摘要:
***访问 1.从外部类的(非静态方法)之外的地方创建内部类对象时,需要使用Outerclass.innerclass来指明类型 2.内部类拥有对外部类所有元素的访问权,内部类隐式地保存了一个指向外部类对象的引用。 3..this .new在内部类中,可以使用OuterClass.this获取对外部类对象的引用。不能直接生产内部类对象,而是通过外部类对象来创建,如 OutClass outer= new OutClass(); OuterClass .InnerClass inner=outer. new InnerClass(); 4.外部类可以访问内部类的private... 阅读全文
摘要:
抽象类和抽象方法 抽象类目的:创建一个通用接口来操纵一系列类,但不允许类本身实例化。因为抽象类中没有具体的实现内容,创建其对象没有实质意义。包含抽象方法的类一定是抽象类,抽象类可以不包含抽象方法。抽象方法是不完整的,只有声明而没有方法体。子类必须为父类中的抽象方法提供定义,若不定义,则也为抽象类。 抽象类和抽象方法非常有用,它们可以使类的抽象性明确起来,并告诉用户和编译器打算怎样来使用它们。抽象类还是很有用的重构工具,使得我们可以很容易的将公共方法沿着继承层次结构向上移动。接口 interface产生一个完全抽象的类,没有任何具体实现,只允许创建者确定方法名,参数列表和返回类型,但是没有任何方 阅读全文
摘要:
多态多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。它不但能改善代码的组织结构和可读性,还能创建可扩展的程序。封装通过合并特征和行为来创建新的数据类型,‘实现隐藏’通过将细节私有化把接口和实现分离开来。多态的作用是消除类型之间的耦合关系。多态允许同一基类产生的不同子类之间根据方法的行为不同展现出差别(通过子类覆盖父类的方法实现),而这些方法的调用方式相同。 应用多态,我们所做的代码修改,不会对程序员中其他不应受到影响的部分产生破坏。它帮助我们将改变的事物和未变的事物分离开来。再论向上转型 把对某个对象的引用视为对其基类型的引用的做法称为向上转型(在继承树的画法中,基类放置在上方)。 阅读全文
摘要:
组合编译器并不是简单的为每一个引用都创建默认对象,这样可以减少很多不必要的负担。如果想初始化这些引用,可以在如下位置进行: 1 在定义对象的地方 2 在类的构造器中 3 在使用对象之前(惰性初始化) 4 使用实例初始化继承创建类时总是在继承,若未明确指出从其他类继承,则默认继承Object。其他包中的继承类只能访问父类的public成员和方法,一般将父类成员设为private,方法设为public.在继承类中可以调用父类的方法,方法名相同时,前面加super关键字进行调用。从外部看,导出类像是一个与基类具有相同接口的新类,或许还会有额外的方法和域,但继承并不只是复制基类的接口。当创建了一个导出 阅读全文
摘要:
目的把变动的事物和不变的事物区分开来,类库的消费者才能使用。包:库单元编写Java源代码文件时(编译单元:一个.java文件),每个编译单元只有一个public class,且名称与文件名相同,编译单元上的其他类主要为此public类服务,在包外部无法看到。权限取得对某成员的访问权的途径:1 设置改成员为public。各处都可以访问。2 不加权限修饰符,将其他类放入同一个包中,通过包访问权访问。3 继承的子类可以访问父类的public protected。4 提供get set方法。private public class Test { private Test(){} ... 阅读全文
摘要:
方法重载重载的原因:1)相同的方法名可包含不同的含义,不能要求具有细微差别的方法都具有不同的方法名。2)构造器名由类名决定,只能由一个构造器名,想用多种方式创建一个对象,必须实现重载。每个重载的方法必须有独一无二的参数类型列表。参数类型列表包括类名和方法的形参列表,不包含返回值类型。因为有时你并不关心方法的返回值,想要的只是方法调用的其他效果(为了副作用而调用),这时你可能会调用方法而忽略其返回值。如void f() {}; int f() {},当调用f()时则区分调用的是哪个方法。涉及基本类型的重载: 如果传入的数据类型小于方法中声明的形参类型,实际数据类型就会提升。char型不同,如果无 阅读全文
摘要:
逻辑 java不允许将一个数字作为布尔值使用。迭代while do-while的唯一区别是do-while中的语句至少会执行一次。for(;;)三个部分都可以为空,等同于while(true),java中唯一用到逗号操作符的就是for循环的控制表达式。任何返回一个数组的方法都可以使用foreach,foreach还可用于任何Iterable对象。语法为int f[]=new int[10]; ....... for(inti:f)跳转在任何迭代语句的主体部分,都可用break和continue控制循环的流程。可搭配标签使用实现goto的效果。label1: out-iteration{ in. 阅读全文
摘要:
1.1 抽象过程所有编程语言都提供抽象机制。人们能解决的问题的复杂性直接取决于抽象的类型和质量。 1 建立机器模型和实际待解问题的模型之间的关联:费力、难以编写 2 针对待解问题建模:针对特定问题是好方案、但局限性太强。 3 面向对象方式:程序可以通过添加新类型的对象使自身适用于某个特定问题。当阅读描述解决方案的代码时,也是在阅读问题的表述。面向对象的基本特性 1 万物皆为对象 2 程序是对象的集合,对象之间通过发送消息来通信。 3 每个对象中可包含其他对象,可构建复杂的体系。 4 每个对象都拥有其类型 5 某一特定类型的所有对象都可以接收同样的消息。1.2 每个对象都有一个接口可以创建某一类 阅读全文
摘要:
java操作符 几乎所有的操作符都只能操作基本类型,但"=","==","!="可以操作所有对象。String类支持"+","+="。赋值 对对象进行操作时,操作的是对对象的引用。所以,将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。如c=d,则c和d都指向原先d指向的对象。算术操作符 %求余数,/ 整数除法会直接去掉结果的小数位,而不是四舍五入(Math.round())自动递增和递减 ++i(前缀递增)和--i先执行计算,再生成值,i++和i--先生成值,再执行运算。关 阅读全文
摘要:
用引用操作对象 在Java中,一切都被视作对象,因此可采用单一固定的语法,但操纵的标识符实际上是对象的一个引用(reference)。 拥有一个引用,并不一定需要有一个对象和它关联,如 String s; 此处创建的只是引用,而不是对象。如果此时向s发送一个消息,就会返回一个运行时错误,因为s并未与任何事物关联。因此,创建一个引用的时候便进行初始化是更安全的做法。数据存储位置 1)寄存器最快,位于处理器内部,数量有限,不能直接控制。 2)堆栈位于通用RAM中,快速有效,堆栈指针向下移动,则分配新的内存,向上移动,则释放那些内存,因此必须知道存储在堆栈内所有项的生命周期,限制了灵活性。Java的 阅读全文
摘要:
参考:java.io包详细解说decorator的结构如下:MyInterface|_______|_______||MyclassDecorator____|_____||DecoratorADecoratorBdecorator的目的是在不改变任何原有的类的基础下,添加新的功能(你可以理解为书上说的灵活性)。其中Myclass是你要扩展的类,DecoratorA跟DecoratorB封装了你要扩展的功能,并保存有一个MyInterface的引用。考虑以下代码:myInterface是myClass的接口,只声明了一个方法print(),myClass实现了该方法:public interf 阅读全文