知识点(1136): 一个图, 一个类(collections), 三个知识点(1、增强的for循环,2、泛型(Generic),3、自动打包和解包(Auto-boxing/unboxing)),  六个接口(collection,Set,List,Map,Iterator,comparable)
  
  28,图:
      
   容器的概念:
   Collection接口——定义了存取一组对象的方法,其子接口Set和List分别定义了存取方式。
   Set接口中的数据没有对象并肩不可重复;List中的数据对象有顺序且可以重复;
   Map接口中定义了存储“键(key)——值(value)映射对”的方法。
  29,容器类对象在调用remove、contains等方法时需要比较对象是否相等,遮这会涉及到对象类型的equals方法和hashCode方法;
   对于自定义类型,需要重写equals和hashCode方法以实现自定义的对象相等规则。
   注意:相等的对象应该具有相等的hash dodes。当你的对象需要用到索引的时候需要用hashCode。
  30,所有实现了collection接口的容器类都有一个iterator方法用于返回一个实现了Iterator接口的对象。
   Iterator对象称作迭代器,用以方便地实现对容器内元素的遍历操作。
   Iterator接口定义了如下方法:
   boolean hasNext();//判断游标右边是否有元素
   object next();//返回游标右边的元素并将游标一致下一个位置
   void remove();//删除游标左边的元素,在执行完next之后该操作只能执行一次
  31,增强的for循环
   优点:增强的for循环对于遍历array和collection的时候相当的简便。例如:
   import java.util.*;
   public class EnhancedFor {
   public static void main(String args[]) {
   int arr[] = {1,2,3,4,5};
   for(int i:arr) {
   System.out.println(i);
   }
  
   Collection c = new ArrayList();
   c.add(new String("sss") );
   c.add(new String("aaa") );
   c.add(new String("bbb") );
  
   for(Object o:c)
   System.out.println(o);
   }
   }
   缺点:数组,不能方便地访问下标值; 集合,与使用Iterator相比不能方便地删除集合中的内容。在内部也是调用Iterator。
   总结:除了简单遍历并读取其中的内容外,不建议使用增强的for循环。
  32,Set接口
   Set接口collection的子接口,Set接口没有提供额外的方法,但Set接口的容器类中的元素是没有顺序的,而且不可以
   重复。
   Set容器可以和数学中的“集合”概念相对应。
   J2SDK API中 所提供的Set容器类有HashSet ,TreeSet等。
  33,List接口
   List接口 是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。
   List容器中的元素都应对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
   J2SDK 所提供的List容器类有ArrayList,LinkedList等。
  34,Comparable接口
   问题:上面的算法根据什么确定对象的“大小”顺序?
   所有可以“排序”的类都实现了java.lang.Comparable接口,Comarable接口中只有一个方法
   public int comparableTo(object obj); 该方法:
   返回 0 表示  this == obj
   返回正数表示 this > obj
   返回负数表示 this < obj
   实现Comparable接口的类通过实现ComparableTo的方法从而确定该类对象的排序方式。
  35,如何选择数据结构:
  衡量标准:读的效率和改的的效率
  Array 读快改慢
  Linked改块读慢
  Hash  两者之间
  36,Map接口
  实现Map接口的类用来存储键—值 对。
  Map接口的实现类有HashMap和TreeMap等。
  Map类中存储的键—值 对通过键来标示,所有键值不能重复。
  37,打包和解包
  打包:将基础类型转换成对象叫打包
  解包:将对象转换成基础类型叫解包
   注:在JDK1.5之后,能自动地打包和解包。如:一下两种写法是等效的。
  Map m1 = new HashMap(), m2 = new TreeMap();
   (1)
   m1.put("one", new  Integer(1));
   m1.put("two", new Integer(2));
   m1.put("three", new Integer(3));
   m2.put("A", new Integer(1));
   m2.put("B", new Integer(2));
   (2)
   m1.put("one", 1);
   m1.put("two", 2);
   m1.put("three", 3);
   m2.put("A", 1);
   m2.put("B", 2);
  38,泛型
   JKD1.4以前类型不明确:
   装入集合的类型都被当作Object对待,从而失去自己的实际类型;从集合中取出时往往需要转型,效率低,容易产生错误。
   解决办法:
   在定义集合的时候同时定义集合的类型;
   可以在的定义Collection的时候指定;
   也可以在循环时用Iterator指定。
   好处:
   增强程序的可读性和稳定性。
  

解决方案 »

  1.   

    知识点(1136): 一个图, 一个类(collections), 三个知识点(1、增强的for循环,2、泛型(Generic),3、自动打包和解包(Auto-boxing/unboxing)),  六个接口(collection,Set,List,Map,Iterator,comparable)
      
      28,图:
          
       容器的概念:
       Collection接口——定义了存取一组对象的方法,其子接口Set和List分别定义了存取方式。
       Set接口中的数据没有对象并肩不可重复;List中的数据对象有顺序且可以重复;
       Map接口中定义了存储“键(key)——值(value)映射对”的方法。
      29,容器类对象在调用remove、contains等方法时需要比较对象是否相等,遮这会涉及到对象类型的equals方法和hashCode方法;
       对于自定义类型,需要重写equals和hashCode方法以实现自定义的对象相等规则。
       注意:相等的对象应该具有相等的hash dodes。当你的对象需要用到索引的时候需要用hashCode。
      30,所有实现了collection接口的容器类都有一个iterator方法用于返回一个实现了Iterator接口的对象。
       Iterator对象称作迭代器,用以方便地实现对容器内元素的遍历操作。
       Iterator接口定义了如下方法:
       boolean hasNext();//判断游标右边是否有元素
       object next();//返回游标右边的元素并将游标一致下一个位置
       void remove();//删除游标左边的元素,在执行完next之后该操作只能执行一次
      31,增强的for循环
       优点:增强的for循环对于遍历array和collection的时候相当的简便。例如:
       import java.util.*;
       public class EnhancedFor {
       public static void main(String args[]) {
       int arr[] = {1,2,3,4,5};
       for(int i:arr) {
       System.out.println(i);
       }
      
       Collection c = new ArrayList();
       c.add(new String("sss") );
       c.add(new String("aaa") );
       c.add(new String("bbb") );
      
       for(Object o:c)
       System.out.println(o);
       }
       }
       缺点:数组,不能方便地访问下标值; 集合,与使用Iterator相比不能方便地删除集合中的内容。在内部也是调用Iterator。
       总结:除了简单遍历并读取其中的内容外,不建议使用增强的for循环。
      32,Set接口
       Set接口collection的子接口,Set接口没有提供额外的方法,但Set接口的容器类中的元素是没有顺序的,而且不可以
       重复。
       Set容器可以和数学中的“集合”概念相对应。
       J2SDK API中 所提供的Set容器类有HashSet ,TreeSet等。
      33,List接口
       List接口 是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。
       List容器中的元素都应对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
       J2SDK 所提供的List容器类有ArrayList,LinkedList等。
      34,Comparable接口
       问题:上面的算法根据什么确定对象的“大小”顺序?
       所有可以“排序”的类都实现了java.lang.Comparable接口,Comarable接口中只有一个方法
       public int comparableTo(object obj); 该方法:
       返回 0 表示  this == obj
       返回正数表示 this > obj
       返回负数表示 this < obj
       实现Comparable接口的类通过实现ComparableTo的方法从而确定该类对象的排序方式。
      35,如何选择数据结构:
      衡量标准:读的效率和改的的效率
      Array 读快改慢
      Linked改块读慢
      Hash  两者之间
      36,Map接口
      实现Map接口的类用来存储键—值 对。
      Map接口的实现类有HashMap和TreeMap等。
      Map类中存储的键—值 对通过键来标示,所有键值不能重复。
      37,打包和解包
      打包:将基础类型转换成对象叫打包
      解包:将对象转换成基础类型叫解包
       注:在JDK1.5之后,能自动地打包和解包。如:一下两种写法是等效的。
      Map m1 = new HashMap(), m2 = new TreeMap();
       (1)
       m1.put("one", new  Integer(1));
       m1.put("two", new Integer(2));
       m1.put("three", new Integer(3));
       m2.put("A", new Integer(1));
       m2.put("B", new Integer(2));
       (2)
       m1.put("one", 1);
       m1.put("two", 2);
       m1.put("three", 3);
       m2.put("A", 1);
       m2.put("B", 2);
      38,泛型
       JKD1.4以前类型不明确:
       装入集合的类型都被当作Object对待,从而失去自己的实际类型;从集合中取出时往往需要转型,效率低,容易产生错误。
       解决办法:
       在定义集合的时候同时定义集合的类型;
       可以在的定义Collection的时候指定;
       也可以在循环时用Iterator指定。
       好处:
       增强程序的可读性和稳定性。
      
      输入输出流
      39,分类:
       按数据流的方向 输入流和输出流
       按处理数据单位 字节流和字符流
       按照功能       节点流和处理流
       J2 SDK 所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型。
      
      
         字节流(8位)   字符流(16位)
      输入流   InputStream   Reader
      输出流   OutputStream    Writer
      
       注:在java中一个字节是八位,一个字符占两个字节(16位unicode字符串)
       节点流:是可以从一个特定的数据源(节点)读写数据(如:文件,内存)的流。
       处理流:是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
       基础InpuStream的流用于向程序中输入数据,且数据的单位为字节(8bit)。
      
      40,节点流类型:
      类型       字符流          字节流
      Flies(文件) FileReader        FileInuptStream
                          FileWriter   FileOutputStream
      Memory Array CharArrayReader   ByteArrayInputStream
                          CharArrayWriter  ByteArrayOutputStream
      
      Memory String StringReader  __
                          StringWriter   
      Pipe(管道) PipeReader        PipeInputStream
                          PipeWriter  PipeOutputStream 
      
      处理流类型:  处理类型       字符流                       字节流
      Buffering       BufferedReader(可读一整行) BufferedInputStream
      Filtering       FilterReader                    FilterInputStream
                          FilterWriter               FilterOutptStream
      Converting between  InputStreamReader
      Bytes and charcter OutputStreamWriter   
      Objct Setialization                          ObjectInputStream
                                                          ObjectOutputStream
      Data conversion                          DataInputStream
                                                          DataOutputStream
      Counting       LineNumberReader       LineNumberInputStream
      Peaking ahead PusbackReader               PushbackInputStream
      Printing       PrintrWriter               PrintStream
       缓冲流:
      缓冲流要“套接”在相应的节点之上,对读写的数据提供了缓冲功能,提高了读写的速率,同时增加了一些新的方法。
      缓冲输入支持其父类的和resert方法;
      BuffereReader提供了readerLine用于读取一行字符串(\n或\r分隔);
      BuffereWriter提供了newLine用于写入一行分隔符;
      对于输出的缓冲流,写出的数据会先在内存中缓冲,使用flush方法将会使内存中的数据立刻写出。
       数据流:
      DataOUtputStream和DataInputStream分别继承自OutputStream和InputStream,它属于处理流,需要分别“套接”在OutputStream和InputStream类型的节点流上。
      DataInputStream和DataOutStream提供了可以存取与机器无关的java原始类型数据(如:int,double)的方法。
       Print流
      PrintWriter和PrintStream都是输出流,分别针对字符和字节;
      PrintWriter和PrintStream提供了print和println方法用于多种数据类型的输出;
      PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息;
      PrintWriter和PrintStream有自动flush功能。
       Object流
      如果你想把某个对象系列化,必须实现Serializable接口。
      Transient(透明的) 可以用来修饰成员变量。Transient修饰的(成员)变量在系列化的时候不予考虑,往硬盘里存储数据的时候这个值不写。
     线程
     41,线程的基本概念:
    (1),线程是一个程序内部的顺序控制流。
    (2),线程和进程的区别:
      每个进程都有独立的代码和数据空间(进程上下文),进程间切换会有较大的开销;
      线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计时器(pc),线程切换的开销小;
    多进程:在操作系统中能同时运行多个任务(程序);
    多线程:在同一个应用程序中有多个顺序流同时执行;
    42,Java的线程通过java.lang.Thread类来实现。VM启动时会有一个由主方法(public static void main(){} )所定义的线程。可以通过创建Thread的实例来创建新的线程。每一个线程都通过特定的Thread对象的方法run()来完成其操作的,方法run()为线程体。通过调用Thread类的start()方法来启动一个线程。
    43,能使用接口的时候不要从Thread类继承,因为用接口不仅可以实现接口的方法,而且还可以继承其他的类。
       44,Sleep方法:Thread的静态方法(public static void sleep (long millis) throws InterruptedException) 使得当前线程休眠(暂时停止执行millis毫秒);
      Join方法:合并某个线程;
    Yield方法:让出CPU,给其他线程执行的机会。
    45,synchronized (this) :锁定当前对象,在执行当前这个对象时不应许其他线程打断插入。使用的方式有:
    (1),class Timer {
    private static int num = 0;
    public synchronized void add(String name) {   //执行这个方法的过程中锁定当前对象。
    num ++;
    try {
    Thread.sleep(1);
    } catch( InterruptedException e) {
    return;
    }
    System.out.println(name + ",你是第" + num +"使用Timer的线程。");
    }
    }
    (2),class Timer {
    private static int num = 0;
    public  void add(String name) { 
    synchronized(this) {  //锁定大括号这个区域的代码段
    num ++;
    try {
    Thread.sleep(1);
    } catch( InterruptedException e) {
    return;
    }
    System.out.println(name + ",你是第" + num +"使用Timer的线程。");
    }
    }
    }
      46,wait();使用wait()的前提是用synchronized锁住该方法。notify的作用是叫醒其它线程,notifyAll的作用是叫醒其它多个线程。
      47,wait方法和sleep方法的区别:
    (1),wait方法是Object类的方法,sleep方法是Thread类的方法。
    (2),wait时,别的线程可以访问锁定的对象;调用wait方法时必须锁定该对象。
    (3),sleep时,别的线程不可以访问锁定对象。
      网络编程
      48,网络编程 != 网站编程
      49,分层模型(表格)
    OSI参考模型 TCP/IP参考模型
    应用层          应用层
    表现层
    会话层
    传输层         传输层
    网络层         网络层
    数据链路层 物理 + 数据链层
    物理层   50,IP:每一台计算机都有独立(独一无二)的IP地址;TCP协议是可靠的,但速度慢,效率低;UDP协议是不可靠的,但速度快,效率高。
      51,一般的网络编程叫Socket(插座)编程 。两个java应用程序可通过一个双向的网络通信连接来实现数据,这个双向链路的一端称为Socket。Socket通常用来实现client-server连接。
      52,java.net包中定义的两个类Socket和ServeSocket,分别用来实现双向连接的client和server端。
      53,建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)。自己用端口号要用1024以上的(1024以下的很多被系统占用了)。端口号分为TCP端口和UDP端口,每一个65536个端口。
      GUI编程
       本章内容:
      (1)、AWT,(2)、组件和容器,(3)、布局管理器,(4)、事件处理,(5)、java图形,(6)、Window事件。
      54,AWT
      AWT(Abstract Window Toolkit)包括了很多类和接口,JavaApplication的GUI(Graphics User Interface图形用户界面)编程。
      GUI的各种元素(如:窗口,按钮,文本框等)由java类来实现。
      使用AWT所涉及的类一般在java.awt包中。
      Container和Component是AWT中的两个核心类。
      
      55,新的开发的包javax.swing。
      56,java语言中,提供布局管理器类的对象可以管理
      (1)、管理Component在Container中的布局,不必直接设置Component位置和大小。
      (2)、美格的Container都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container的setLayout方法改变其布局管理器对象。
      AWT提供了5中布局管理器
      FlowLayout, BorderLayout, GridLayout, CardLayout, GridBagLayout
      57,FlowLayout是Panel类的默认布局管理器。
    new FlowLayout(FlowLayout.RIGHT, 20, 40);
    右对齐,组件之间水平距离20个像素,垂直距离40个像素。
    New FlowLayout(FlowLayout.LEFT);
    左对齐,水平和垂直距离为缺省值(5);
    New FlowLayout();
    使用缺省的居中对齐方式,水平和垂直距离为缺省值(5)。
      58,BroderLayout是Frame类的默认布局管理器,BroderLayout将整个容器的布局划分成:东(EAST),西(WEST),南(SOUTH),北(NORTH),中(CENTER)五个部分,组件只能被添加到指定的区域。
      如不指定组件的加入部分,则默认为加入到CENTER区;每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。
      BorderLayout型布局容器尺寸缩放原则:
      北、南两个区域是水平方向缩放;
      东、西两个区域是垂直方向缩放;
      中部可在两个方向上缩放。
      59,GridLayout型布局管理器
      GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右填满后换行,在从上到下。
      GridLayout构造方法中指定分隔的行数和列数。如:
      GridLayout(3, 4); //三行四列
       布局管理器总结:
      Frame是一个顶级窗口,Frame的缺省布局管理器为BorderLayout,Panel无法单独显示,必须添加到某个容器中,Panel的缺省布局管理器为FlowLayout。
      当Panel作为一个组件添加到某个容器中,该Panel仍然可以有自己的布局管理器。
      使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的大小和位置属性,如果试图使用java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。
      如果布局管理器确实需要亲自设置组件的大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null)。
      60,事件监听
      
      61,Paint 每次需要重画的时候调用Paint()。
      62,匿名类:在方法内部定义的没有类名的类。(视频11章,13节)
      使用匿名类的情况:逻辑比较简单,语句比较少,而且不经常变动时可以使用匿名类。
      

  2.   

    以下是我自己写的几篇博客,希望对初学者有用:
    JDK的配置:http://blog.csdn.net/luoweifu/article/details/6789595
    Java使封装自己的类,建立并使用自己的类库:http://blog.csdn.net/luoweifu/article/details/7281494
    Java程序如何生成Jar、exe及安装文件:http://blog.csdn.net/luoweifu/article/details/7628006