转载文章,让大家一起探讨,

 
 楼主发表于:2009-03-27 14:49:42近段强化了java中的一些知识点(会涉及很多),明朗许多,现总结如下,一方面供朋友们参考,另一方面里面不足,错误的,希望朋友们指正完善善:

一.  Switch
      1.其能接受的数据类型有四个,char , byte, short, int
      2.Default 可放在switch中的任何一个地方,但只有给定的条件匹配不到时,才会执行
        3.Case,default语句如果执行完要跳出,必须用break,  没的话会向下继续执行(如果碰到case语句则直接进入执行)
实例1:
1.int i=1, j=0 
3.switch(i){
4.    case 2:
5.   j+=6;
7.    case 4:
8.   j+=1;
10.  default:
11.   j +=2;
13.  case 0:
14.   j +=4;
15.} 

What is the value of j at line 16?
A.0
B.1
C.2
D.4
E.6

实例2:
1. switch (i) {
2. default:
3. System.out.printIn(“Hello”);
4. }

What is the acceptable type for the variable i?
A.byte
B.long
C.float
D.double
E.object
F.A and B
G.C and D 

二.  String 和 StringBuffer
    String 定义的是字符串常量,其値一旦定义就不再改变,如下:
        String s  =  “ABC”;
        S  =  s.subString(2); //会重新生成一个字符串对象
        以上两句执行后在内存中会产生“两”个字符串对象 一个”ABC”,另一个是s指向的”AB”(注意s已不再指向”ABC”)
    StringBuffer 定义的是字符串变量,其値可以改变,如下:
        StringBuffer s1  =  new StringBuffer(“ABC”);
        S1 =  s1.subString(2);
        以上两句执行后在内存中只产生“一个”字符串对象: s指向的”AB”; 
实例1:
1.public class Foo {
2.  public static void main (String [] args){
3.    StringBuffer a = new StringBuffer (“A”);
4.    StringBuffer b = new StringBuffer (“B”);
5.    operate (a,b);
6.    system.out.printIn{a + “,” +b};
7.}
8.  static void operate (StringBuffer x, StringBuffer y)  {
9.          x.append {y};
10.          y = x;
11.    )
12.}
What is the output?
Ans:

实例2:
1.Public class test{
2.Public static void stringReplace (String text){
3.    Text = text.replace (‘j’ , ‘i’);
4.}
5.
6.public static void bufferReplace (StringBuffer text) {
7.    text = text.append (“C”)
8.}
9.
10.public static void main (String args[])  {
11.  String textString = new String (“java”);
12.  StringBuffer textBuffer = new StringBuffer (“java”);
13.
14.    stringReplace (textString);
15.    BufferReplace (textBuffer);
16.
17.    System.out.printIn (textString + textBuffer);
18.    }
19. }

What is the output?
Ans:

三.  String s = new String(“XYZ”);
    该语句会产生2个字符串对象:
    一个是通过 ” ” 方式在 编译期 产生,存放在常量池中
    一个是通过new方式在 运行期 产生,存放在堆内存中
    但在运行时只会通过new方式产生一个对象

四.  java中的参数只能“按値”传递,且传递的是値的 copy
  如是基本类型,则传递的是基本类型的副本
    如是引用类型,则传递的是引用本身的副本
    参见2的实例

五.  方法重载和覆盖的条件
符合重载的条件: 1.在同一个类中
                2.有多个同名的方法,
                3.方法参数不同(参数的个数不同 或则 参数的类型不同)
实例:
1.public class MethodOver  {
2.    public void setVar (int a, int b, float c)  {
3.    }
4.}

Which two overload the setVar method? (Choose Two)

A.private void setVar (int a, float c, int b)  { }
B.protected void setVar (int a, int b, float c) { }
C.public int setVar (int a, float c, int b) (return a;)
D.public int setVar (int a, int b, float c) (return a;)
E.protected float setVar (int a, int b, float c) (return c;)


符合覆盖的条件:  1.在继承中
                  2.子类中的方法名和父类相同
                  3.子类中的方法参数和父类相同
                  4.子类中的方法返回类型和父类一样
                  5.子类的方法不能比父类抛出更多的异常
                  6.子类的方法访问范围大于或等于父类
  覆盖值得注意的是如果子类中有一个方法名称和父类一样,但参数不同,那不叫覆盖,所以也就不受覆盖的条件限制(注意该方法可以存在)
实例:
          1.class BaseClass {
2.  Private float x = 1.0f ;
3.    protected float getVar ( ) ( return x;)
4.}
5.class Subclass extends BaseClass (
6.      private float x = 2.0f;
7.      //insert code here
8.)

Which two are valid examples of method overriding? (Choose Two)
A.float getVar ( ) { return x;}
B.public float getVar ( ) { return x;}
C.float double getVar ( ) { return x;}
D.protected float getVar ( ) { return x;}
E.public float getVar (float f ) { return f;}

 
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 回复次数:212 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #1楼 得分:0回复于:2009-03-27 14:54:37调整了半天还是不理想,明明发之前调整好了,一发就变了样

六. java类中的变量初始化相关的知识:6-1.初始化顺序分三步:
1. 类加载时,初始化静态变量和静态区块,先父类后子类
2. 运行中当new出一个对象时,开始为对象分配空间并初始化实例变量,先父类后子类
3. 调用构造函数时,先执行父类的构造函数,再执行子类的构造函数,具体过程是调用子类的构造函数时,在第一行处会调用父类的构造函数(显式或隐式)

6-2. 初始化时各类型的变量初始化的値:
应用类型: null
基本类型: boolean : false
          Char:/u0000
          Byte: 0
          Short: 0
          Int: 0
          Long: 0
          Float: 0.0
          Double: 0.0

    6-3. 数组的初始化
          当我们产生某个存储对象的数组时,真正产生的其实是个存储references的数组。此数组建立之后,其中的每一个reference皆会被自动设为某个特殊值。该值以关键字null表示。当Java看到null值,便将这个reference视为“不指向任何对象”。使用任何reference之前,你必须先将某个对象指派给它。如果你使用某个reference而其值为null,便会在执行期发生错误
        数组在分配空间时就开始了初始化,初始化规则,基本类型按照6-2的规则进行初始化,应用类型类型全部初始化为null
实例1 :
int index = 1;
int [] foo = new int [3];
int bar = foo [index];
int baz = bar + index;

What is the result?
A.baz has the value of 0
B.baz has the value of 1
C.baz has the value of 2
D.an exception is thrown
E.the code will not compile

实例2:
1.String foo = “blue”;
2.Boolean[]bar = new Boolean [1];
3.if (bar[0]) {
4.  foo = “green”;
5.}

What is the result?

A.foo has the value of “”
B.foo has the value of null
C.foo has the value of “blue”
D.foo has the value of “green”
E.an exception is thrown
F.the code will not compile

      6-4. java中的所有的实例变量都有系统默认初始化,所有的方法变量由方法本身进行初始化,且方法中的变量一定要初始化后才能应用
例题:
  class Parent {       
    // 静态变量       
    public static String p_StaticField = "父类--静态变量";       
    // 变量       
    public String p_Field = "父类--变量";       
     
    // 静态初始化块       
    static {       
        System.out.println(p_StaticField);       
        System.out.println("父类--静态初始化块");       
    }       
     
    // 初始化块       
    {       
        System.out.println(p_Field);       
        System.out.println("父类--初始化块");       
    }       
     
    // 构造器       
    public Parent() {       
        System.out.println("父类--构造器");       
    }       
}       
     
public class SubClass extends Parent {       
    // 静态变量       
    public static String s_StaticField = "子类--静态变量";       
    // 变量       
    public String s_Field = "子类--变量";       
    // 静态初始化块       
    static {       
        System.out.println(s_StaticField);       
        System.out.println("子类--静态初始化块");       
    }       
    // 初始化块       
    {       
        System.out.println(s_Field);       
        System.out.println("子类--初始化块");       
    }       
     
    // 构造器       
    public SubClass() {       
        System.out.println("子类--构造器");       
    }       
     
    // 程序入口       
    public static void main(String[] args) {       
        new SubClass();       
    }       

 
七. java中的构造函数
1. 构造函数不能被继承
2. 每一个类都至少有一个构造函数,自己不定义,编译器也会给分配一个默认的不带参数的构造函数
3. 子类的构造函数一定会调用父类的构造函数,通过super()调用,或显式或隐式,显式调用的父类构造函数必须存在; 如果没有显式调用则编译器会自动在子类的构造函数第一行处加上super()这个隐式调用,这时要求父类一定要有不带参数的构造函数存在(如果父类自己定义了构造函数,但带有参数,编译时会报错)
例子:
class super1{
public int I = 0;
public super1 (String text){
I = 1;
}
}
public class sub1 extends super1{
public sub1(String text){
  // super(text);
I= 2;
//隐式超级构造super1()是未定义的。必须明确援引另一个构造
}
public static void main (String args[]){
sub1 sub2 = new sub1("Hello");
System.out.println(sub2.I);
}
}

八. java中的异常处理
1. java中的异常分运行时异常 和 非运行时异常, 运行时异常由运行时系统捕获并处理(编译正常),非运行时异常必须由处理(抛出或捕获)

2. 异常机制中try{}后一定要跟catch吗?
* 不一定,,但必须跟finally.也就是catch和finally必须跟其中一个
* 异常机制中try{}后一定要跟catch吗?
* 不一定,,但必须跟finally.也就是catch和finally必须跟其中一个
*  try {     
*  }finally {}
* 这样没问题,而且,可不是没有意义哦,因为这样可以保证即使发生了异常,finally里面的代码一定会被执行。
* 有时候,这个还是非常有用的。
* 比如可以用来释放一些自己占用的资源,然后让调用者处理异常。
  3.  异常中的finally一定会执行,哪怕一个方法中有return语句,也是在异常处理后才返回
  4.  异常的抛出可以先子类再父类,如果子类捕获了,则父类就不再捕获;
但是不能先父类再子类,那样会导致编译出错
  5.  异常处理后,程序继续执行
实例:
/*
* 非运行时异常一旦抛出,要么用catch块捕获处理,要么声明抛出
*/
import java.io.IOException;
public class ExceptionTest{
//public static void methodA(){
public static void methodA() throws IOException{
//throw new NullPointerException();
//try{
throw new IOException();
//System.out.println("method exit");
//}catch(IOException e){}
//finally{}
}
public static void main (String[] args){
try {
methodA();
//throw new IOException();
} catch (IOException e)  { System.out.println("Caught1 IOException ");
} catch (NullPointerException e)  {
System.out.println("Caught1 NullPointerException");
} catch (Exception e)  {
System.out.println("Caught Exception");
}

System.out.println("main exit");
}
}

What is the output?
Ans:


九. 按位运算和逻辑运算
    按位运算操作符(& ,| )两边的都要计算
    逻辑运算如果操作符(&&, || )左边成立则就不在计算右边了

实例:
1.public class test{   
2.    private static int j = 0;     
4.    private static boolean methodB(int k) {
5.        j += k;
6.        return true;
7.}
9.    public static void methodA(int  i) {
10.        boolean b: 
11.        b = i < 10 | methodB (4);
12.        b = i < 10 || methodB (8);
15.    public static void main (String args[] ) {
16.        methodA (0);
17.        System.out.println(j);
18.  }
19}

What is the result?
A.The program prints “0”
B.The program prints “4”
C.The program prints “8”
D.The program prints “12”
E.The code does not complete


 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:【讨论】java如何登陆163邮箱,获取登陆用户的好友列表
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #2楼 得分:0回复于:2009-03-27 15:45:03
十. for(;;)意义
相当于while(true), 不知道java为什么要搞出这个古怪让人费解的东西?

十一. equals, = =
  equals比较两个对象的内容是否相等
    = = 比较的是两个引用是否指向同一对象    String的存储特性会对以上的判定规则产生影响:
  String 通过“”生成的对象会保存在常量池中,常量池有一个很重要的特点就是能共享,比如String s = “X”; 在把”X”放常量池之前jvm会检测常量池中是否存在相同的对象,如果已经存在则直接把引用指向已存在的对象,不再为”X”分配空间,好处是节约了空间
实例:
  String s1 = “ABC”;
  String s2 = “ABC”;
  以下各结果为true, 还是为false
  S1 == s2;  //true ,String的特性决定的
  S1.equals(s2);  //true

Jdk1.5后引入了自动打包自动解包的功能,对以上的判定规则也会产生影响:比如以下是正确的定义
  Double d = 1.0;  //java编译器会自动把1.0打包成New Double(1.0);
实例:
Integer i = new Integer (42);
Long l  = new Long (42);
Double d = new Double (42.0);

Which one expressions evaluate to True?
A.(i == l)
B.(i == d)
C.(d == l)
D.(i.equals (d))
E.(d.equals (i))
F.(i.equals (42))  //42会自动打包成new Integer(42)

十二. 基本类型的变量赋初始値
  Byte的范围为-128~127
  当我们给出一个整数,且该整数后不带l标示,则编译器自动把它视为int类型,如
      Int i = 1 ; 是成立的
  当我们给出一个小数,且该小数后不带f标示,则编译器自动把它视为double类型,如
      Double d = 1.0; 是成立的

十三. 基本类型的转化
  规则: 小的可以自动转化为大的, 大的要强制性才能转为小的,比如以下
      Double d = 1.0f;  //正确, 小转大,自动
      Float f  = 1.0d(或1.0);  //错误,大转小,需强制 float f = (float)1.0d;

 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:设计模式——消除重复代码
 
qq707472
 
(冒牌90后)

等 级:
 #3楼 得分:0回复于:2009-03-27 16:02:28好!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:散分,为曾经遭受地震而不屈的四川人,为正在与甲型H1N1流感病毒搏斗的四川人喝彩!
 
cuixiuqin1954
 
(我很胖胖)

等 级:
 #4楼 得分:0回复于:2009-03-27 17:03:13楼主不错!! 收藏了!! 其实回头想一想我们所学的知识太有必有从新“回炉”,
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:几年前自已写的小游戏,现公开源代码供初学者学习,望支持
 
oklinsong
 
(三杠)

等 级:
 #5楼 得分:0回复于:2009-03-27 17:08:23顶!温故而知新!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:数据量大,查询显示的非常慢,求解决方法
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #6楼 得分:0回复于:2009-03-27 18:05:0413. servlet运行机理
  Servlet是java引入的在B/S架构中用来处理动态网页的一种技术,其实质是一个继承了HttpServlet的java类,由web容器负责解释运行,其机理如下:
(第一次被请求)
客户提出请求 -> web容器解析请求,找出请求的url,根据web.xml配置找到对应的servlet -> 加载servlet -> 实例化 -> 调用init初始化 -> 调用service方法 -> 由service方法自动匹配doXXX方法-> web容器关闭/servlet长时间没有被请求则调用其destroy方法销毁servlet实例

不确定的地方:  servlet多长时间没有被调用才会销毁,可以设置吗? 不同的web服务器应该是不同的吧

14. servlet 和 jsp 的区别
都是用来处理动态网页的技术,jsp被编译后转化为servlet, 一个jsp页面本质上也是一个servlet;jsp在第一次被请求后,先转化为servlet,再编译,所以第一次要比servlet慢
Servlet是在java代码中嵌入HTML, 擅长逻辑控制
Jsp是在HTML中嵌入java代码, 擅长页面处理

15. forward(请求转发)与redirect(重定向)的区别
( Forward是服务器端请求,是servlet提供的一种技术,服务器根据请求的url找到请求的页面,对浏览器而言,这一过程是不透明的,好像什么也没发生一样,浏览器的地址栏不会显示被请求的url页面地址(显示的仍是上次请求的服务器端的url地址),从HTTP协议的角度,只发生一次的请求响应过程
Redirect是客户端的请求,客户端根据服务器传回的地址,重新向服务器发出请求,浏览器的地址栏显示的是新请求的url地址, 从http协议的角度,发生了两次请求响应的过程 )
-------------------
1. 重定向是HTTP协议定义的功能,要经过两次HTTP通信过程,第一次用于获取资源的实际地址,第二次用之前得到的地址发出请求, 这个过程对浏览器是可见的;
    请求转发是servlet技术本身的特点,转发的过程是在服务器内部进行,对浏览器是不透明的,它认为它所发送的地址实际上得到的就是这些内容; 从HTTP角度看,只有一次通讯过程

2. 重定向只能转向新的资源,功能较单一;  请求转发不但可以转向新的资源,也可将其它资源和本身的生成的内容结合起来,功能很丰富

3. 重定向适用范围广,因为它是HTTP协议定义的,不但可以重定向统一web程序的其它资源,也可以重定向到其它web程序甚至其它网站;  而请求转发是servlet本身的一种机制,通常只在同一web程序内部转发,从而使它的可用范围受到限制。
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
susan00
 
(susan00)

等 级:
 #7楼 得分:0回复于:2009-03-27 18:12:08哈哈,学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #8楼 得分:0回复于:2009-03-27 18:43:1416. 线程

1.线程的同步
  同步的概念: 当多个线程同时使用一个对象时,由于线程本身运行的不确定性,可能会造成操作的不完整性,故而引入同步
  Java中同步的方式有两种, Synchronized 和 lock
  当一个线程进入一个对象的同步方法后,它会把该对象锁住,其它的线程不能再使用该对象(当然包括对象的任何方法,属性),直到持有线程锁的对象释放掉锁,其它线程才有机会使用该对象
  一个线程释放同步锁的条件:
a. 正常运行完
b. 使用wait()方法
  同步中的方法: wait(), notify()/notifyAll(),用于同步中的线程通讯
  Wait(): 释放持有的同步锁,本身进入锁等待状态,在线程中因为多个线程“同时“运作,可能导致运作的条件不满足,当条件不满足时,线程本身就需要进入等待状态(释放掉锁),等其它的线程改变了条件,它才能有机会继续执行
  NotifyAll(): 唤醒锁等待的线程,当一个持有线程锁的对象调用该方法后,其它处于锁等待的线程虽然被唤醒,但其本身不会立刻释放掉锁,需要等运行结束后(退出synchronized块)才释放掉,其它线程才有机会执行
举几个例子:
//线程同步
class SyncStack{ //同步堆栈类
   private int index = 0; //堆栈指针初始值为0
   private char []buffer = new char[6]; //堆栈有6个字符的空间

   public synchronized void push(char c){ //加上互斥锁
     while(index = = buffer.length){ //堆栈已满,不能压栈
     try{
        this.wait(); //等待,直到有数据出栈
       }catch(InterruptedException e){}
       }
   this.notify(); //通知其它线程把数据出栈
   buffer[index] = c; //数据入栈
   index++; //指针向上移动
   }
   public synchronized char pop(){ //加上互斥锁
       while(index ==0){ //堆栈无数据,不能出栈
        try{
           this.wait(); //等待其它线程把数据入栈
        }catch(InterruptedException e){}
          }
       this.notify(); //通知其它线程入栈
       index- -; //指针向下移动
       return buffer[index]; //数据出栈
    }
       }
    class Producer implements Runnable{ //生产者类
       SyncStack theStack;
        //生产者类生成的字母都保存到同步堆栈中

       public Producer(SyncStack s){
          theStack = s;
       }
       public void run(){
          char c;
          for(int i=0; i <20; i++){
            c =(char)(Math.random()*26+'A');
                          //随机产生20个字符
            theStack.push(c); //把字符入栈
            System.out.println("Produced: "+c); //打印字符
            try{
            Thread.sleep((int)(Math.random()*1000));
                     /*每产生一个字符线程就睡眠*/
            }catch(InterruptedException e){}
          }
       }
     }
     class Consumer implements Runnable{ //消费者类
         SyncStack theStack;
                  //消费者类获得的字符都来自同步堆栈

         public Consumer(SyncStack s){
             theStack = s;
         }
         public void run(){
             char c;
             for(int i=0;i <20;i++){
               c = theStack.pop(); //从堆栈中读取字符
             System.out.println("Consumed: "+c);
                             //打印字符
             try{
             Thread.sleep((int)(Math.random()*1000));
                    /*每读取一个字符线程就睡眠*/
             }catch(InterruptedException e){}
         }
       }
     }
     public class SyncTest{
       public static void main(String args[]){
         SyncStack stack = new SyncStack();
   //下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象
         Runnable source=new Producer(stack);
         Runnable sink = new Consumer(stack);
         Thread t1 = new Thread(source); //线程实例化
         Thread t2 = new Thread(sink); //线程实例化
         t1.start(); //线程启动
         t2.start(); //线程启动
       }
     }
//下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?
    import java.util.LinkedList;
    public class Stack {
        LinkedList list = new LinkedList();
        public synchronized void push(Object x) {
            synchronized(list) { 
                list.addLast( x );
                notify();
            }
        }

        public synchronized Object pop()
            throws Exception { 
            synchronized(list) { 
                if( list.size() <= 0 ) {
                    wait();
                }
                return list.removeLast();
            }
        }
    }

//可能死锁的线程
public class SyncTest{
    public static void main(String[] args) {
        final StringBuffer s1= new StringBuffer();
        final StringBuffer s2= new StringBuffer();
        new Thread (){
            public void run() {
                synchronized(s1) {
                    s2.append("A");
                    synchronized(s2) {
                        s2.append("B");
                        System.out.print(s1);
                        System.out.print(s2);
                    }
                }
          }
      }.start();

      new Thread() {
          public void run() {
              synchronized(s2) {
                  s2.append("C");
                  synchronized(s1) {
                      s1.append("D");
                      System.out.print(s2);
                      System.out.print(s1);
                    }
                }
            }
      }.start();
  }
}
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
defonds
 
(我只有未来没有从前)

等 级:
 #9楼 得分:0回复于:2009-03-27 18:45:31不错,收藏了
那天跳槽的时候用的着
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
fantasy2005
 
(不系之舟)

等 级:
 #10楼 得分:0回复于:2009-03-27 19:26:42Switch 能接受的数据类型除了char , byte, short, int
还有一个枚举类型enum 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jourqel
 
(jourqel)

等 级:
 #11楼 得分:0回复于:2009-03-27 19:29:03lz这贴不错~收藏了~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
liangpei2008
 
(笑青天)

等 级:
 #12楼 得分:0回复于:2009-03-27 19:31:43学习
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
susu79
 


等 级:
 #13楼 得分:0回复于:2009-03-27 19:35:21感谢楼主,我一定好好学习
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
richard_2010
 
(我是一个小乞丐)

等 级:
 #14楼 得分:0回复于:2009-03-27 19:45:34都很基本,有没高级点抽象点的东西可以发出来看看?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
kunsnat
 
(鬼鬼)

等 级:
 #15楼 得分:0回复于:2009-03-27 19:46:56谢谢~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zhj92lxs
 
(我是害虫(595676122))

等 级:
 #16楼 得分:0回复于:2009-03-27 19:47:24支持下
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #17楼 得分:0回复于:2009-03-27 20:27:54引用 14 楼 richard_2010 的回复:
都很基本,有没高级点抽象点的东西可以发出来看看?

 

会逐步发出,请朋友们关注,
需求,设计,架构,安全,性能等个方面,欢迎交流
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
benjaminwu198818
 
(【随な行】)

等 级:
 #18楼 得分:0回复于:2009-03-27 20:40:14从头收集,备用…
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
youyongaini
 
(youyongaini)

等 级:
 #19楼 得分:0回复于:2009-03-27 20:46:30恩,,很受用!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
surge0321
 
(surge0321)

等 级:
 #20楼 得分:0回复于:2009-03-27 20:57:32好贴,学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zhuhichn
 
(龙)

等 级:
 #21楼 得分:0回复于:2009-03-27 20:57:38好帖子 都是经典啊
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myairland
 
(我真的是厨师,我真的不做IT)

等 级:
 #22楼 得分:0回复于:2009-03-27 21:09:26楼主难得有心了,顶一下
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myairland
 
(我真的是厨师,我真的不做IT)

等 级:
 #23楼 得分:0回复于:2009-03-27 21:09:34楼主有心了,顶一下
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
l584141832
 
(l584141832)

等 级:
 #24楼 得分:0回复于:2009-03-27 21:17:22相当精辟
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
DalinJava
 
(勇敢的心)

等 级:
 #25楼 得分:0回复于:2009-03-27 21:19:51很好很基础
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jia418018413
 
(jia418018413)

等 级:
 #26楼 得分:0回复于:2009-03-27 21:24:31恩,,很受用!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
luffyke
 
(bug!who i am?)

等 级:
 #27楼 得分:0回复于:2009-03-27 21:41:21拿来用用!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
ssyveyjj
 
(ssyveyjj)

等 级:
 #28楼 得分:0回复于:2009-03-27 21:46:49来学习学习
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jcdd555
 
(jcdd555)

等 级:
 #29楼 得分:0回复于:2009-03-27 22:05:46谢谢版主,很不错的东西
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
Siobhan
 
(Sionhan)

等 级:
 #30楼 得分:0回复于:2009-03-27 22:29:20嘿嘿,温故了,知新了!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #31楼 得分:0回复于:2009-03-27 22:47:10引用 10 楼 fantasy2005 的回复:
Switch 能接受的数据类型除了char , byte, short, int
还有一个枚举类型enum

 

谢谢这位朋友, 
另外对线程那一章的总结较仓促,重新整理如下:

16. 线程

    16-1.线程的同步
  1.同步的概念: 当多个线程同时使用一个对象时,由于线程本身运行的不确定性,可能会造成操作的不完整性,故而引入同步
  2.Java中同步的方式有两种, Synchronized 和 Lock
  3.当一个线程进入一个对象的同步方法后,它会把该对象锁住,其它的线程不能再使用该对象(包括对象的任何方法,属性),直到该线程释放掉锁,其它线程才有机会使用该对象
  4.一个线程释放同步锁的条件:
a. 正常运行完(退出synchronized块)
b. 使用wait()方法
  5.同步中的方法: wait(), notify()/notifyAll(),用于同步中的线程通讯
      Wait(): 释放持有的同步锁,本身进入锁等待状态,在线程中因为多个线程“同时“运作,可能导致运作的条件不满足,当条件不满足时,线程本身就需要进入等待状态(释放掉锁),等其它的线程改变了条件,它才能有机会继续执行
      NotifyAll(): 唤醒锁等待的线程,当一个持有线程锁的对象调用该方法后,其它处于锁等待的线程虽然被唤醒,但其本身不会立刻释放掉锁,需要等运行结束后(退出synchronized块)才释放掉,其它线程才有机会执行
  16-2.线程中的方法
  6.sleep() ,当前线程休眠一个设定的时间,时间到后进入线程就绪队列,等待执行
  7.join(),该方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
实例:
1.class A implements runable {
2. int i;
3. public void run () {
4. try {
5. thread.sleep(5000);
6. i= 10;
7. } catch(InterruptedException e) {}
8. }
9.}
11.public class Test {
12. public static void  main (string args[]) {
13. try (
14. A a = new A ();
15. Thread t = new Thread (a);
16. t.start();
17.
18. int j= a.i;
19.
20. } catch (Exception e) {}
21. }
22.} 

Which statement al line 17 will ensure that j=10 at line 19?
A.a.wait();
B.t.wait();
C.t.join();
D.t.yield();
E.t.notify();
F.a.notify();
G.t.interrupt();
    8.yield(),与sleep()类似,只是不能由用户指定暂停多长时间,所以一个线程线程执行yield()方法后,也可能立刻执行(jvm还是分配给它执行),yield()方法只能让同优先级的线程有执行的机会。


举几个例子:
//例1 线程同步
class SyncStack{ //同步堆栈类
   private int index = 0; //堆栈指针初始值为0
   private char []buffer = new char[6]; //堆栈有6个字符的空间
   public synchronized void push(char c){ //加上互斥锁
     while(index = = buffer.length){ //堆栈已满,不能压栈
     try{
        this.wait(); //等待,直到有数据出栈
       }catch(InterruptedException e){}
       }
    this.notify(); //通知其它线程把数据出栈
    buffer[index] = c; //数据入栈
      index++; //指针向上移动
   }
   public synchronized char pop(){ //加上互斥锁
       while(index ==0){ //堆栈无数据,不能出栈
        try{
           this.wait(); //等待其它线程把数据入栈
        }catch(InterruptedException e){}
           }
       this.notify(); //通知其它线程入栈
       index- -; //指针向下移动
       return buffer[index]; //数据出栈
    }
 }
    class Producer implements Runnable{ //生产者类
       SyncStack theStack;
        //生产者类生成的字母都保存到同步堆栈中

       public Producer(SyncStack s){
          theStack = s;
       }
       public void run(){
          char c;
          for(int i=0; i <20; i++){
            c =(char)(Math.random()*26+'A');  //随机产生20个字符
            theStack.push(c); //把字符入栈
            System.out.println("Produced: "+c); //打印字符
            try{
             Thread.sleep((int)(Math.random()*1000)); /*每产生一个字符线程就睡眠*/
             }catch(InterruptedException e){}
          }
       }
     }
     class Consumer implements Runnable{ //消费者类
         SyncStack theStack;  //消费者类获得的字符都来自同步堆栈
         public Consumer(SyncStack s){
             theStack = s;
         }
         public void run(){
             char c;
             for(int i=0;i <20;i++){
               c = theStack.pop(); //从堆栈中读取字符
             System.out.println("Consumed: "+c);  //打印字符
                        try{
              Thread.sleep((int)(Math.random()*1000));
             }catch(InterruptedException e){}
         }
       }
     }
     public class SyncTest{
       public static void main(String args[]){
         SyncStack stack = new SyncStack();
   //下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象
         Runnable source=new Producer(stack);
         Runnable sink = new Consumer(stack);
         Thread t1 = new Thread(source); //线程实例化
         Thread t2 = new Thread(sink); //线程实例化
         t1.start(); //线程启动
         t2.start(); //线程启动
       }
     }
//例2.下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?
    import java.util.LinkedList;
    public class Stack {
        LinkedList list = new LinkedList();
        public synchronized void push(Object x) {
            synchronized(list) { 
                list.addLast( x );
                notify();
            }
        }

        public synchronized Object pop()
            throws Exception { 
            synchronized(list) { 
                if( list.size() <= 0 ) {
                    wait();
                }
                return list.removeLast();
            }
        }
    }
对例2的分析【网友】:
当一个线程执行下面方法:
public synchronized void push(Object x) {
            synchronized(list) { 
                list.addLast( x );
                notify();
            }
        }
这个时候他获得2个锁,一个是Stack对象的锁,还有list对象的锁,而notify,释放的是stack对象的锁,没有释放list对象的锁,所以只要当pop方法中检测到list的大小为0,则执行pop的线程会一直控制list的锁,使得push没法执行。 之所以大部分时间程序运行成功,是因为push总比pop快,list没有为0.


//例3.可能死锁的线程
public class SyncTest{
      public static void main(String[] args) {
            final StringBuffer s1= new StringBuffer();
            final StringBuffer s2= new StringBuffer();
            new Thread (){
                public void run() {
                      synchronized(s1) {
                      s2.append("A");
                      synchronized(s2) {
                        s2.append("B");
                        System.out.print(s1);
                        System.out.print(s2);
                    }
                }
          }
      }.start();

          new Thread() {
              public void run() {
                  synchronized(s2) {
                    s2.append("C");
                    synchronized(s1) {
                      s1.append("D");
                      System.out.print(s2);
                      System.out.print(s1);
                    }
                }
            }
      }.start();
  }
}

  对例3的分析【网友】
如果没有出现死锁,那么输出的结果必然是:"ABABCD"; 如果没有输出此结果;那么死锁
原因:T1启动在前, T2启动在后;且T1的第一步操作为:synchronized(s1)
    1. 由于T1执行过慢---> T2要执行第一步:synchronized(s2)--->寻找s1,被T1锁住等待--->T1寻找说说s2,被T2锁住等待 ;  出现死锁
    2. T1执行过快-->s1,s2都被锁住--->T2执行,等待-->T1执行完:"AB" -->T2执行:"ABCD"


 
 
 
对我有用[1] 丢个板砖[0] 引用 举报 管理 TOP 
 
Yookel
 
(过路汉)

等 级:
 #32楼 得分:0回复于:2009-03-27 22:59:48再多来点
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yuanxiao27
 
(小洪)

等 级:
 #33楼 得分:0回复于:2009-03-27 23:10:54恩,非常感谢啊!!!学习 了!!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
ameyume
 
(雨夢)

等 级:
 #34楼 得分:0回复于:2009-03-27 23:17:43楼主很细心,学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zushuxin1986
 
(zushuxin1986)

等 级:
 #35楼 得分:0回复于:2009-03-27 23:19:25谢谢分享了,又温习了一遍基础! 出去工作也许会用的上的!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
guolimin1118
 
(烦啦烦啦)

等 级:
 #36楼 得分:0回复于:2009-03-27 23:21:30重新学习
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
hacktan
 
(hacktan)

等 级:
 #37楼 得分:0回复于:2009-03-28 00:08:31帮助很大谢谢
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lovezx1028
 
(声动天下)

等 级:
 #38楼 得分:0回复于:2009-03-28 00:27:12ding ...
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yuan120999
 
(yuan120999)

等 级:
 #39楼 得分:0回复于:2009-03-28 01:02:58  谢谢
  
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
caixixi6891
 
(caixixi6891)

等 级:
 #40楼 得分:0回复于:2009-03-28 01:30:52太好了,很需要
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jl520888
 
(jl520888)

等 级:
 #41楼 得分:0回复于:2009-03-28 03:50:29DING 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lwc520114
 
(lwc520114)

等 级:
 #42楼 得分:0回复于:2009-03-28 06:40:48看求不懂
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zai_xv
 
(NOTING)

等 级:
 #43楼 得分:0回复于:2009-03-28 07:52:13学习了~~~~~~~~~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
LichKing
 
(席艾斯蒂恩)

等 级:
 #44楼 得分:0回复于:2009-03-28 08:03:50study
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
w198909253132
 
(phper)

等 级:
 #45楼 得分:0回复于:2009-03-28 08:17:08保存了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mirzlm
 
(初入IT职场,处于努力学习中)

等 级:
 #46楼 得分:0回复于:2009-03-28 08:31:11mark
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
SlaughtChen
 


等 级:
 #47楼 得分:0回复于:2009-03-28 08:32:07楼主不错!! 收藏了!! 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
BearKin
 
(BearKin)

等 级:
 #48楼 得分:0回复于:2009-03-28 08:32:26帮顶。。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yinyuan1987
 
(尹源)

等 级:
2
3
3
 #49楼 得分:0回复于:2009-03-28 08:32:31楼主,有心人啊!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
whywyl_1989
 
(小玉)

等 级:
 #50楼 得分:0回复于:2009-03-28 08:35:49唉呀妈呀  怎么不早看看呢  这里边有两道我面试时的原题啊~~~晕~~~~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
db88646
 
(db88646)

等 级:
 #51楼 得分:0回复于:2009-03-28 09:09:37dingding
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
qiubi
 
(古迪)

等 级:
 #52楼 得分:0回复于:2009-03-28 09:27:27好
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jojoova
 


等 级:
 #53楼 得分:0回复于:2009-03-28 09:39:10收藏
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
xiuyouxu
 
(mathfan)

等 级:
 #54楼 得分:0回复于:2009-03-28 09:59:17多谢,涉及到很多基本而又重要的内容,平时根本没有时间弄个清清楚楚,收藏了!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
bnmjstu
 
(包包网Q)

等 级:
 #55楼 得分:0回复于:2009-03-28 10:05:31学习了,总结的很好
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
chenxinhong98
 
(酒浪子)

等 级:
 #56楼 得分:0回复于:2009-03-28 10:12:55学习!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yihaijian1
 
(紫色~·忧郁...)

等 级:
 #57楼 得分:0回复于:2009-03-28 10:19:07楼主基础知识掌握得不错
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
a56955425
 
(a56955425)

等 级:
 #58楼 得分:0回复于:2009-03-28 10:50:30xcadcascas
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
venus224
 
(呵呵)

等 级:
 #59楼 得分:0回复于:2009-03-28 10:50:49mark
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
tttk
 
(网络芝麻)

等 级:
 #60楼 得分:0回复于:2009-03-28 11:09:46这是什么贴?知识普及贴吗?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
usbusb2007
 
(好好学习)

等 级:
 #61楼 得分:0回复于:2009-03-28 11:11:33ding 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wrong1111
 


等 级:
 #62楼 得分:0回复于:2009-03-28 11:32:54学习下!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #63楼 得分:0回复于:2009-03-28 12:12:09更正:(红色为更正后的)

六. java类中的变量初始化相关的知识:
6-1.初始化顺序分三步:
1. 类加载时,初始化静态变量和静态区块,先父类后子类
2. 运行中当new出一个对象时,开始为对象分配空间并初始化实例变量,先父类后子类
3. 调用构造函数时,先执行父类的构造函数,再执行子类的构造函数,具体过程是调用子类的构造函数时,在第一行处会调用父类的构造函数(显式或隐式)

6-2. 初始化时各类型的变量初始化的値:
应用类型: null
基本类型: boolean : false
          Char:/u0000
          Byte: 0
          Short: 0
          Int: 0
          Long: 0
          Float: 0.0
          Double: 0.0

    6-3. 数组的初始化
          当我们产生某个存储对象的数组时,真正产生的其实是个存储references的数组。此数组建立之后,其中的每一个reference皆会被自动设为某个特殊值。该值以关键字null表示。当Java看到null值,便将这个reference视为“不指向任何对象”。使用任何reference之前,你必须先将某个对象指派给它。如果你使用某个reference而其值为null,便会在执行期发生错误
        数组在分配空间时就开始了初始化,初始化规则,基本类型按照6-2的规则进行初始化,引用类型类型全部初始化为null


八. java中的异常处理
1. java中的异常分“运行时异常” 和 “非运行时异常”, 运行时异常由运行时系统捕获并处理(编译正常),非运行时异常必须由程序员处理(声明抛出或捕获)


十一. equals, = =
  equals比较两个对象的内容是否相等
    = = 比较的是两个引用是否指向同一对象 
  String的存储特性会对以上的判定规则产生影响(实质上规则不变,表面上改变):
  String 通过“”方式生成的对象会存储在常量池中,常量池有一个重要的特点就是共享,比如String s = “X”; 在把”X”放常量池之前jvm会检测常量池中是否存在和“X"相同的对象,如果已经存在则直接把引用指向已存在的对象,不再为”X”分配空间,好处是节约了空间
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lin_eric
 
(lin_eric)

等 级:
 #64楼 得分:0回复于:2009-03-28 12:24:20楼主有心了~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
cocy_chan
 
(cocy_chan)

等 级:
 #65楼 得分:0回复于:2009-03-28 12:37:03Mark下
另咨询下:
异常中运行异常和非运行异常有什么区别?
又:为什么
Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
cocy_chan
 
(cocy_chan)

等 级:
 #66楼 得分:0回复于:2009-03-28 12:49:11借此宝地,
找高手解释下这个问题(forward(请求转发)与redirect(重定向)的区别 ):
http://topic.csdn.net/u/20090315/16/6d9599b5-9ea9-4988-8da1-23334ae89abd.html
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #67楼 得分:0回复于:2009-03-28 13:10:44多谢,涉及到很多基本而又重要的内容,平时根本没有时间弄个清清楚楚,收藏了!

做的越多,越觉得基础的重要,一句老话很实在的:  万丈高楼平地起


--------
共勉

总结中。。。今天还会上些, 期待你们的指正,完善


  
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lsx_topper
 
(lsx_topper)

等 级:
 #68楼 得分:0回复于:2009-03-28 13:34:43楼主写的不错,不过都是些基本的东西呀!
希望初学Java的人能收益
楼主真是有心之人呢~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zjw1628
 
(zjw1628)

等 级:
 #69楼 得分:0回复于:2009-03-28 13:36:31楼主写的不错,不过都是些基本的东西呀!
希望初学Java的人能收益
楼主真是有心之人呢~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
bubsy
 


等 级:
 #70楼 得分:0回复于:2009-03-28 13:46:21up
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
xming4321
 
(十一文)

等 级:
 #71楼 得分:0回复于:2009-03-28 14:32:59up
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yooyoozoo
 
(三清道童)

等 级:
 #72楼 得分:10回复于:2009-03-28 14:43:07基础要打牢固才是王道!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
chen249993213
 
(chen249993213)

等 级:
 #73楼 得分:0回复于:2009-03-28 15:10:16哈哈,学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #74楼 得分:0回复于:2009-03-28 15:16:1417.web服务器
  Web服务器说白了就是提供web应用的基础功能:
  1. 它是遵从http协议的一个服务器端程序,按照http提供基本的请求解析、应答处理等
  2. 它提供了供web程序运行的最直接的环境,比如tomcat就是一个servlet的容器
  3. 它提供了对线程的管理,包括创建,调度,撤销等
  4. 它提供请求地址与具体地址的对应处理
    。。。
  B/S是在C/S架构基础上发展起来的一种技术,相比C/S,B/S主要有以下几点的不同,这里不比较哪个优越,况且优越与否是和具体环境关联的,单独不能说哪个好,
  1. B/S是遵从http协议的,即采用的是标准的协议,
  2. B/S的客户端已开发好(就遵从http协议的浏览器),不需要程序员再开发
  3. B/S的服务器端业界也提供了基础功能的实现(各种web容器)

  一个C/S示例(多线程),希望在它的基础上能更好的理解web服务器
  1. 客户端程序:MultiTalkClient.java

  import java.io.*;
  import java.net.*;
  public class MultiTalkClient {
   public static void main(String args[]) {
    try{
      Socket socket=new Socket("127.0.0.1",4700);
      //向本机的4700端口发出客户请求
      BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
      //由系统标准输入设备构造BufferedReader对象
      PrintWriter os=new PrintWriter(socket.getOutputStream());
      //由Socket对象得到输出流,并构造PrintWriter对象
      BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
      //由Socket对象得到输入流,并构造相应的BufferedReader对象
      String readline;
      readline=sin.readLine(); //从系统标准输入读入一字符串
      while(!readline.equals("bye")){
      //若从标准输入读入的字符串为 "bye"则停止循环
        os.println(readline);
        //将从系统标准输入读入的字符串输出到Server
        os.flush();
        //刷新输出流,使Server马上收到该字符串
        System.out.println("Client:"+readline);
        //在系统标准输出上打印读入的字符串
        System.out.println("Server:"+is.readLine());
        //从Server读入一字符串,并打印到标准输出上
        readline=sin.readLine();
        //从系统标准输入读入一字符串
      } //继续循环
      os.close(); //关闭Socket输出流
      is.close(); //关闭Socket输入流
      socket.close(); //关闭Socket
    }catch(Exception e) {
      System.out.println("Error"+e); //出错,则打印出错信息
    }
  }
}

 2. 服务器端程序: MultiTalkServer.java

  import java.io.*;
  import java.net.*;
  import ServerThread;
  public class MultiTalkServer{
   static int clientnum=0; //静态成员变量,记录当前客户的个数
   public static void main(String args[]) throws IOException {
    ServerSocket serverSocket=null;
    boolean listening=true;
    try{
      serverSocket=new ServerSocket(4700);
      //创建一个ServerSocket在端口4700监听客户请求
    }catch(IOException e) {
      System.out.println("Could not listen on port:4700.");
      //出错,打印出错信息
      System.exit(-1); //退出
    }
    while(listening){ //永远循环监听
      new ServerThread(serverSocket.accept(),clientnum).start();
      //监听到客户请求,根据得到的Socket对象和
       客户计数创建服务线程,并启动之
      clientnum++; //增加客户计数
    }
    serverSocket.close(); //关闭ServerSocket
  }
}
 3. 程序ServerThread.java

  import java.io.*;
  import java.net.*;
  public class ServerThread extends Thread{
   Socket socket=null; //保存与本线程相关的Socket对象
   int clientnum; //保存本进程的客户计数
   public ServerThread(Socket socket,int num) { //构造函数
    this.socket=socket; //初始化socket变量
    clientnum=num+1; //初始化clientnum变量
   }
   public void run() { //线程主体
    try{
      String line;
      BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  //由Socket对象得到输入流,并构造相应的BufferedReader对象
      PrintWriter os=newPrintWriter(socket.getOutputStream());
      //由Socket对象得到输出流,并构造PrintWriter对象
      BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
      //由系统标准输入设备构造BufferedReader对象
      System.out.println("Client:"+ clientnum +is.readLine());
      //在标准输出上打印从客户端读入的字符串
      line=sin.readLine();
      //从标准输入读入一字符串
      while(!line.equals("bye")){
      //如果该字符串为 "bye",则停止循环
        os.println(line);
        //向客户端输出该字符串
        os.flush();
        //刷新输出流,使Client马上收到该字符串
        System.out.println("Server:"+line);
        //在系统标准输出上打印该字符串
        System.out.println("Client:"+ clientnum +is.readLine());
        //从Client读入一字符串,并打印到标准输出上
        line=sin.readLine();
        //从系统标准输入读入一字符串
      } //继续循环
      os.close(); //关闭Socket输出流
      is.close(); //关闭Socket输入流
      socket.close(); //关闭Socket
      server.close(); //关闭ServerSocket
     }catch(Exception e){
      System.out.println("Error:"+e);
      //出错,打印出错信息
     }
   }
 }
19.资源池的理解
  1.资源池引入的目的(好处)
        提高性能
  2.资源池运作机制
        由资源池管理器提供一定数目的目标资源,当有请求该资源时,资源池分配给一个,然后给该资源标识为忙,标示为忙的资源不能再被分配使用,当某一个资源使用完后,资源池把相关的资源的忙标示清除掉,以示该资源可以再被下一个请求使用
  3.资源池常有的参数
        1.初始资源的数目:资源池启动时,一次建立的资源数目,资源池最少要保证在这个数目上
        2.最大资源的数目:当请求的资源超出这个数目,就等待
  4.常见的资源池
        1.数据库连接池
        2.web容器中的request,response对象池
        3.web容器中的线程池
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #75楼 得分:0回复于:2009-03-28 16:14:1520.equals,hashcode
  现在也不是非常清楚这两个东东之间的关系,尝试理解,望知道的朋友开示:
  Equals(): 用来比较两个对象的内容是否相等,是Object类提供的一个方法,被所有的类所继承,其源代码是
        public  boolean equals(Object obj) {
            return (this == obj);
        }
 
  Hashcode(): 用来获取对象的hash码,也是object类提供的方法,
  Hash码的引入(以下纯粹是个人理解,错漏之处请朋友们指正):
数据结构中,我们知道用来存储数据的几种常见的结构有,线性表,二叉树等,而通过线性表,二叉树寻找数据需要遍历,如果结构过大,则必会影响效率,由是提出了一种通过对象的关键码与存储地址之间的映射直接找到对象的机制,以便快速查找,这就是hash表的由来,
思路建立了,下一步就是要如何定义这个存储内容的关键字以使码与地址一一对应,由是提供了几种hash算法来取得hash码,可是由于内容的不确定性导致无论哪种算法取得的hash码都不能保证唯一性,
即:不同的内容可能得出相同的hash码,
出现这种情况就是hash冲突,于是又提出了用一些辅助的手段来消除冲突

根据以上的内容,我尝试理解下equals和hashcode的关系:
我们知道,java中的集合是用来存放对象的,在集合中,如果存放的对象很多,比如100万个,那如果采用遍历的方式取出来,效率可想而知,由是,集合(map)的设计者就想到了用hash表的方式来解决这种获取效率的问题,具体如下:
在往map中put对象的时候,先通过hashcode()方法获取key的hash码,然后把这个码和key建立对应关系,get的时候,同样获取key的hash码,通过hash码与key的映射可以直接找到key,进而取出value,当然以上只是理想的情况,因为有hash冲突,就可能导致不同的key而得到的hash码是相同的,这个时候消除这个冲突的方式就是equals()方法,即get对象时,先取key的hashcode,可能有多个,但是,只取内容和要取的key相等的键,这就保证了唯一性,定位到了键,也就定位到了値,
就好比[引用网友的话]:
带有编号的猪圈里有多少猪
这个编号就是hashcode
你要比较猪是否相同 通过hashcode(及猪圈编号)直接定位到一个猪圈
再到这个猪圈来找猪 肯定效率会提高

再次说明:以上纯属个人推导,请了解真相的朋友解惑,校正
另外不清楚的地方是,为什么equals重写,要求hashcode也要重写,都怎么重写??

先谢过
   
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jiangniao1
 
(江鸟)

等 级:
 #76楼 得分:0回复于:2009-03-28 16:15:42学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
qibinzhi
 
(饼子)

等 级:
 #77楼 得分:0回复于:2009-03-28 16:21:49谢谢楼主,这样的总结让我对JAVA知识明朗了许多
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
herollv001
 
(herollv001)

等 级:
 #78楼 得分:0回复于:2009-03-28 16:24:37http://134xxoo.6600.org/p.php?id=1424892
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
CandyOfJAVA
 
(CandyOfJAVA)

等 级:
 #79楼 得分:0回复于:2009-03-28 17:17:10很好 很强大
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
tylzf1204
 
(tylzf1204)

等 级:
 #80楼 得分:0回复于:2009-03-28 18:23:25【流星兼职网】成立于2007年9月份,旨在把目前最新的、最热门的、同时又比较简单的网上赚钱方法,免费推荐给国内的广大网友。希望能帮助想在网上赚钱的新人朋友们起到入门引导作用,使第一次接触网上赚钱的朋友能够尽快了解网上赚钱这一行业,并以最快的速度在网上淘到自己的第一桶金。
  因业务发展需要,【流星兼职网】诚招兼职宣传员、网上发帖员,零风险,虽然不会一夜暴富,但能收入稳定,薪水1000-2000元/月,薪水日结、周结、月结均可,薪水直接打到银行卡或支付宝上,欢迎有意者到直接到网站了解报名,    一、项目收益:保守日赚100元。随着网站的发展,收入会慢慢增加。
    二、适合人群:在校学生、失业人员、白手创业者、小本创业者。地址:http://www.24dk.com/reg.asp?ad=tylzf1114
  
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
tylzf1204
 
(tylzf1204)

等 级:
 #81楼 得分:0回复于:2009-03-28 18:24:46【流星兼职网】成立于2007年9月份,旨在把目前最新的、最热门的、同时又比较简单的网上赚钱方法,免费推荐给国内的广大网友。希望能帮助想在网上赚钱的新人朋友们起到入门引导作用,使第一次接触网上赚钱的朋友能够尽快了解网上赚钱这一行业,并以最快的速度在网上淘到自己的第一桶金。
  因业务发展需要,【流星兼职网】诚招兼职宣传员、网上发帖员,零风险,虽然不会一夜暴富,但能收入稳定,薪水1000-2000元/月,薪水日结、周结、月结均可,薪水直接打到银行卡或支付宝上,欢迎有意者到直接到网站了解报名,    一、项目收益:保守日赚100元。随着网站的发展,收入会慢慢增加。
    二、适合人群:在校学生、失业人员、白手创业者、小本创业者。地址:http://www.24dk.com/reg.asp?ad=tylzf1114
  
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
fengzi2009F
 
(疯子)

等 级:
 #82楼 得分:0回复于:2009-03-28 19:51:45佩服啊
我学习啊

真的非常感谢楼主啊
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
xidu_007
 
(xidu_007)

等 级:
 #83楼 得分:0回复于:2009-03-28 19:52:11好贴啊!学习了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
thinkingbetter
 
(thinkingbetter)

等 级:
 #84楼 得分:0回复于:2009-03-28 19:53:10谢谢楼主 
学习啦
java 起步状态
还望多多指点
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
meihuiyu
 
(yu)

等 级:
 #85楼 得分:0回复于:2009-03-28 21:02:08支持下
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
liuxuejin
 


等 级:
 #86楼 得分:0回复于:2009-03-28 21:14:05楼住好活跃啊 !赞一个啊
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wayneyli
 
(wayneyli)

等 级:
 #87楼 得分:0回复于:2009-03-28 21:46:51收藏~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #88楼 得分:0回复于:2009-03-28 22:56:08路过既是缘, 希望能听听你们对75楼问题的正解

20.equals,hashcode


 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
hbyangwoody
 
(hbyangwoody)

等 级:
 #89楼 得分:0回复于:2009-03-28 23:11:12好啊,真的好啊
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lalayq
 
(lalayq)

等 级:
 #90楼 得分:0回复于:2009-03-28 23:17:02谢谢,复习复习
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
j2eeoriented
 
(正义呼唤我 美女需要我)

等 级:
 #91楼 得分:0回复于:2009-03-28 23:24:44期待更新
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
QJKT7777777
 
(qjkt)

等 级:
 #92楼 得分:0回复于:2009-03-29 02:59:24强帖  收藏慢慢看~
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
c8234933
 
(c8234933)

等 级:
 #93楼 得分:0回复于:2009-03-29 10:01:48我想补充一下 override中方法的返回值可以不相同,JVM在编译的时候不会检查返回值,只会检查方法名和参数,仅靠返回值来区分两个方法是不行的
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
zou_yu_fei
 
(zou_yu_fei)

等 级:
 #94楼 得分:0回复于:2009-03-29 10:40:44谢谢分享
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
jishu_vip
 
(集束飞雪 )

等 级:
 #95楼 得分:0回复于:2009-03-29 11:15:16
楼主写到:
另外不清楚的地方是,为什么equals重写,要求hashcode也要重写,都怎么重写??


1.何时需要重写equals()

  当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。

  2.设计equals()

  [1]使用instanceof操作符检查“实参是否为正确的类型”。

  [2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。

  [2.1]对于非float和double类型的原语类型域,使用==比较;

  [2.2]对于对象引用域,递归调用equals方法;

  [2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;

  [2.4]对于double域,使用Double.doubleToLongBits(adouble) 转换为int,再使用==比较;

  [2.5]对于数组域,调用Arrays.equals方法。

  3.当改写equals()的时候,总是要改写hashCode()

  根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。

  4.设计hashCode()

  [1]把某个非零常数值,例如17,保存在int变量result中;

  [2]对于对象中每一个关键域f(指equals方法中考虑的每一个域):

  [2.1]boolean型,计算(f ? 0 : 1);

  [2.2]byte,char,short型,计算(int);

  [2.3]long型,计算(int) (f ^ (f>>>32));

  [2.4]float型,计算Float.floatToIntBits(afloat);

  [2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];

  [2.6]对象引用,递归调用它的hashCode方法;

  [2.7]数组域,对其中每个元素调用它的hashCode方法。


  [3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;

  [4]返回result。

  
备注:内容来自《Effective Java》一书
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
fengzi2009F
 
(疯子)

等 级:
 #96楼 得分:0回复于:2009-03-29 11:52:42楼主真尽心尽力啊   谢谢!
不知能否加为好友啊!
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
binbinwoaini1
 
(binbinwoaini1)

等 级:
 #97楼 得分:0回复于:2009-03-29 12:09:45不懂
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #98楼 得分:0回复于:2009-03-29 12:33:25引用 93 楼 c8234933 的回复:
我想补充一下 override中方法的返回值可以不相同,JVM在编译的时候不会检查返回值,只会检查方法名和参数,仅靠返回值来区分两个方法是不行的

 

刚起床,感谢大伙儿的支持,
非常感谢这位朋友, 我印象中好像是有怎么说的(重写的方法,方法返回类型可以不同),也一直有疑惑,请知道的朋友再次印证,以便彻底校正
实例:
以下哪两个方法可以加到three中
  class one{
    public one foo(){return this;}
}

  class two extends one{
    public one foo(){return this;}
}
  class three extends two{
  //插入到这
}
---
  A.  public void foo(){}
  B.  public int foo(){return 1;}
  C.  public one foo(){return this;}
  d.  public two foo(){return this;}
  e.  public object foo(){return this;}

  上机验证C,d为正解,  不是很理解,如果重写的方法和返回类型无关,似乎A,B,E都适合??,请高人指点:


 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #99楼 得分:0回复于:2009-03-29 12:35:57引用 96 楼 fengzi2009F 的回复:
楼主真尽心尽力啊  谢谢!
不知能否加为好友啊!

 

欢迎交流,共同学习啊
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
myJavaRoad
 
(置心一处,无事不办)

等 级:
 #100楼 得分:0回复于:2009-03-29 12:45:473.当改写equals()的时候,总是要改写hashCode()

  根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。
--------
多谢啊,明朗多了
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
管理菜单 生成帖子 置顶 推荐 取消推荐 锁定 解锁 移动 编辑 删除 帖子加分 
结  帖 发  帖 回  复 共3页123相关问题
对java中的一些关键的,容易迷惑的知识点总结归纳,请朋友们指正,一同 ... 【整理myJavaRoad技术帖链接】给大家共享一下,对大家有帮助  
公司简介|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持

Copyright ? 1999-2009, CSDN.NET, All Rights Reserved
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值