我对java中的编码,类加载,类路径查找,集合等机制的理解,欢迎朋友们批评指正!

myJavaRoad 2009-03-31 11:31:52
加精
【声明】: 标题某些内容另一帖发出,可能缘于那个帖有点长,朋友们对这几个问题互动不多,今整理后发在此,诚请朋友们提出批评:

一,我对java中编码的理解
1. 编码的产生
对电脑而言,只认识0,1; 而现实世界是由各种符合组成,要想让计算机解释现实世界,就必须建立一套现实世界中的符号 和 计算机能处理的符号之间的对应关系,这个对应关系就是编码

2. 在一个编辑器中,当我们在键盘上敲入一个字符时,在该编辑器上就会显示对应的字符,这个过程用计算机执行步骤来解释大致如下:
输入字符 –> 编辑器根据设定的编码格式把字符编成01格式 -> 编辑器再按编码规则对01解码–> 显示字符

3.几种常见的编码格式
1. ASCII码:
计算机中最早的一套编码格式,采用7位二进制表示一个常见的字符,我们知道,计算机是按照字节来处理数据的,一个字节8位,因此用一个字节就可以表示一个ASCII字符,且还有一个位空位,规定最高位不用,常见的把最高位设定为0。 7位二进制最多可以表示128个字符(2的7次方),ASCII码只能表示常见的英文字符,数字,和少量的符号(没办法,谁让计算机是人家老美先发明的啊,优先考虑本土语言,理解理解)
注: 由于ASCII最早定义,使用广泛,使得之后出现的新的”字符“(不是汉字喔)编码都尽量和它兼容

2. iso-8859-1:
尽管ASCII应用广泛,但是由于它定义的字符太少,即使对于同是使用字母语言的国家也不够用,更别说我们汉字啦,西欧许多国家使用拉丁语言,其中的很多字符ASCII编码都不认识喔,这当然会让它们不爽啦,总不能因为这个问题让那些国家的人不使用电脑吧, 于是ISO/IEC就推出了另外的一套编码标准ISO-8859-1. 这套标准完全和ASCII兼容,它使用8位二进制表示一个字符 —--- 刚好一个字节,其中最高位是0时的解释和ASCII一样(这样不就完全兼容啦,兼容很好理解吧),但最高位是1时则用于定义其它字符,这样就在保证和ASCII兼容的同时又扩展了ASCII,可以多表示字符啦

3. GBK编码
光有字母语言国家的编码就可以么?, 可以啊,好好学习英语啊, 要不你看不懂啊,不想学?,那就不玩啊,呵呵,当然不会啦,对于中国,韩国,日本等这些国家,推出了一种新的编码GBK码, 在编码上GBK采用单双字节混合的方式,它也兼容ASCII喔,具体GBK怎么个编码,你查看资料啦, 这里重点关注的是编码的演化,提供的是思路哈

4. Unicode
Unicode是为了打破这种编码的各自为政,带有强烈地域性的标示而推出的一种编码格式,目的是要达到世界的大同,大同好啊,方便交流啊,就是晚了点,计算机一出现就出来多好,就没了现在让程序员头疼的编码转来转去的麻烦了,恩,看来有界限的人心是会带来麻烦的,好了,啰嗦了这么多,才算真正引入正题,为什么会出现乱码,如何解决乱码

4. 揭示web中乱码的病因
比如说现在有两个人,张三 和 make分别来自中国和美国,现在他们访问同一台j2ee服务器,他们都向服务器发送了一条消息
张三: 嗨,我是张三
Make: hello, I’m make
假如张三发送的信息采用的编码格式是GBK, make的是ASCII, 对于浏览器而言,留言器没有把发送的信息采用的编码格式告诉给web服务器(之前的浏览器没提供这个功能,又是地域性的见识啊,现在最新版的不知道有没有),web服务器不知道你发过来的信息编码格式啊,怎么解释呢,没办法只好提供个默认的吧,恩还是用iso-8859-1吧(毕竟java也是老美搞出的啊,没办法),英语的没问题,web服务器能听懂,毕竟大家都说英语嘛,并且make对web服务器而言,懂得字母还少了点呢; 汉语的就不行了,就好比一个人只懂汉语,另一个人只懂英语,怎么交流啊,可以交流?那就只好”~!@#¥%“, 这就是java中乱码的病因吧

5. 如何避免乱码的产生
知道了病因,对症下药就好啦,
1. 让浏览器明确指定信息的编码格式, 这个不行啦,程序员干涉不了啦,这不是你的问题啦,不知道现在的浏览器是否已提供这种机制啊,请知道的朋友明示:?
2. 明确采用GBK编码处理请求的数据啊
3. 因为一般的浏览器可以解析多种编码格式,我们的web响应内容,最好指定编码格式喔,这个大家都知道啦
4. 不知道那些国外的站点是如何处理中文的,请大师们开始啊

注: 以上是个人理解,错漏之处难免,欢迎抓虫
...全文
6271 6 收藏 88
写回复
88 条回复
jackson_fighting 2012年09月21日
以后抽空,再来看,看多了头疼。
回复 点赞
jackson_fighting 2012年09月21日
[Quote=引用 61 楼 的回复:]

GBK 只是中国的,跟韩国、日本一点关系都没有的哦。

使用 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 可以告诉浏览器采用 UTF-8 编码格式进行显示。
[/Quote]

关于编码问题,楼主可参考jre\lib\charset.jar
sun.nio.cs.ext下面。GBK :汉字内码扩展规范
台湾使用的BIG5 大五码
回复 点赞
jackson_fighting 2012年09月21日
但是ExtClassLoader的Parent为 null 是怎么回事呵,朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null


bootstrap classloader -引导(也称为原始)类加载器,
这个加载器的是非常特殊的,它实际上不是java.lang.ClassLoader的子类, 而是由JVM自身实现的。
-----------------------------------------

楼主说:
把以上代码存到d:\my 文件夹下,直接编译,然后在dos模式下运行
D:\my\java Test
。。。AppClassLoader。。。
。。。ExtClassLoader。。。
Null
详细一点:位于jre/lib/rt.jar下面
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
-------------------------------------
实际上 java 虚拟机是由 java luncher
初始化的, 也就是 java (或 java.exe)这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
1, 系统类: 组成 java 平台的类, 包含 rt.jar等类.
2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)?
中的 .jar 档案包.
3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品.

java文件的编译和Class的载入执行,都是使用Launcher
初始化的system classloader作为类载入器的,
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
//CLASSPATH中指定这些类库,因为JVM在启动的时候就自动加载它们了
System.out.println(urls[i].toExternalForm());
}

楼主的帖子写得不错! 学习

回复 点赞
haitunwanhaitunwan 2012年08月09日
Import com.*; 
Import edu.*;
Public class Main{
Public static void main(string[] args){
CA ca = new CA();
}
}
回复 点赞
蓝色小棉袄 2012年04月19日
楼主写的挺生动的,谢谢楼主了,学习……
回复 点赞
JohnnyHuang_ 2012年03月17日
表示同感,自己经验不够,在学者总结。。以后出去工作了一定也多发发文章[Quote=引用 8 楼 mike_24 的回复:]
哇,学习了.我从来就没有总结过.总是看别人的总结^_^
[/Quote]
回复 点赞
丙寅 2011年12月31日
楼主写这个也要不少时间啊
回复 点赞
q9516511 2011年07月24日
学习一下
回复 点赞
oklinsong 2011年07月21日
谢谢楼主,以前这些概念都只是有个印象,看了你的文章,更加清晰了!好文章!!!!
回复 点赞
seojava 2011年05月04日
受教了 。
回复 点赞
没有蚊子 2011年02月11日
尺了两年的支持……
回复 点赞
tangqang19880405 2010年07月17日
学习了
回复 点赞
BUY 2009年09月18日
向楼主学习
回复 点赞
yuys168 2009年08月15日
xue
回复 点赞
xiesonglin 2009年07月17日
呵呵 我觉得很好!
回复 点赞
myJavaRoad 2009年04月09日
谢谢朋友们的留言,
今天看了看,汗啊, 很多言词不通,可能是文字太多了吧,写的草率了点(安慰自己),请朋友们别太介意
-------------
楼主是强人,能否透漏一下今年贵庚,做什么工作啊,小弟是大三的,佩服五体投地啊,通俗易懂,解我惑啊!!!

- 呵呵,共同学习



回复 点赞
lee_student 2009年04月09日
楼主是强人,能否透漏一下今年贵庚,做什么工作啊,小弟是大三的,佩服五体投地啊,通俗易懂,解我惑啊!!!
回复 点赞
tanxiaoguoguo 2009年04月08日
支持,向各位学习!
回复 点赞
mengweilil 2009年04月07日
不厚道的说:老外有叫make的吗?
回复 点赞
SheLiZi 2009年04月07日
多谢楼主~~~
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告