?
?
星期一, 十一月 16, 2015 10:09:18
?
?
存储类的仓库---Java常用类库
?
? ? ? ? Java类库就是Java API (应用程序接口),是系统提供的已实现的标准类的集合,
使用Java类库可以完成涉及字符串处理、图形、网络等多方面的操作。
?
掌握Java类库的相关概念
System类和Runtime类
熟悉Math和Random类
了解对象克隆相关知识
?
一、API相关概念
?
应用程序编程接口
提供一些控制机器人的Java类(含有操作机器人的各种动作的方法),
只需要为每个机器人安排一个类的实例对象,再调用这个对象的各种方法,
机器人就会去执行各种动作。
?
这个Java类就是机器人厂家提供的应用程序编程的接口。
?
二、String类和StringBuffer类
?
2.1 ? String
String类的字符用于比较两个字符串,查找和抽取中的字符或子串,进行字符串与其他类型之间的相互转换等。
String类对象的内容一旦被初始化就不能再改变。
?
?
?
2.2 ? StringButter
StringButter类用于内容可以改变的字符串,可以将其他各种类型的数据增加、插入到字符串中,也可以转置字符串中原来的内容。
?
在StringBuffer.toString()方法将其转换成String--->就可以使用String类的各种方法。
?
“+”操作符的功能是通过StringBuffer类和它的append方法实现的。
?
注意:
? ? ? ? 在实际的开发中,如果需要频繁改变字符串的内容,就要考虑用StringBuffer类实现,因为其内容可以改变,所以执行性能比String类更高。
?
三.基本数据类型的包装类
?
3.1从JDK中-->Java中的很多类的很多方法的参数类型都是Object,
?
3.2Java中的基本数据类型8中对应的基本数据类型的包装类也有8种
?
3.3如何去使用包装类
代码案例:
package day15;
?
public class IntegerTest {
public static void main(String[] args) {
String s = "123";
//使用包装类:将字符串转换成基本数据类型
int i = Integer.parseInt(s);
i=i+1;
System.out.print(i);
}
}
运行结果:
124
?
?
四.System类 与 Runtime类
?
4.1 System类
?
?Java不支持全局方法和变量,Java设计者将一些系统相关的重要方法和变量收集到了一个统一的类中,是System类。
?
代码案例:
?
打印环境变量的属性和值
?
package day15;
?
import java.util.Enumeration;
import java.util.Properties;
?
public class SystemTest {
public static void main(String[] args) {
?
/*public class Propertiesextends Hashtable<Object,Object>
* Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
* 属性列表中每个键及其对应值都是一个字符串。 */
?
Properties p = System.getProperties(); ?//getProperties() 确定当前的系统属性
Enumeration e = p.propertyNames(); ?//接口 Enumeration<E>
while(e.hasMoreElements()) { ? //hasMoreElements() 测试此枚举是否包含更多的元素。
String key = (String)(e.nextElement());//如果此枚举对象至少还一个可提供的元素,则返回此枚举的下一个元素
System.out.println(key+" = "+p.getProperty(key));
}
}
}
运行结果:
java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = C:\Users\Administrator\AppData\Local\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin
java.vm.version = 11.3-b02
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
......
?
注意:
? ? 此案例有疑问,
? ? Properties p = System.getProperties(); ?//getProperties() 确定当前的系统属性
? ? Enumeration e = p.propertyNames(); ?//接口 Enumeration<E>
?
?
设置新的系统环境变量
格式:
java -DAuthor=lxh SystemInfo
?
4.2 Runtime类
?
4.2.1
Runtime类封装了Java命令本身的运行过程,其中的许多方法与System中的方法重复。
不能直接创建Runtime实例,但可以通过静态方法Runtime.getRuntime获得正在运行的Runtime对象的引用。
?
?
4.2.2 代码案例
package day15;
?
public class RuntimeTest {
public static void main(String[] args) {
?
Runtime rt = Runtime.getRuntime();
?
try{
rt.exec("notepad.exe");
}catch(Exception e){
e.printStackTrace();
}
}
}
运行结果:
打开 notepad.exe程序
?
五.Date 与Calendar、DateFormat类
?
5.1
? ? ? ?应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。?
?
5.2 Calendar代码案例
?
package day15;
?
import java.util.Calendar;
?
public class CalendarTest {
public static void main(String[] args) {
Calendar cd = Calendar.getInstance();//使用默认时区和语言环境获得一个日历。
//打印当前时间,注意:calendar里月份是0-11, 11月输出的是10
System.out.println(cd.get(cd.YEAR)+" ? "+cd.get(cd.MONTH)+" ?"+cd.get(cd.DAY_OF_MONTH)+
" ?"+cd.get(cd.HOUR)+" ?"+cd.get(cd.MINUTE)+" "+cd.get(cd.SECOND) );
//增加230天
cd.add(cd.DAY_OF_YEAR, 230);
//输出增加后的日期
System.out.print(cd.get(cd.YEAR)+" ? "+cd.get(cd.MONTH)+" ?"+cd.get(cd.DAY_OF_MONTH)+
" ?"+cd.get(cd.HOUR)+" ?"+cd.get(cd.MINUTE)+" "+cd.get(cd.SECOND) );
}
}
?
运行结果:
2015 ? 10 ?16 ?11 ?56 12
2016 ? 6 ?3 ?11 ?56 12
?
?
星期一, 十一月 16, 2015 12:22:54
?
5.2更改日期字符串
?
SimpleDateFormat 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。
?
SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动。
?
代码案例:
package day15;
?
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
?
public class CalendarTest {
public static void main(String[] args) {
?
?
/*DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。*/
?
?
SimpleDateFormat myf1 = new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat myf3 = new SimpleDateFormat("yyyy年MM月dd日 hh点mm分ss秒");
SimpleDateFormat myf4 = new SimpleDateFormat("yyyy.MM.dd G ‘at‘ HH:mm:ss z");
/*获取当前的时间方法1.System.currentTimeMillis()效率高些
* 2.Calendar.getInstance().getTimeInMillis()*/
long d = System.currentTimeMillis();
/*long d = Calendar.getInstance().getTimeInMillis();*/
//将当前获得的日期进行格式化
System.out.println(myf1.format(new Date(d)));
System.out.println(myf2.format(new Date(d)));
System.out.println(myf3.format(new Date(d)));
System.out.println(myf4.format(new Date(d)));
/*long d1 = System.currentTimeMillis();
System.out.print(myf1.format(d1));*/
?
}
}
?
运行结果:
15/11/16 14:59
2015-11-16 02:59:37
2015年11月16日 02点59分37秒
2015.11.16 公元 at 14:59:37 CST
?
注意:
new Date()没有完成案例....
?
?
六、Math与Random类
?
6.1Math类
?
6.2Random类
代码案例:
利用Random类来产生5个0~100之间的随机整数
?
java.util.Random 类
?
?nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
?
package day15;
?
import java.util.Random;
?
public class RandomTest {
public static void main(String[] args) {
//
Random r1 = new Random();
for (int i=0;i<5;i++) {
//nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
System.out.print(r1.nextInt(100)+"\t");
}
}
}
运行结果:
4079649333
?
七、hashCode
?
Object 中的public int hashCode(){}
?
含义:
? ? 在用于存取散列表的时候使用。
?
7.1作用:
?
返回该对象的哈希码值。
支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
?
hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
?
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次
?
---
运行这个程序,应该输出“张三”,但它实际上返回了一个null值,原因是因为没有改写一个hashCode()方法。
?
?
---写了hashcode()
?
7.2 代码案例:
?
package day15;
?
import java.util.HashMap;
?
public class HashCodeTest {
public static void main(String[] args) {
HashMap hm = new HashMap();
/*public V put(K key,V value)在此映射中关联指定值与指定键。*/
hm.put(new Person("waxun",18), "yuzhou");
/*public V get(Object key)返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。 */
System.out.print(hm.get(new Person("waxun",18)));
?
}
}
?
class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
?
public String toString (){
return "name = "+this.name+" age="+this.age;
}
?
public boolean equals(Object o) {
return true;
}
?
public int hashCode(){
return 20;
}
}
?
?
运行结果:
yuzhou
?
注意:
?
在用于存取散列表的时候使用。
但上面的程序存在一个问题,就是所有的Person类的对象都拥有同一个散列码,这样在实际中是不可取的。
而散列码的取得,也是根据实际的情况而计算出来的,
==保证不同的对象有不同的散列码即可。
?
星期一, 十一月 16, 2015 19:34:26
?
?星期一, 十一月 16, 2015 21:02:08
?
八、对象的克隆
?
? ? ? ? 对象克隆为什么需要克隆???
?
? ? ? 在实际编程过程中,我们常常要遇到这种情况:一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。
?
?
8.1.对象克隆
?
实际上是指将对象重新复制一份
?
涉及:
java.lang.Object clone()?
? ? ? ? ? 创建并返回此对象的一个副本。
protected Object clone()throws CloneNotSupportedException
此实例的一个副本。此方法执行的是该对象的“浅表复制
?
java.lang接口 Cloneable
?
?
8.2实现clone方法的步骤()
(1)实现Cloneable接口
(2)重载Object类中的clone()方法,重载时需定义为public
(3)在重载方法中,调用super.clone()
?
----改写Object类中的clone()方法
因为protected Object clone()throws CloneNotSupportedException为protect修饰,
这种对用户不可见,所以要改写,变为public
?
?
8.3代码案例:
package day15;
?
public class CloneTest {
public static void main(String[] args){
Employee e1 = new Employee("宇宙",22);
@SuppressWarnings("unused")
Employee e2 = null;
try {
e2 = (Employee) e1.clone() ;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
e2.setName("瓦询");
e2.setAge(24);
System.out.println("两个对象的内存地址的比较"+(e1==e2));
System.out.println(e1);
System.out.println(e2);
}
}
?
class Employee implements Cloneable {
?
/*alt+shift+s快速生成method*/
private String name;
private int age;
?
public Employee(String name,int age) {
this.name = name;
this.age = age;
}
/*重载Object类中的clone()方法,重载时需定义为public*/
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
?
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名: "+this.name+" ?年龄: "+this.age;
}
?
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
?
?
?
}
运行结果:
两个对象的内存地址的比较false
姓名: 宇宙 ?年龄: 22
姓名: 瓦询 ?年龄: 24
?
?
浅度克隆 和深度克隆
参考:不错~~
http://blog.csdn.net/edward_qing_lee/article/details/8249102
?
星期一, 十一月 16, 2015 22:00:27
?
?
?
?
原文:http://yuzhouxiner.iteye.com/blog/2257156