【Java系列-3】Java常用类库_简介

一、Java常用类库

下面是学习过程中的笔记,用于记录常见的java类库的使用:

 

类路径

常用方法

方法说明

StringBuffer类  

 

java.lang.StringBuffer:

new StringBuffer("yootk").append() //字符串追加

new StringBuffer("yootk").insert(0, "s") //字符串插入

new StringBuffer("yootk").delete(5, 11) //删除子串

new StringBuffer("yootk").replace(0, 1,"12") //替换子串

new StringBuffer("yootk").IndexOf("0") //查询子串的第一个索引

new StringBuffer("yootk").lastIndexOf("0") //查询子串最后一个的索引

new StringBuffer("yootk").substring(m,n) //返回索引mn范围内的子串

new StringBuffer("yootk").charAt(2) //返回索引的单个字符

new StringBuffer("yootk").reverse().toString() //字符串反转

new StringBuffer("yootk").length() //方法返回字符串长度

"yootk".contentEquals(new StringBuffer("yootk")) //String与StringBuffer比较

CharSequence seq = "www.yootk.com";      //CharSequence向上转型

 @since   JDK1.0

特点:动态字符串,速度慢,线程安全

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

 

StringBuffer中的方法都是同步方法:线程安全

@Override

public synchronized StringBuffer append(int i) {

        toStringCache = null;

        super.append(i);

        return this;

}

 

StringBuilder类 

java.lang.StringBuilder:

new StringBuilder("yootk").append() //字符串追加

new StringBuilder("yootk").insert(0, "s") //字符串插入

new StringBuilder("yootk").delete(5, 11) //删除子串

new StringBuilder("yootk").replace(0, 1,"12") //替换子串

new StringBuilder("yootk").IndexOf("0") //查询子串的第一个索引

new StringBuilder("yootk").lastIndexOf("0") //查询子串最后一个的索引

new StringBuilder("yootk").substring(m,n) //返回索引mn范围内的子串

new StringBuilder("yootk").charAt(2) //返回索引的单个字符

new StringBuilder("yootk").reverse().toString() //字符串反转

new StringBuilder("yootk").length() //方法返回字符串长度

"yootk".contentEquals(new StringBuilder("yootk")) //String与StringBuilder比较

CharSequence seq = "www.yootk.com";      //CharSequence向上转型

@since      JDK 1.5

特点:动态字符串,速度快,线程不安全,方法比StringBuffer少

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

 

StringBuilder中的方法都是普通方法:线程不安全

@Override

    public StringBuilder append(boolean b) {

        super.append(b);

        return this;

}

Runtime类   

 java.lang.Runtime

Runtime.getRuntime().maxMemory() //取得最大可用内存

Runtime.getRuntime().totalMemory()//取得最大可用内存

Runtime.getRuntime().freeMemory()//取得最大可用内存

Runtime.getRuntime().availableProcessors()//取得最大可用内存

Process runtime=Runtime.getRuntime().exec("calc");//执行命令,启动Windows的计算器

Runtime.getRuntime().gc();//建议JVM进行GC操作,实际的GC操作无法通过命令控制

@since   JDK1.0

特点:饿汉式单列设计模式实现,唯一实例,线程安全

源码:饿汉式单利线程安全,懒汉式线程不安全

public class Runtime {

    private static Runtime currentRuntime = new Runtime();

    private Runtime() {}

    public static Runtime getRuntime() {

        return currentRuntime;

    }

}

 

懒汉式,懒加载,线程不安全(public的创建实例方法,可能不止一个实例)

public class Runtime {

    private static Runtime currentRuntime;

    private Runtime() {}

    public static Runtime getRuntime() {

If(currentRuntime==null){

              currentRuntime=new new Runtime() ;

}

return currentRuntime;

}

 

 

Runtime are instance and must be invoked with respect to the current runtime object. the Runtime object associated with the current Java application. public static Runtime getRuntime() { return currentRuntime; /** Don 't let anyone else instantiate this class */ private Runtime() -1} " v:shapes="Picture_x0020_1">

Runtime:运行时,是一个封装了JVM的类。每一个JAVA程序实际上都是启动了一个JVM进程,每一个JVM进程都对应一个Runtime实例,此实例是由JVM为其实例化的。所以我们不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。

 

(1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

 

(2) 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

 

(3) 垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,当一个对象不再被引用的时候,按照特定的垃圾收集算法来实现资源自动回收的功能。

 

(4) System.gc();就是呼叫java虚拟机的垃圾回收器运行回收内存的垃圾。

 

(5) 当不存在对一个对象的引用时,我们就假定不再需要那个对象,那个对象所占有的存储单元可以被收回,可通过System.gc()方法回收,但一般要把不再引用的对象标志为null为佳。

 

(6) 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 Runtime.getRuntime().gc();

 

(7) java.lang.System.gc()只是java.lang.Runtime.getRuntime().gc()的简写,两者的行为没有任何不同。

 

(8) 唯一的区别就是System.gc()写起来比Runtime.getRuntime().gc()简单点. 其实基本没什么机会用得到这个命令, 因为这个命令只是建议JVM安排GC运行, 还有可能完全被拒绝。 GC本身是会周期性的自动运行的,由JVM决定运行的时机,而且现在的版本有多种更智能的模式可以选择,还会根据运行的机器自动去做选择,就算真的有性能上的需求,也应该去对GC的运行机制进行微调,而不是通过使用这个命令来实现性能的优化。

 

 System类 

 

public static void exit(int status)  系统退出 ,如果status为0就表示退出。

public static void gc()   运行垃圾收集机制,调用的是Runtime类中的gc方法。

public static long currentTimeMillis()  返回以毫秒为单位的当前时间。

public static native void arraycopy() //数组拷贝操作

public static Properties getProperties() 取得当前系统的全部属性。

public static String  getProperty(String key) 根据键值取得属性的具体内容。

 

字段

public final static InputStream in;//标准输入流

public final static PrintStream out;//标准输出流

public final static PrintStream err;//标准错误流

 

@since   JDK1.0

特点:public final 类,无法继承。变量定义标准的in,out,err流。

 System类是一些与系统相关的属性和方法的集合,而且在System类中所有的属性都是静态的,要想引用这些属性和方法,直接使用System类调用即可。

 

getProperty(String key) 在参数中输入键的字符串获取系统的属性。

相关值的描述

java.version

Java 运行时环境版本

java.vendor

Java运行时环境供应商

java.vendor.url

Java 供应商的 URL

java.home

Java 安装目录

java.vm.specification.version

Java 虚拟机规范版本

java.vm.specification.vendor

Java 虚拟机规范供应商

java.vm.specification.name

Java 虚拟机规范名称

java.vm.version

Java 虚拟机实现版本

java.vm.vendor

Java 虚拟机实现供应商

java.vm.name

Java 虚拟机实现名称

java.specification.version

Java 运行时环境规范版本

java.specification.vendor

Java 运行时环境规范供应商

java.specification.name

Java 运行时环境规范名称

java.class.version

Java 类格式版本号

java.class.path

Java 类路径

java.library.path

加载库时搜索的路径列表

java.io.tmpdir

默认的临时文件路径

java.compiler

要使用的 JIT 编译器的名称

java.ext.dirs

一个或多个扩展目录的路径

os.name

操作系统的名称

os.arch

操作系统的架构

os.version

操作系统的版本

file.separator

文件分隔符(在 UNIX 系统中是“/”)

path.separator

路径分隔符(在 UNIX 系统中是“:”)

line.separator

行分隔符(在 UNIX 系统中是“/n”)

user.name

用户的账户名称

user.home

用户的主目录

user.dir

用户的当前工作目录

 

 Cloneable接口

Java.lang.Cloneable

参考文章:【Java系列-5】Java中的深复制和浅复制

class CloneClass implements Cloneable{

 public int aInt;

 public Object clone(){

  CloneClass o = null;

  try{

   o = (CloneClass)super.clone();

  }catch(CloneNotSupportedException e){

   e.printStackTrace();

  }

  return o;

 }

 

##############################

下面举一个例子说明浅拷贝和深拷贝:

public class ShallowCopy implements Cloneable{

     private Date begin;

     public Date getBegin(){return this.begin;}

     public void setBegin(Date d){this.begin=d;}

     public Object clone(){

 Object obj=null;

        try

 {

  obj=super.clone();

  }

        catch (CloneNotSupportedException ex) {

        ex.printStackTrace();

     }

 return obj;

     }

}

############################

public class DeepCopy implements Cloneable{

 private Date begin;

     public Date getBegin(){return this.begin;}

     public void setBegin(Date d){this.begin=d;}

     public Object clone(){

 DeepCopy obj=null;

 try

 {

  obj=(DeepCopy)super.clone();

  }

        catch (CloneNotSupportedException ex) {

        ex.printStackTrace();

     }

 obj.setBegin((Date)this.getBegin().clone());

 return obj;

    }

}

 

@since   JDK1.0

特点:纯接口,无任何抽象方法但是任何重写clone方法的类必须实现cloneable接口。

Java 中 一个类要实现clone功能 必须实现 Cloneable接口,否则在调用 clone() 时会报 CloneNotSupportedException 异常。

Java中所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone(),这个方法将返回Object对象的一个拷贝。

要说明的有两点:

    一是拷贝对象返回的是一个新对象,而不是一个引用;

    二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。

    如果一个类重写了 Object 内定义的 clone()方法 ,需要同时实现 Cloneable 接口(虽然这个接口内并没有定义 clone() 方法),否则会抛出异常,也就是说, Cloneable 接口只是个合法调用 clone() 的标识。

 

有三个值得注意的地方:

    一是为了实现clone功能,CloneClass类实现了Cloneable接口,这个接口属于java.lang 包,java.lang包已经被缺省的导入类中,所以不需要写成java.lang.Cloneable;

    二是重载了clone()方 法;

    三是在clone()方法中调用了super.clone(),这也意味着无论clone类的继承结构是什么样的,super.clone()直接或 间接调用了java.lang.Object类的clone()方法。

    Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于java中的非native方法。这也解释了为 什么要用Object中clone()方法而不是先new一个对象,然后把原始对象中的信息赋到新对象中,虽然这也实现了clone功能,但效率较低。

    Object类中的clone()方法还是一个protected属性的方法。这也意味着如果要应用clone()方法,必须继承Object类,在 Java中所有的类是缺省继承Object类的,也就不用关心这点了。然后重载clone()方法。还有一点要考虑的是为了让其它类能调用这个clone 类的clone()方法,重载之后要把clone()方法的属性设置为public。

Math.round

 java.lang.Math.round()

Math.round(15.5)//16.正整数【0.5,1)进1

Math.round(-15.5)//-15 负整数0.5不进1,

Math.round(-15.51)//-16 负整数超过0.5进1

Math.round方法举例:

Case1:小数点后第一位 = 5

          正数:Math.round(11.5) = 12

          负数:Math.round(-11.5) = -11

Case2:小数点后第一位 < 5

          正数:Math.round(11.49) = 11

          负数:Math.round(-11.49) = -11

Case3:小数点后第一位 > 5

          正数:Math.round(11.69) = 12

          负数:Math.round(-11.69) = -12

总结:

      Math类中提供了三个与取整有关的方法:ceil,floor,round  这些方法的作用于它们的英文名称的含义相对应

      例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;

                 floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;

                 最难掌握的是round方法:他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,

                        所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.

      Math.round( )符合这样的规律:小数点后大于5正数和负数全部加1,等于5正数加1,小于5正数和负数全不加1。

Date类     

 java.util.Date

Date date = new Date()

 

long cur = System.currentTimeMillis();  // 取得当前的日期时间以long型返回

Date date = new Date(cur);                      // 将long转换为Date

System.out.println(date);                 // 输出对象信息

System.out.println(date.getTime());     // 输出对象信息

 

Date date = new Date();                       // 实例化Date类对象

// 实例化SimpleDateFormat类对象,同时定义好要转换的目标字符串格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

String str = sdf.format(date);  // 将Date型变为String型

System.out.println(str);

 

String str = "2005-07-27 07:15:22.111" ;      // 字符串由日期时间组成

// 实例化SimpleDateFormat类对象,同时定义好要转换的目标字符串格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;

Date date = sdf.parse(str) ;              // 将字符串变为日期型数据

System.out.println(date);

 

String str = "2005-15-57 77:95:22.111" ;// 字符串由日期时间组成

// 实例化SimpleDateFormat类对象,同时定义好要转换的目标字符串格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;

Date date = sdf.parse(str) ;              // 将字符串变为日期型数据

System.out.println(date);

 @since   JDK1.0

特点:获取当前时间,结合SimpleDateFormat类可以实现String和Date类型的转换

public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{}

 

 Calendar类

 java.util.Calendar

Calendar cal = Calendar.getInstance();  // 取得本类对象

StringBuffer buf = new StringBuffer();  // 保存日期时间数据

buf.append(cal.get(Calendar.YEAR)).append("-");     // 取得年数据

buf.append(cal.get(Calendar.MONTH) + 1).append("-"); // 取得月数据,从0开始

buf.append(cal.get(Calendar.DAY_OF_MONTH)+5).append(" ");    // 取得5天后数据

buf.append(cal.get(Calendar.HOUR_OF_DAY)).append(":");       // 取得小时数据

buf.append(cal.get(Calendar.MINUTE)).append(":");// 取得分钟数据

buf.append(cal.get(Calendar.SECOND));    // 取得秒数据

System.out.println(buf);

 @since JDK1.1

特点:获取当前时间,可以进行日期的比较和计算

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {}

 

 

 

 

 

posted @ 2018-06-12 17:14  爱寂寞撒的谎言  阅读(730)  评论(0)    收藏  举报