JavaSE入门级-第八课-常用包
前言
java的包表示管理类的文件夹,jar表示压缩好的java包,所有大多数情况我们是使用别人研发好的java包来支持我们的研发,只有需要的功能没有对应包的时候我们才考虑自己实现,jdk本身就有包括很多的java研发包,所以工具包了解一下
java.lang.*
java基础语言包,所有的类默认导入这个包,所以在使用这个包中的类时可以不用打包名
包装类
java.lang.Integer
对应基本数据类型整型,Integer是类那一定有数据部分,方法部分,和构造器,这是区别于基本数据类型的地方
l 构造:
Integer i= 5; 或 Integer i = new Integer(5);
操作方式和基本数据类型一致
l 方法部分:常用方法

String → int

装箱 拆箱
l 将基本数据类型 或 变量,直接赋值给引用数据类型 是装箱
l 讲引用数据类型 直接赋值给 基本数据类型是装箱
(注意:在jdk1.5之后装箱和拆箱是自动的)
其他包装类
|
基本数据类型 |
对应包装类 |
|
byte |
java.lang.Byte |
|
short |
java.lang.Short |
|
int |
Java.lang.Integer |
|
long |
java.lang.Long |
|
float |
java.lang.Float |
|
double |
java.lang.Double |
|
char |
java.lang.Character |
|
boolean |
java.lang.Boolean |
(注意:包装类的 默认值 是 null)
思考
基本数据类型,和包装类的区别
java.lang.Math
l Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数,提供了大量的静态方法

(提醒:适应面向对象思想,引用调用即可,而且这些代码可能已经被别人做好)
l 我们来看 Math类源码中一段很有趣的注释

练习
l 行李箱密码忘记了,已知行李箱由3位数字[0-9]组成密码,请用程序描述
l 彩票36选7
l 《史记 六十五卷》田忌赛马,齐国将军田忌 与 齐威王比试赛马,双方各有上等马,中等马,下等马,三局两胜,孙膑是田忌的宾客,说 只需要用下等马对王的上等马,上等马对王的中等马,中等马对王的下等马可胜,田忌得王千金
java.lang.String
String代表字符串,老熟人,String类不能被继承因为它是final修饰的
数据部分
String类的数据部分,我们来看一张源码截图:

其实String的数据部分就是 char数组
构造器部分
l 直接创建String:String str = “ABC”;
l 构造器创建 String: String str = new String(“ABC”);
二者的区别在于引用的指向,直接赋值 str 是指向常量池,构造器是执行内存空间
l String构造的问题(难)
l String str = new String(); str 是空字符串

(了解:jdk1.7以后内存已经移动到堆中,不在方法区)
l 两种构造方式比较

l 拼接字符串比较

l intern方法

l 单个注册

l 常量 和 变量

方法部分
l String最常用的方法

l 获得字符串的长度

l 包含字符串 返回 布尔值

l 字符串截取

l 字符串连接

l 查找单个字符

l 大小写转换

l 按照某个字符分割

l 前后去空格

l 万物皆可toString()

equals方法
String类重写了equals方法,原有的equals是Object的方法,比较对象hashcode,String重写后将equals用来比较字符串的具体值
具体代码如下:

(注意:要求会默写)
java.lang.StringBuilder
可变的字符串序列,不同步(线程不安全)
构造器部分

方法部分
l append方法
重载方法,实例方法,对象拼接上一个指定内容
l insert 方法
在指定位置添加一个内容
l delete方法
删除指定位置的一个内容
l toString 方法
最终的结果 转变为 String
java.lang.StringBuffer
StringBuffer 和 StringBuilder 他们的功能基本一样,StringBuffer是同步的(线程安全)在为确认程序的情况下,优先考虑使用StringBuilder ,它的性能比较高
字符串拼接的性能比较
算法优劣性考量可以有两个维度
l 时间复杂度
时间复杂度计算的是语句运行次数,最后可以预估运行算法的时间
l 空间复杂度
空间复杂度是考虑算法消耗的硬件资源
使用一条语句可以判断:

我们可以使用多个时间戳,最后通过差值来判断语句片段的功能

测试的结果:String拼接最慢,StringBuilder最快
java.lang.System
提供一些标准的输入输出,和一些静态对象,及加载文件等操作
静态对象
l in 标准输入流,数据流支持

l out 标准输出流,提供很多打印的方法

l err 标准错误输出流

System.out.println()
早期学习的固定输出语句,原来是调用System这个类的静态对象out,再调用这个对象的println() 方法,将目标输出
(注意:面向对象使用调用就好,不需要深究具体实现)
获得系统当前时间

退出虚拟机

主动清扫垃圾

垃圾回收机制是往后的内容,暂时不说
加载文件
加载文件主要是对native方法有用,在java中对于一些特殊的功能使用java无法实现,必须借助C语言来完成,所以在java中有一些方法声明成为 native 这类方法是本地方法,不是给研发人员调用的,是虚拟机调用的,是使用其他语言实现的方法,实现步骤:
l 声明一个native方法,并用javah编译,生成.class文件 和 .h文件
l 写一个.cpp文件实现native方法,将他们链接在一起
l 在java中使用System.loadLibary();就可以使用native方法
java.lang.Runtime
Runtime类表示运行中的环境,每一个程序都有一个对应的运行环境
方法部分
l gc方法 runFinalization()方法
主动通知垃圾回收机制来回收垃圾
l 其他方法

java.lang.Object
java的顶点类,基类,超类,是所有 类、数组的父类,它表示一种规范,所以有:
Object obj = new 任何类();
把任何类对象赋值给obj一定是合法的(向上转型不需要显示声明)
构造部分
直接无参new
方法部分
Object提供了很多的native方法,如果是native方法只需要考虑功能即可
l getClass 方法

获得一个Class对象,后续章节内容这里不解释
l hashCode 方法

返回对象的 hash码,十进制,我们一般会转换成16进制
hashcode
hashcode也称为哈希码,是一个编码标识,它是用来查找使用的,内存中保存的数据需要被查找才能够使用,《数据结构与算法》一书中提到,如果能简历一个关键码和具体值这样完整的对应关系,那么在查找对象的时候,依赖于对应关系去找关键吗就可以,而这个关系最好是一一对应。
l 假设有数据:(中国一共有34个地区)
|
key |
BEIJING 北京 |
TIANJIN 天津 |
HEBEI 河北 |
SHANXI 山西 |
SHANGHAI 上海 |
SHANDONG 山东 |
FUJIAN 福建 |
|
f1(key) |
02 |
20 |
08 |
19 |
19 |
08 |
06 |
|
f2(key) |
|
|
|
|
|
|
|
|
f3(key) |
|
|
|
|
|
|
|
我们需要提供查找的效率,就需要设置一个对应关系,因为表示往往是简单的
例如:
l 指定对应关系f1,以每个数据首个字母在字母表中的顺序定制hash码
(知识:这种对应关系我们称为 哈希函数)
(注意:哈希函数是灵活的,多样的,但是必须合理,在简易的哈希函数下山西和上海出现了key重复的情况)
l 相同的的key 缺得到了不同的 value,这种现象我们称为冲突,这两个value称为同义词
hash函数的设置最好是能够减少冲突,做到一对一映射
l 指定对应关系2,取头尾两个字母的位置和 再减去 30 为key
l 指定对应关系3,取头尾两个字母的ascii转成10进制
像这样,针对给定数据设置一个“好”的hash函数,所有的hash码我们称为hash表
常见的hash函数有 线性,数表,取余,链式地址,随机数,再哈希
hashcode最终结论
l hashcode 的默认是实现 是根据内存地址进行计算的
l HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的
l 如果两个对象equals相等,那么这两个对象的HashCode一定也相同
l 如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写
l 如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
l equals 方法

判断连个对象的等值关系,经常被重写
l clone 方法

原型模式中使用,可以克隆对象(下文再说)
l toString 方法

Object是基类,所以万物皆可toString,经常被重写
l 其他方法
wait() notify() 和线程相关以后再说
l finalize方法

当对象的被回收,结束生命周期会调用这个方法
java.lang.Objects
jdk1.7 提供的对于Object的工具
方法部分
l 比较两个对象,避免空指针问题

l 对象toString,避免空指针问题

原型 设计模式
使用对象去创建对象,注意要实现接口 Cloneable

浅拷贝
只能够拷贝特定属性值
深度拷贝
对象包含引用类型需要深度拷贝
客户端代码:

简单工厂 设计模式
l 简单工程,根据传入表示的不同获得不同的创建对象


浙公网安备 33010602011771号