J2SE自学(六)——包与Java常用类
1、
如果没有包,把所有类放在一个文件夹下,这样的缺陷有两个:
1)、当类的数目多了不易管理。
2)、不能有两个名字相同的类。
2、包就类似我们操作系统中的文件夹。以前文件少时可以把所有的放在某盘的根目录下,当文件过多时,我们就建立文件夹,把相同类型的文件放在同一个文件夹下。包的道理也是一样的,包的出现是
为了更好的管理类
3、包的作用:
1)、管理类
2)、对封装提供支持
4、在 java 中,我们通过package 关键字声明包,并且包名的首字母都是小写。
5、如果当前类与要使用的类不再同一个包中,应使用import关键字导入。
6、
常常将包名+类名=类的全名7、在开发过程用,使用哪个类就明确导入哪个类!不用用XXXXXX.*来代替!
8、
包的命名规范:反写的企业域名.功能名.模块名9、JAVA 常用包简介:
SUN 还把它们按照功能的不同放在不同的包里,如:
java.lang: java 的核心类库,包含了运行java 程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包
java.lang.reflect:提供用于反射对象的工具
java.io: java 语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出等
java.util:常用的工具类,如集合框架类,日期处理类等。
java.sql: JDBC 相关类。
java.net:JAVA 网络包,其中包含能够使程序通过网络进行通信的
java.awt;javax.swing:使用java 开发C/S 结构应用程序使用的类。
SUN 规定:lang 包中的类可以不用导入而直接使用。 10、包装类:Java中的基本数据类型有8个,则与其对应的8个基本数据类型的有8个类!这8个类就是所谓的包装类。其中值得注意的是char类型对应的包装类不是String类而是Character类
11、
基本数据类型变量只在栈中分配一块内存,而包装类在栈和堆中各占一块。
JAVA 语言是面向对象的语言,但它不是所有的设计思想都符合面向对象的,这里大家要知道java 不符合面向对象的两个地方:一个是JAVA 保留了8 个基本数据类型,他们不是对象,更没有属性和方法;另一个就是JAVA 中存在着main 方法。
既然如此还为什么要有包装类呢?
效率和需求的问题!包装类分配两块内存空间,存放具体数值的数据在堆中,而堆内存的分配比较占用系统资源,而且使用完毕后需要垃圾回收车回收,而我们平时在程序中要大量使用如数字这些变量,他们只做简单的存储,完全没必要使用包装类,那这样不如保留基本数据类型,它在完成功能的同时又不会占用过多的资源, SUN 也是基于这样的考虑保留了JAVA 中的基本数据类型。
12、
自动拆箱与装箱
把数据由基本数据类型转换为对应包装类叫做装箱。
把数据由包装类转化为基本数据类型叫拆箱。
在JDK1.5 前在java 中实现装箱与拆箱的代码如下:
int a = 10;
Integer b;
int c;
//装箱,基本数据类型-->包装类
b = Integer.valueOf(a);
//拆箱,包装类-->基本数据类型
c = b.intValue();
在JDK1.5 中提出的一个新功能就是自动装箱和拆箱,代码如下所示:
int a = 10;
//自动装箱,基本数据类型-->包装类
Integer b = a;
//自动拆箱,包装类-->基本数据类型
int c = b;
13、
把字符串类型转化为数字类型:
1)、可以使用数字类型对应的valueOf()方法
String number = "123" ;
Integer num = Integer.valueOf(number) ;
2)、可以使用parseXXX()方法
String number = "123" ;
Integer num = Integer.parseInt(number) ;
valueOf ()与parseXXX ()是静态方法,通过类名点方法名调用
14、String 类(介绍一些常用的方法,这里要常常看JAVA提供的API说明文档):
1)、.equals(String a) :
以==比较的是两个变量是否指向同一块空间,equals()比较的是指向的两个内存空间的值是否相等,== 为true 的equals()一定为true(指向同一空间,值一定相等),但equals()为true,==不一定为true(两个数值相等,不一定是同一块内存空间),在java 中,我们做字符串比较要使用equals()方法。
==比较的是栈内存,而equals方法比较的是堆内存!
public static void main(String[] args) {
String a = "zhangsan";
String b = "zhangsan";
String c = new String("zhangsan");
System.out.println("(a == b) = " + (a == b));
System.out.println("(a == c) = " + (a == c));
System.out.println("(a.equals(b)) = " + a.equals(b));
System.out.println("(a.equals(c)) = " + a.equals(c));
运行结果:
(a == b) = true
(a == c) = false
(a.equals(b)) = true
(a.equals(c)) = true
这里JAVA 又一个字符串池的概念。就是说它会把所已知的字符串放入字符串池,如果你创建新字符串没有使用new 关键字,如String b = "zhangsan";这行代码,它首先会去字符串池找有没有相同值的字符串,如果有的话就指向它;如果没有的话就会创建新的空间。这里查询时找到了对应的值,所以a 和b 指向了同一块内存空间。而如果使用了new 关键字,如String c = new String("zhangsan");这行代码,它不会去字符串池中寻找而直接创建一份新的内存空间(也就是不管字符串池中有没有,都会直接创建一份新的内存空间)。基于这些,才有上面的运行结果。
2)、.trim():去掉字符串两边的空格。但一些不老实的用户输入的密码旁边有空格(比如上例),这是令人烦恼的,那你可以用这个方法去掉两边的空格(注意此方法并不能去掉中间的空格)
15、
StringBuffer 类
当创建StringBuffer 对象时系统默认分配一定长度的内存,使用append 方法往其中放入字符串,如果放入的字符串超出内存的范围,那么它会自动在其后追加一倍长度的内存,这样前面的内存就可以继续使用,没有浪费。最后使用toString()方法转化为字符串。这样写比用String类不断的追加节省内存空间,同时也提高了一定效率(因为String类是定长的!)。(记住以后再字符串拼接的过程中要StringBuffer类)
还有除去StringBuffer类jdk1.5 开始还提供了一个StringBuilder类,它们之间的区StringBuffer 类的方法是同步的,也就是线程安全的,而StringBuilder 是线程非安全的,但效率较高。