飞翔的起点

从这里出发

导航

<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(5)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜

2009年9月18日 #

Queue

public class QuenDemo {
  public static void main(String[] args){
   //public class Queue extends Collection
   Queue<Integer> queue=new LinkedList<Integer>();
   Random  rand = new Random(47);
   for(int i=0;i<10;i++){
    queue.offer(rand.nextInt(i+10));
   }
   System.out.println("1111"+queue.toString());
   printQ(queue);
   //public class LinkedList extends AbstractSequentialList implements List,Queue,Cloneable,Serializable
   Queue<Character> qc=new LinkedList<Character>();
   for(char c:"guoxzh".toCharArray()){
    qc.offer(c);
    System.out.println("qc=="+qc.toString());
   }
    printQ(qc);
  }
  
  public static void printQ(Queue queue){
   while(queue.peek()!=null){
    //peek和element都是在不移除的情况下返回对头,但是peek在队列为空的情况下返回null,element方法会抛出NoSuchElementException异常
    System.out.println(queue.remove());
    //remove和poll方法都是在移除并返回对头,但是poll在为空时返回null,而remove会抛出NoSucheElementException异常
    System.out.println("2222"+queue.toString());
   }
  }
}

posted @ 2009-10-18 18:29 forgood 阅读(198) | 评论 (0)编辑 收藏

java中的编码方法

package src;

import java.io.UnsupportedEncodingException;

public class ChangeCharset {
  /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
  public static final String US_ASCII = "US-ASCII";

  /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */
  public static final String ISO_8859_1 = "ISO-8859-1";

  /** 8 位 UCS 转换格式 */
  public static final String UTF_8 = "UTF-8";

  /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */
  public static final String UTF_16BE = "UTF-16BE";

  /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */
  public static final String UTF_16LE = "UTF-16LE";

  /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */
  public static final String UTF_16 = "UTF-16";

  /** 中文超大字符集 */
  public static final String GBK = "GBK";

  /**
   * 将字符编码转换成US-ASCII码
   */
  public String toASCII(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, US_ASCII);
  }
  /**
   * 将字符编码转换成ISO-8859-1码
   */
  public String toISO_8859_1(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, ISO_8859_1);
  }
  /**
   * 将字符编码转换成UTF-8码
   */
  public String toUTF_8(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, UTF_8);
  }
  /**
   * 将字符编码转换成UTF-16BE码
   */
  public String toUTF_16BE(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, UTF_16BE);
  }
  /**
   * 将字符编码转换成UTF-16LE码
   */
  public String toUTF_16LE(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, UTF_16LE);
  }
  /**
   * 将字符编码转换成UTF-16码
   */
  public String toUTF_16(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, UTF_16);
  }
  /**
   * 将字符编码转换成GBK码
   */
  public String toGBK(String str) throws UnsupportedEncodingException{
   return this.changeCharset(str, GBK);
  }
 
  /**
   * 字符串编码转换的实现方法
   * @param str  待转换编码的字符串
   * @param newCharset 目标编码
   * @return
   * @throws UnsupportedEncodingException
   */
  public String changeCharset(String str, String newCharset)
    throws UnsupportedEncodingException {
   if (str != null) {
    //用默认字符编码解码字符串。
    byte[] bs = str.getBytes();
    //用新的字符编码生成字符串
    return new String(bs, newCharset);
   }
   return null;
  }
  /**
   * 字符串编码转换的实现方法
   * @param str  待转换编码的字符串
   * @param oldCharset 原编码
   * @param newCharset 目标编码
   * @return
   * @throws UnsupportedEncodingException
   */
  public String changeCharset(String str, String oldCharset, String newCharset)
    throws UnsupportedEncodingException {
   if (str != null) {
    //用旧的字符编码解码字符串。解码可能会出现异常。
    byte[] bs = str.getBytes(oldCharset);
    //用新的字符编码生成字符串
    return new String(bs, newCharset);
   }
   return null;
  }

  public static void main(String[] args) throws UnsupportedEncodingException {
   ChangeCharset test = new ChangeCharset();
   String str = "This is a 中文的 String!";
   System.out.println("str: " + str);
   String gbk = test.toGBK(str);
   System.out.println("转换成GBK码: " + gbk);
   System.out.println();
   String ascii = test.toASCII(str);
   System.out.println("转换成US-ASCII码: " + ascii);
   gbk = test.changeCharset(ascii,ChangeCharset.US_ASCII, ChangeCharset.GBK);
   System.out.println("再把ASCII码的字符串转换成GBK码: " + gbk);
   System.out.println();
   String iso88591 = test.toISO_8859_1(str);
   System.out.println("转换成ISO-8859-1码: " + iso88591);
   gbk = test.changeCharset(iso88591,ChangeCharset.ISO_8859_1, ChangeCharset.GBK);
   System.out.println("再把ISO-8859-1码的字符串转换成GBK码: " + gbk);
   System.out.println();
   String utf8 = test.toUTF_8(str);
   System.out.println("转换成UTF-8码: " + utf8);
   gbk = test.changeCharset(utf8,ChangeCharset.UTF_8, ChangeCharset.GBK);
   System.out.println("再把UTF-8码的字符串转换成GBK码: " + gbk);
   System.out.println();
   String utf16be = test.toUTF_16BE(str);
   System.out.println("转换成UTF-16BE码:" + utf16be);
   gbk = test.changeCharset(utf16be,ChangeCharset.UTF_16BE, ChangeCharset.GBK);
   System.out.println("再把UTF-16BE码的字符串转换成GBK码: " + gbk);
  }
}

posted @ 2009-09-23 14:25 forgood 阅读(288) | 评论 (0)编辑 收藏

byte数组和String之间的转化

JAVA里面关于byte数组和String之间的转换问题

把byte转化成string,必须经过编码

例如下面一个例子:

import java.io.UnsupportedEncodingException;

public class test{
 public static void main(String g[]) {
  String s = "12345abcd";
  byte b[] = s.getBytes();
  String t = b.toString();

  System.out.println(t);

 }
}
输出字符串的结果和字符串s不一样了.

经过以下方式转码就可以正确转换了:

public class test{
 public static void main(String g[]) {
  String s = "12345abcd";
  byte b[] = s.getBytes();
  try {
   String t = new String(b);
   System.out.print(t);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

引用:
String   str   =   "String"; 
          byte[]   byte1   =   str.getBytes(); 
          String   str1   =   new   String(byte1); 
          byte[]   byte2   =   str1.getBytes(); 
          String   str2   =   new   String(byte2); 
          System.out.println("str<<<"   +   str); 
          System.out.println("byte1<<<"   +   byte1); 
          System.out.println("str1<<<"   +   str1); 
          System.out.println("byte2<<<"   +   byte2); 
          System.out.println("str2<<<"   +   str2); 
  ------------------------------------- 
  输出结果 
  str<<<String 
  byte1<<<[B@192d342 
  str1<<<String 
  byte2<<<[B@6b97fd 
  str2<<<String 
  
  想请教为什么两个byte输出的不一样呢? 
 

String   str   =   "String"; 
          byte[]   byte1   =   str.getBytes(); 
          String   str1   =   new   String(byte1); 
          byte[]   byte2   =   str1.getBytes(); 
  ---------- 
  注意byte1是str得到的byte数组,而byte2是另一个字符串str1得到的数组 
  他们本身也是两个对象  
   
  直接打印实际上调用的是toString()方法,而toString()的默认实现是打印对象类型+hashCode()  
  [B表示byte数组  @表示之后的是地址  后面跟着的是hashCode,其实就是其虚拟机地址  
  

posted @ 2009-09-23 14:19 forgood 阅读(3051) | 评论 (0)编辑 收藏

jvm的内存模型

从大的方面来讲,JVM的内存模型分为两大块:

 

永久区内存( Permanent space)和堆内存(heap space)。

 

栈内存(stack space)一般都不归在JVM内存模型中,因为栈内存属于线程级别。

每个线程都有个独立的栈内存空间。

 

Permanent space里存放加载的Class类级对象如class本身,methodfield等等。

heap space主要存放对象实例和数组。

heap spaceOld GenerationNewGeneration组成,OldGeneration存放生命周期长久的实例对象,而新的对象实例一般放在NewGeneration

New Generation还可以再分为Eden(圣经中的伊甸园)、和Survivor区,新的对象实例总是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,可以向Old区转移活动的对象实例。

 

一般,我们常见的OOMout of memory)内存溢出异常,就是堆内存空间不足以存放新对象实例时导致。

 

永久区内存溢出相对少见,一般是由于需要加载海量的Class数据,超过了非堆内存的容量导致。通常出现在Web应用刚刚启动时,因此Web应用推荐使用预加载机制,方便在部署时就发现并解决该问题。

 

栈内存也会溢出,但是更加少见。

 

堆内存优化:

调整JVM启动参数-Xms  -Xmx   -XX:newSize -XX:MaxNewSize,如调整初始堆内存和最大对内存 -Xms256M -Xmx512M。 或者调整初始New Generation的初始内存和最大内存-XX:newSize=128M -XX:MaxNewSize=128M

 

永久区内存优化:

调整PermSize参数   如  -XX:PermSize=256M-XX:MaxPermSize=512M

 

栈内存优化:

调整每个线程的栈内存容量  如  -Xss2048K

 

 

最终,一个运行中的JVM所占的内存堆内存  +  永久区内存  +  所有线程所占的栈内存总和 

posted @ 2009-09-18 09:12 forgood 阅读(283) | 评论 (0)编辑 收藏