day_15Java常用类库

 

 

星期一, 十一月 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

 

 

 

 

猜你喜欢

转载自yuzhouxiner.iteye.com/blog/2257156
今日推荐