日期:2014-05-20 浏览次数:20820 次
在上两节的博文中,我们对Java的多线程进行了深入的解析,理解起来还是有一些难度的;
今天这一节,我们讲点轻松点的,就是Java中的一些常用类的用法,这些类都放在java.lang包或者
java.util包下;而我们不需要import lang包,因为系统会自动导入这个包!
好了,废话不多说,看是这一节!
Object类是所有类的父类,默认继承该类,每个类都可以直接调用Object的方法,同时还可以继承其他的类,
这并没有违背Java的单继承的规则哦!
toString() | 返回描述对象的一个字符串,通常重写该方法以取得对象的字符串信息 另外,当调用system.print(),对象作为参数时,默认调用对象的toString()方法 |
String |
equals() | 判断两个对象的内容是否相同,可按需求对其进行重写 | boolean |
clone() | 实现对象的复制,与赋值不同,赋值引用的是同一对象实例;另外需要实现 Cloneable接口才能使用clone()方法,否则会引发CloneNotSupportedException异常 |
Object |
getClass() | 该类封装对象接口运行时的状态,类加载时,Class对象自动创建,但是我们 不能够自己去new Class()哦! |
Class |
package com.jay.example; public class ObjectTest { public static void main(String[] args) throws Exception { Person p1 = new Person("老王", 48); Person p2 = new Person("老张", 47); Person p3 = new Person("老王", 48); String s1 = new String("呵呵"); String s2 = new String("呵呵"); //这里直接调用print对象名的话,自动调用对象的toString()方法 //如果不重写的话,返回的字符串: //getClass().getName() + '@' + Interger.toHexString(hashcode()) //就是类名@哈希码 System.out.println(p1); //这里要注意==赋值和equals的区别 //==比较的是地址;equals比较的是两对象是否指向同一实例 //而这里要注意字符串,字符串变量是有一个常量池的,当我们创建一个新的字符串 //如果字符串中已经存在了,那么将该对象指向该内存空间,即指向同一引用对象 //如果不是String对象而是普通的对象的话,直接调用equals是不相等的 //所以需要对equals方法进行重写,不然就不能判断对象是否相等了 System.out.println(p1 == p3); System.out.println(p1.equals(p3)); //字符串常量池,使得两对象equals返回ture System.out.println(s1 == s2); System.out.println(s1.equals(s2)); //调用clone()方法进行对象的复制,需要实现Cloneable接口, //要覆盖Clone()方法,至少写个return super().clone();还要注意使用try-catch对 //CloneNotsupportedException进行捕获; //克隆与==赋值不一样,指向的不是同一实例对象哦! try { Person p4 = (Person) p2.clone(); System.out.println(p4); System.out.println("p4和p2是否为同一对象:" + (p4 == p2)); } catch (CloneNotSupportedException e) { e.printStackTrace(); } /*Class类的使用: * ①获得指向某个类的class对象的引用: Class c1 = p1.getClass(); * ②获得接口或者类的全名: c1.getName() * ③当然也可以通过Class的静态方法forName()获得class对象引用:Class.forName("类的全名"); * ④getSuperclass():获得父类的class对象 * ⑤newInstance();创建一个与调用对象对应类的实例,是新的哦! * * */ System.out.println(p1.getClass()); System.out.println(p1.getClass().getName()); Class c1 = Class.forName("com.jay.example.Person"); System.out.println(c1); System.out.println(c1.getSuperclass()); Person p5 = p1.getClass().newInstance(); p5.name = "老黄"; p5.age = 25; System.out.println(p5); } }
运行截图:
在Java中,基本数据类型都有与之对应的封装类(包装类) eg: int ----> Integer
装箱:基本数据类型---->封装类
拆箱:封装类--->基本数据类型
装箱与拆箱由系统自动完成!
int ---> Integer short---> Short long---> Long
char ---> Character float ---> Float double--->Double
boolaen--->Boolean byte ---> Byte
包装类-->基本: intValue()
字符串--->基本: parseInt("str")
包装--->字符串: toString()
字符串--->包装: valueOf("str")
package com.jay.example; public class PottingTest { public static void main(String[] args) { //①包装类与基本数据类型的相互转换 //除了这种构造方法外:还可以写成,Integer(123),但使用字符串的话一定要 //是符合对应数字格式的字符串,否则印发NumberFormatException(数字转换异常) //因为封箱与拆箱都是自动进行的,所以如果我们输入两个数相加的结果是:246 //其他格式的都是这种转换格式,把int替换成其他数据类型即可 Integer i = new Integer("123"); int j = i.intValue(); System.out.println(i + j); /* * ②字符串转换为基本数据类型 * 同样要是符合数字类型的字符串,不然也会报异常 * 同理,只需要把int替换成其他数据类型即可:eg: Double.parseDouble("1.23"); * 别忘了Java小数默认是Double类型的哦! * */ int i2 = Integer.parseInt("321"); /* * ③包装类与字符串的相互转换: * */ //包装类转换成字符串,直接调用toString()即可 Integer a = new Integer(11); i.toString(); //字符串转换为包装类: Integer ig = Integer.valueOf("987"); } }
ps:都是静态方法,参数都是char字符,返回值都是boolean!
数字:isDiagit(char) 字母:isLetter(char) 数字或字母:isLetterOrDigit(char)
小写字母:isLowerCase(char) 大写字母:isUpperCase(char) 空格:isSpace(char)
由名字就知道这个是数学类,当然是提供一些数学方法的啦,比如:正余弦运算等
Math类定义了两个常量,PI(圆周率)和E(自然数),顺道复习下Java中常量的定义方式:
public static final double PI:
public static final double E:
除了以上变量,当然还有很多的数学方法,比较多,这里只列出比较常用的
几个,有需要的自己查询API,都是静态方法,可以直接通过Math.XXX调用哦!
sqrt():求平方根
pow(数字,次方):求数字的多少次方
rint():返回与参数最接近的整数值,以double形式返回
abs():返回绝对值
max():返回两数的最大值
min():返回两数的最小值
①exit(int exitcode):结束应用程序的运行,会返回exitcode给父进程(操作系统),exitcode为0的话表示正常退出
②复制数组:static void arraycopy(被复制的数组,起始下标,目标数组,起始下标,长度)
下标是从0开始算的哦!
使用实例:
package com.jay.example; public class ArrayCopyTest { public static void main(String[] args) { int[] a = {1,2,3,4,5,6,7,8}; int[] b = {0,0,0,0,0,0,0,0}; int[] c = {0,0,0,0,0}; //这里要注意下标不能越界,否则会引发ArrayIndexOutOfBoundsException异常 //输出结果是:3,4,5,6,7 System.arraycopy(a, 2, c, 0, 5); for(int i = 0; i < c.length;i++) System.out.print(c[i]); } }
③currentTimeMillis()
返回从1970.1.1 零点到现在的时间,单位是毫秒,通常用来计算程序运行耗费的时间
使用实例:
package com.jay.example; public class CurrentTimeMillisTest { public static void main(String[] args) { long start,end; int j = 0,k=0; //记录起始时间 start = System.currentTimeMillis(); for(int i = 0;i < 1000;i++) for(j = 0;j < 1000;j++) { k++; } //记录结束时间 end = System.currentTimeMillis(); //结束时间-起始时间,即可算出两层for循环的运行时间 //这个是电脑配置是有一定关系的!不同电脑的结果可能不同!我的电脑是1毫秒 System.out.println("循环1000次消耗了" + (end - start) + "毫秒"); } }
①字符串的连接:用"+"加号可以连接成字符串,比如: 123 + "" = "123"
②求字符串的长度: str.length()
③求子串:str.subString(开始下标,"结束下标")
//注意是从0开始算的,截取到结束下标 - 1;或者这样算:子串长度 = :结束 - 开始
④判断是否相等:这里要注意==这个比较的是字符串是否存储在同一位置!如果是比较内容我们要用equals("");
⑤返回给定下表处的字符: str.charAt(int index);
//从0开始算的
⑥将指定字符串连接到字符串的尾部: str.concat("HeHe");
⑦检索某字符在字符串中第一次出现的下标: str.indexOf("a");
⑧检索某字符在字符串中最后一次出现的下标:str.lastIndexOf("a");
⑨去掉头尾的空白:str.trim(),这个在数据库操作中比较常用
⑩替换字符串中的某段: str.replace("想替换的字符串","替换后的字符串");
11.比较两个字符串的大小,无视大小写:str.equalsIgnoreCase(stg);
12.全部字符转化为小写:str.toLowerCase()
13.全部字符转化为大写:str.toUpperCase();
首先,我们要知道字符串和普通对象的不同,字符串都存放在一个字符串池中,
当我们新建一个字符串时,不是直接就开辟一个内存空间;而是先比较下字符串池中
是否有相同的字符串内容,如果有相同的内容的话,直接将该引用指向此处字符串内容
所以为什么相同内容字符串用"=="比较结果是true,"=="比较的是两对象是否为同一类实例的引用(地址)
但是要注意:如果是new String的话,那么是不等的!!!!
当然也可以直接用equals(),String类已重写该方法,比较的是内容是否相同
还有一个compareTo(str)方法,如果当前对象大于参数串,返回大于0的数,返回小于0的数.相等,返回0
先说下这货是干嘛的:因为String对象内容不可更改,使用该类实现串内容的添加,修改,删除!
什么?你没听错吧,String对象不可修?那String s = "123",s += 321";不见得运行出错或者异常啊?
输出123321,正常啊,那么为什么说String不能够修改?
其实原因是这样的:我们都知道生成的string对象都存放在一个字符串池中;我们上面用到的字符串的拼接;
其实涉及到的是三个字符串对象了: "123","321","123321",而123和321明显都不是我们想要的,我们只要的是123321
这样就有点浪费内存了,Java给我们提供了StringBuffer对象,实现字符串内容的改变,一定程度上减少了内存的消耗
①将某个对象添加到StringBuffer的尾部,每个对象都有toString()方法,所以可以直接添加 :append(对象)
②将某个对象的字符串描述插入到某个位置: insert(下标,对象)
③替换指定位置的字符: setCharAt(下标,字符)
④替换指定范围的字符串: replace(起始下标,结束坐标,替换字符串);
⑤删除指定位置的字符: deleteCharAt(下标)
⑥删除指定位置的字符串: delete(起始坐标,结束坐标)
⑦获取子串: substring(起始坐标,结束坐标)
⑧获取StingBuffer的长度 : length()
⑨反转字符串: reverse()
package com.jay.example; /* * 该代码演示的是StringBuffer的用法 * */ public class StringBufferTest { public static void main(String[] args) { //创建StringBuffer对象的方法 //记住:不能直接赋值,strbuf1 = "123"这样!! StringBuffer strbuf1 = new StringBuffer("123"); StringBuffer strbuf2 = new StringBuffer("123"); StringBuffer strbuf3 = new StringBuffer("123"); StringBuffer strbuf4 = new StringBuffer("123"); StringBuffer strbuf5 = new StringBuffer("123"); StringBuffer strbuf6 = new StringBuffer("123"); StringBuffer strbuf7 = new StringBuffer("123"); StringBuffer strbuf8 = new StringBuffer("123"); StringBuffer strbuf9 = new StringBuffer("123"); //调用比较方法,都是false,说明和String是有区别的 System.out.println(strbuf1 == strbuf2); System.out.println(strbuf1.equals(strbuf2)); //输出false,false //将某个对象添加到StringBuffer的尾部 strbuf1.append("321"); System.out.println(strbuf1); //输出123321 //插入某个对象到某个位置 strbuf2.insert(2, "呵呵"); System.out.println(strbuf2); //输出结果:12呵呵3 //替换指定位置的字符,是字符哦!!! strbuf3.setCharAt(2, 'a'); System.out.println(strbuf3); //输出12a //删除指定位置的字符 strbuf4.deleteCharAt(1); System.out.println(strbuf4); //输出13 //删除指定位置的字符串 strbuf5.delete(0, 2); System.out.println(strbuf5); //输出:3 //获取子串 System.out.println(strbuf6.substring(0, 2)); //输出12 //获得字符串的长度 System.out.println(strbuf7.length()); //输出3 //将字符串反转: strbuf8.reverse(); System.out.println(strbuf8); //输出321 } }
Date类是用于封装日期和时间的,通过Date可以指定特定的一个时间.
可以通过我们前面提供的System.currentTimeMillis();方法获得从1970到现在时间的毫秒数!
package com.jay.example; import java.util.Date; public class DateTest { public static void main(String[] args) { //获得创建Date对象的当前日期,CST代表世界统一时间 Date d1 = new Date(); System.out.println(d1); //输出:Mon Apr 14 12:51:46 CST 2014 //也可以设置成离1970.1.1开始经过多少毫秒后的时刻 Date d2 = new Date(7200000); System.out.println(d2); //判断d1是否在d2日期后 System.out.println(d1.after(d2)); //判断d2是否在d1日期前: System.out.println(d2.before(d1)); } }
用于设置或获取日历字段值,年月日时分秒,该类时抽象类!
通过getInstance():获得当前的系统时间;
通过get()和set()方法获取或者设置时间分量
使用getTime()和setTime()通过Date类对象获取和设置时间值
YEAR(年),MONTH(月),DATE(日),HOUR(时),MINUTE(分),SECOND(秒)
日历类的普通使用:
package com.jay.example; import java.util.Calendar; public class CalendarTest { public static void main(String[] args) { //①获得系统的当前日期,并且输出: Calendar cd = Calendar.getInstance(); System.out.print("系统的当前时间为:"+ cd.get(Calendar.YEAR) + "年"); System.out.print( cd.get(Calendar.MONTH) + "月"); System.out.print( cd.get(Calendar.MONTH) + "月"); System.out.print( cd.get(Calendar.DATE) + "日 "); System.out.print( cd.get(Calendar.HOUR) + "时"); System.out.print( cd.get(Calendar.MINUTE) + "分"); System.out.print( cd.get(Calendar.SECOND) + "秒"); //②通过set可以设置Calendar的某个分量的值;有不同的方式,可查api cd.set(Calendar.MONTH, 5); cd.set(2012, 10, 6); //③可以把Date对象作为参数传入setTime(new Date())方法,也能获得系统时间 } }
这个什么好讲的= =,知道lang.Math()也有生成随机数的方法和Util中有Random类用于生产随机数;
会自己生成随机数即可:
示例:生成 1~10 随机数的两个方法:
Random方法:(int)(Math.random()*10)
Random类:int num = new Random().nextInt() + 1
ps:如果是想是其他数据类型的随机数只需要把nextInt改为其他类型即可eg:nextFloat();
我们认识了所有类的父类Object类,学习了toString(),equals(),clone(),getClass()方法的使用
又学习了封装类,普通数据类型,字符串的相互转换
还学习了Math类的两个常量PI和E,以及相关的常用方法
也学习了System类的exit(),arraycopy(),currentTimeMilis()方法
接着也学习了String和StringBuffer的相关属性,比较了他们的区别
最后学习了util包中的Date,Calendar的用法
当然还有随机生成随机数的两个方法
不要刻意地去死记属性和方法,用到的时候再来查,死记过两天就忘了....
ps:本节就到这里,如果有什么纰漏,错误,好的建议,望读者支出,
万分感激,O(∩_∩)O谢谢!