我对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. 不知道那些国外的站点是如何处理中文的,请大师们开始啊

注: 以上是个人理解,错漏之处难免,欢迎抓虫
...全文
6593 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
楼主写的挺生动的,谢谢楼主了,学习……
small white rat 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
  • 打赏
  • 举报
回复
多谢楼主~~~
加载更多回复(66)

81,112

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧