等待机制和锁机制是密切关联的 Synchronize(obj){ While(!condition){ Obj.wait() } Obj.doSomething(); } } 当线程 A 获得 obj 锁后,发现条件 condition 不满足,无法继续下一处理,于是线程 a 就等待 (wait) 再赢一个线程 b 中,如果 b 更改了某些条件,使得线程 a 的 condition 条件满足了,就可唤醒 线程 A Synchronized(obj){ Condition=true; Obj.notify() } 4 线程调度规则 如果两个或是两个以上的线程都修改一个对象,那么把执行修改的方法定义为同步的 (synchronized),如果对象更新影响到只读方法,那么只读方法也因该定义为同步的 如果一个线程必须等待一个对象状态变化,那么他应该在对象内部等待,而不是在外部等待,它 可以调用一个被同步的方法,并让这个方法调用 wait 方法。 每当一个方法改变某个对象的状态时,它应该调用 notify 方法,这个等待队列的线程提供了机 会,来看一看执行环境是否已经发生改变 记住 wait notify notifyall 方法属于 object,而不是 thread 类,仔细检查看看是否每次 执行 wait 方法都有相应的 notify 或 notifyall 方法,且他们作用与相同的对象 注意:在 java 总每个类都有一个主线程,要执行一个程序,那么这个类当中一定要有 main 方 法,main 方法是 java 类中的主线程。自己创建线程有两种方法,一种是集成 thread 类,另一 种是实现 runnable 接口。 一般情况下, 最好避免继承, 因为 java 中是单根继承, 如果继承 thread 类,则无法再继承其他类。 Q10 调用 yield 方法可以保证什么 A 所有优先级较低的线程获得 cpu 时间 B 当前线程休眠一段时间,其他线程运行 C 当前线程停止,直到其他线程终止 D 线程将等待,直到被通知 E 以上都不正确 E 线程调度器的确切行为是没有定义的, 不能保证 yield 方法的调用 hi 导致其他线程使用 cpu Q11notify 方法意义在何处 A 线程 b 对象 b c applet d runnable 第九章 面向对象的基础类 Java 基础类的集中在以下的包中 lang 包 util 包 io 包 掌握基础 lang 包 掌握常用的 math 类和 object 类 掌握 string 类,以及其他与 StringBuffer 类的区别 掌握 util 包的基本类 重点理解 java 对几何的处理 掌握 java 集合核心接口 区别 hashcode 和 equals 的区别 掌握常见的 io 类 熟练掌握文件输入输出 Q object 类中 hascode 方法的返回值是什么 A string b int c long d object c class 1object 类的主要方法 Object()默认构造方法 Clone:创建并返回此对象的一个副本 Equals(Object obj)判断某个其他对象时候与此对象“相等“ Finalize():当垃圾回收器确定不存在对该对象的引用时,有对象的垃圾回收机制调用此方 法 GetClass ()返回一个对象得运行时类 Hashcode ()返回该对象的哈希码值 Notify()唤醒在此对象监视器上等待的单个线程 NotifyAll()唤醒在此对象监视器上的所有线程 Wait()?导致当前的线程等待,直到其他线程调用此对象的 notify 方法或 notifyall 方法 Wait(long timeout):导致当前的线程在指定时间(timeout 毫秒)内等待知道其他线程调 用此方法的 notify 或者 notyfyall 方法,超过指定的时间量,线程进出就绪状态 Wait(long timeout,int nanos):导致当前的线程在指定时间内等待,知道 …notigyall 方法,或者其他某个线程中断当前线程,或者已超过指定的时间量,线程进入就绪状态 2equals 方法 Equals 方法用于测试某个对象时候同一个对象相等,它在 object 类中的实现是判断两个对 象是否指向同一块内存区域。这种测试用处不大,因为即使内容相同的对象,内存区域也不是不 同,如果先测试对象是否相等,就需要覆盖此方法。 Class Employee{ Public Boolean equals(object otherObj){ If(this==otherObj) return true; If(otherObj==nill)return false; If(getClass()!=otherObj.getClass())return false; Employee other =(Employee)otherObj; Return name.equeals(other.name)&&salary==other.salary&&hireDay.equals(other.hireDa y); } } JAVA 语言规范要求 equals 方法具有如下特点 自反性:对于任何非空引用值 x,x.equals(x)都应该返回 true 对称性。传递性一致性 3tostring 方法 Tostring 方法放回对象的字符串表示。Object 类中的 tostring 方法会打印出类名和对象的 内存位置。 4Hashcode 方法 每个类都可以覆盖 object 类的 hashcode 方法,object 类中的 hashcode 方法就是简单的将 对象在内存中的地址转化为 int 类型并返回。 Q2object 类的 clone 方法可以爆出那个异常 CloneNotSupportedExeception Q3 关于对象的操作哪些说法正确 a 如果引用 x 和引用 y 表示 2 个不同的对象,那么表达式 x.equesl(y)始终为 false b 如果引用 x 和引用 y 表示 2 个不同的对象,那么表达式(x.hashcode()==y.hashcode())始 终未 false cobject 类的 hascode 或 equals 方法被声明为 final e 所有数组都有一个 clone 方法 e,object 类中,hascode 和 equals 都没有声明为 final,不能保证这些方法都能区分所有的 对象 Q4 Math.abs(10,4)函数返回值 … Q 那些运算符不能用于合并字符串对象 Q7 请从下面选项中选着不能用于合并字符串对象的运算符 A + b – c+= d . e & Java 的 string 是类不是原生态数据类型。 String(char a[]) Char[]={‘b’,’o’,’y’}; String s=new String(a); 上述过程相当于?String s=?boy??; String(char[] a[],startintdex,int count) 提取字符数组 a 中的以部分字符创建一个字符串对象,参数 startIndex 和 count 分别指定在 a 中提取字符的其实位置,和从该位置开始截取的字符个数 3.equals()方法 与 equals 方法相似,equalslsIgnoreCase()方法忽略大小写。 4startswith()和 endsWith()方法 用于判断字符串是否已指定字符串是否指定字符串作为开门或者结尾,返回值为布尔类型。 5 regionMathchers()方法 字符串调用 public Boolean regionMathches(int firststart,string otherstart, int otherStart,int) 从当前字符串参数 firststart 指定的位置处开始,去长度位 length 的一个字符串,并将这子 串和参数 other 指定的一个子串比较。 6compareTo()和 compareToIgnoreCase() 字符串对象可以使用 String 类中的 compareTo 方法,按词典顺序与参数 s 指定的字符串比较 大小 如果相同,返回 0,如果当前字符串对象大于 s,返回正值 7indexof() 从当前字符串的头开始检索字符串 s,并返回首次出现 s 的位置。若果没有检索到返回-1 8substring(int start ,int end) 获得一个字符串的字串,从 start 开始,截取到 end,不包含 end 处 9 Replace(char oldChar,char newChar) 可以获得一个字符串对象,这个对象的参数是用 newChar 指定的字符串替代原字符串中的有 oldChar 指定的所有字符串而得到的字符串 10 整型转化 调用 parseInt 11float 型或 double 型转化 12stringvalue 方法 Q 如何提取字符串 为了提取字符串 String str=?helloworld?中的?llo?,下面那个是正确的 Str.substring(2,2) Str.substring(2,3) Str.substring(2,4) Str.substring(2,5) 最后一个 Q9 string 类的 trim()方法有什么不同 String 的 trim 方法的作用就是返回一个字符串,该字符串原来字符串的头和尾空白部分去掉 Q10 String 类的 concat()方法 Public class Muclass{ Public static void main(String [] args){ String str1=?str1?; String str2=?str2?; String str3=?str3?; Str1.concat(str2); System.out.println(str3.concat(str1)); } } 请选出正确答案 A 代码不能通过编译,因为表达式 str3.concat(str1)不是 println()函数的合法参数 B 程序在运行时将会打印出 str3str1str2 C str3 D str3str1 E str3str2 String 类的 concat 方法作用就是将当前的 string 对象和参数的 string 对象串联起来,并 返回一个新的字符串对象。虽然使用了 str1.concat(str2),但是并没有改变对象的引用。 D Q11 哪些表达式是非法的 请从下面选项中选择 3 个非法表达式 A ?hel?.concat(?lo) B (?hel?+?lo?) C (‘a’+’b’+’c’); D(?hel?+new String(‘I’+’o’) E(?hel?+newString(?lo?) Bcd Q13string 对象的 length()方法 public class X extends Thread { public static void main(String []args){ String s="java 你好"; System.out.println(s.length); } } 请选择正确答案 A 9 b 7 c 11 d 编译错误 使用 length()方法的时候,一个汉字字符算一个长度,因为 java 使用的是 Unicode Q14 理解 StringBuffer 类 public static void main(String []args){ String s="hello"; StringBuffer sb=new StringBuffer(s); sb.reverse(); if(s==sb) System.out.println("a"); if(s.equals(sb)) System.err.println("b"); if(sb.equals(s)) System.out.println("c"); } 请选择如下正确的答案 A 代码不能编译,因为没有正确的调用 string 类当然构造方法 B 代码不能正确编译,因为表达式 s==sb 是非法的 C 代码不能编译,因为表达式 s.equals(sb)是非法的 Stringbuffer 字符串缓冲区实现可变字符序列。字符串缓冲区可以被多个线程安全地使用。这 些方法需要的时候可以同步执行,因而任一特定实例的所有操作就好像是以串行发生 Stringbuffer 一些方法 Append capacity(返回缓冲区的当前容量) CharAt(int i)放回字符串缓冲区特定位置的字符 GetChars(int i,int j,char[] str,int k) 把字符串缓冲区复制到目标字数组 dst Intsert(int i,x x)把 x 类型参数的字符串表示添加到该字符串缓冲区 3string 和 stringbuffer 区别 String 类提供了数字不可变的字符串, string 类的对象一旦创建之后,他的所有属性都是 final 类型的,也就是说一旦创建后,就不能更改。这是两者间最大的区别 参考答案 因为 s==sb 对比两个不同的类 Q18 请讲述结合的 3 个组成部分 参考答案:java 集合类的 3 各部分是接口、实现和算法 从一般意义上来说,集合时用来存储对象数据的。Java 中,集合就是存储其他对象的对象。 注意:在数组中,可以存放原始数据类型变量和对象,但是 java 的几何中只能存放对象,不能 不能存放原始数据类型的变量,如果一定要存放变量,则必须将变量装华为相应的对象实例 集合接口:6 个接口(短虚线表示),表示不同集合类型,是集合框架的基础 抽象类:5 个抽象类(长虚线表示),对集合接口的部分实现。可扩张为自定义集合类 实现类 :8 个实现类(实现表示),对接口的具体实现 接口 实现类 ArrayList 保持插入顺序 Y 可重复 Y 排序 N 使用说明 长于随机访问元素;但插 入、删除元素较慢(数组特 性)。 插入、删除元素较快,但随 即访问较慢(链表特性)。 使用散列,最快的获取元素 方法。 将元素存储在红 - 黑树数据 结构中。默认为升序。 List LinkedList HashSet Set TreeSet N N Y Y N Y N N N LinkedHashSet HashMap Map TreeMap LinkedHashMap Y N N Y N N N N N N Y N 使用散列,同时使用链表来 维护元素的插入顺序。 使用散列,提供最快的查找 技术。 默认按照比较结果的升序 保存键。 按照插入顺序保存键,同时 使用散列提高查找速度。 List: 有顺序的,元素可以重复; 遍历:for,迭代; 排序:Comparable Comparator Collections.sort() ArrayList: 底层用数组实现的 List; 特点:查询效率高,增删效率低 轻量级 线程不安全; LinkedList: 底层用双向循环链表实现的 List; 特点:查询效率低,增删效率高; Vector: 底层用数组实现 List 接口的另一个类; 特点:重量级,占据更多的系统开销,线程安全; ------------------------------------------------------------------------------------------------- Set: 无顺序的,元素不可重复(值不相同); 遍历:迭代; 排序:SortedSet HashSet: 采用哈希算法来实现 Set 接口; 唯一性保证:重复对象 equals 方法返回为 true; 重复对象 hashCode 方法返回相同的整数, 不同对象 hashCode 尽量保证不同 (提高效率) ; SortedSet: 对一个 Set 排序; TreeSet: 在元素添加的同时,进行排序。也要给出排序规则; 唯一性保证:根据排序规则,compareTo 方法返回为 0,就可以认定两个对象中有一个是 重复对象。 ------------------------------------------------------------------------------------------------- Map: 元素是键值对:key 唯一不可重复,value 可重复; 遍历:先迭代遍历 key 的集合,再根据 key 得到 value; SortedMap:元素自动对 key 排序 HashMap: 轻量级,线程不安全,允许 key 或者 value 是 null; Hashtable: 重量级,线程安全,不允许 key 或者 value 是 null; Properties:Hashtable 的子类,key 和 value 都是 String TreeMap: 集合是指一个对象可以容纳了多个对象(不是引用),这个集合对象主要用来管理维护一 系列相似的对象。 集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元 素(Elements)。一些 Collection 允许相同的元素而另一些不行。一些能排序而另一些不 行。 Java SDK 不提供直接继承自 Collection 的类, Java SDK 提供的类都是继承自 Collection 的“子接口”如 List 和 Set。 所有实现 Collection 接口的类都必须提供两个标准的构造函数: 无参数的构造函数用于 创建一个空的 Collection, 有一个 Collection 参数的构造函数用于创建一个新的 Collection, 这个新的 Collection 与传入的 Collection 有相同的元素。