您的位置:首页 > 移动开发 > Objective-C

java笔记之Object,String,StringBuilder,StringBuffer,时间类和日期类以及包装类

2014-04-01 19:05 671 查看

前言

这里介绍的是一些基础,比较容易理解,包含了字符串工具类(String,StringBuffer,StringBuilder,char[],用来表示字符串的)

正文

Object类

是所有类的根类

方法

toString():
1)Object类中的toString打印格式为全限定名@hashCode。
注:全限定名=包名+类名,包名与类名使用点号连接,用来唯一标识一个类。
在输出对象时,默认调用对象的toStirng方法。
个人推荐使用如下重写toString,有更高的兼容性:

package com.cusinfosoft.spring.pojo;

/**
* @author Administrator
*
*/
public class Student {

private int id;

private String name;

private String sex;

private int age;

private String qq;

public Student() {
}

public Student(String name, String sex, int age, String qq) {
this.name = name;
this.sex = sex;
this.age = age;
this.qq = qq;
}

public Student(int id, String name, String sex, int age, String qq) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.qq = qq;
}

public String getName() {
return name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getQq() {
return qq;
}

public void setQq(String qq) {
this.qq = qq;
}

@Override
public String toString() {
return org.apache.commons.lang.builder.ReflectionToStringBuilder.toString(this);
}
}

equals():
1)语法:
public boolean equals(Object obj){
}
2)意义:
在Object中比较的是对象的地址是否相等
3)sun建议:

重写equals方法时,保证两个相同内容的对象作比较的结果为true,来达到equals方法比较对象的内容,
==运算符比较的是对象地址的目的。
注:常考的多选题:重写的规则
1))自反性:如果对象o非空,那么o.equals(o)的放回值为TRUE。
2))对称性:如果对象x,y非空,那么x.equals(y)与y.equals(x)的放回值一样。

3))传递性:如果对象x,y,z非空,如果x.equals(y)的放回值为TRUE,y.equals(z)的放回值为TRUE,那么

如果x.equals(z)的放回值为TRUE.
4))一致性:对于任何非空引用x,y,那么多次调用x.equals(y)的放回值始终2一样(前提:对象上被比较的内容没被修改)

5))对于任何非空应用x,那么x.equals(null)的放回值始终为false。

4)模板:在写实体类是必须重写equals方法

public class EqualsDemo{
int id;
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(this==obj){
return true;
}
if(obj instanceof EqualsDemo){
EqualsDemo e=(EqualsDemo)obj;
return this.id=s.id;//比较的是内容,是具体的cr而定
}
return false;
}

}

5)面试题:
....
shopping[] ss=new Shopping[]{s,new shopping()};
shopping[] ss1=new Shopping[]{s1,new shopping()};

System.out.println(Arrays.equals(ss,ss1));
注:
1))ss和ss1作比较时,是把数组中的对象作比较,在对象作比较时需要调用equals方法,
所以要求改对象要重写equals方法。
2))另外在扩展一下:list和set的contains方法:
List的contains():只调用equals方法来判断结果
Set的contains方法是先调用hashCode方法来判断,如果为真,就再调用对应的equals方法进行判断;
如果hashCode方法比较的结果为false,就直接返回结果。

hashCode方法
Object的hashCode方法:public native int hashCode();是一个本地方法,采用hash算法将地址转换成唯一编码。

1)在重写equals方法时,须重写hashCode方法。
注:如果equals方法的值为TRUE,那么对象的hashCode必须一致
如果equals方法的值为false,那么对象的hashCode必须不一致

(因为hashCode方法返回的值是唯一标识当前对象的内容,而非它的地址)
2)当一个对象产生后,那么它的hashCode不能改变。hashCode通常情况下采用唯一标识(OID)。
3)

String

1)String的特性:
1))String类是不能被继承的,它被final修饰。
2))String类内部的实现是char[](为什么不直接使用char[],干嘛还要用String:
char[]值可随意的被改变,且字符串本身也是一种类型)

3))字符串的字面量也是String类型的实例(比如:String str="abc";//abc为字面量)。

4))String类的设计原则是对象的内容不变。
5))String类在实例化的过程中,如果他的实例都是字面量,且字面量的结果一致,那么系统会优化,让其在内存中的值存在一个空间中。
示例:

package com.csuinfosoft.stringDemo;
/**
*
* @author 张坤楠
* @date 下午3:22:58
* String对象的比较,这里同一个对象的概念为内存地址,即使采用==比较对象,
* 而非采用equals和hashCode,因为他们比的是内容。
*/
public class StringDemo {
public static void main(String[] args){
String str1="abc123";
String str2="abc"+"123";
final int i=123;
String str3="abc"+i;
//其中str1,str2,str3均为同一个对象。
String str7="abc";
String str8=str7+"123";//str1,和str8不是同一个对象,因为str7是变量,而非字面量。
String str9=new String("abc123");//str1,str7,str8,str9这是个为不同的四个对象
System.out.println(str1==str2);//true,比较的是内存地址
System.out.println(str1==str3);//true,比较的是内存地址
System.out.println(str2==str3);//true,比较的是内存地址
System.out.println(str1.equals(str2));//true,比较的是内容

System.out.println(str1==str8);//false,比较的是内存地址
System.out.println(str1.equals(str8));//true,比较的是内容
System.out.println(str1.hashCode()==str8.hashCode());//true,比较的是内容
System.out.println(str1==str9);//false,比较的是内存地址
System.out.println(str8==str9);//false,比较的是内存地址

}
}

6))String重写了toString(),equals(),hashCode()方法
7))String API,如果String的方法的放回值为String类型时,那么就会产生一个新的对象,包括加号也会产生新对象。toString方法除外。
int length() 字符串长度
char charAt() 切割字符串,索引从0开始。
boolean equals(Object ) 比较两个字符串的内容是否相等
String trim() 去(前后)空白(空格,换行,制表符)的方法,
示例:

package com.zhongxin.util;
/**
*
* @author 张坤楠
*	去掉字符串的中间空白的示例
*/
public class DeleteSpaceUtil {
public static String deleteSpace(String message){
String str = new String();

String[] middle = message.split(" ");//没有必要提前去前后空白,
//因为middle的最后一个元素和第一个元素的长度与message前后空白无关
for(int i=0;i

String toLowerCase() 吧字符串大写转化成小写
String toUpperCase() 吧字符串大写转化成小写

String indexof(String str) 按照从左至右顺序查找str的位置,值查找第一个str就返回,找不到就返回-1.
String indexof(char c)

String indexof(String str,int loc ) 从loc位置开始,从左查找字符串的第一次出现的位置。
String ilastIdexof(String str ) 从字符串的微博查找字符串str的第一次出现的位置。

String subString(int i) 从i的位置开始到字符串结尾的字符串截取出来
String subString(int start,int end)   截取从start到end-1的位置的字符串。
String concat(String str)  连接字符串,和加号的作用一样
char[] tocharArray   吧字符串转化成字符串数组

new String(char[] c)  把字符数组转化成字符串
8))字符串和正则
1)))api
boolean match(String regex) ;用于判断当前的字符串是否符合regex正则表达式。
String split (String regex) 根据regex将字符串切割成多个字串
String replaceAll(String regex ,String str); regex为要被替换的正则表达式,str为替换的内容。
2)))正则表达式:
一个字符串,用指定字符来限制当前字符串的内容
1))))正则的语法:
普遍的字符串  ”abc“
【】 代表当前位置可以出现的字符
{}代表当前字符串可以出现的次数:示例,手机号码,num.matches("[1]{1}[3458]{1}[0-9]{9}");
注:【0-9】- 从起始位置到结束之间的字符串多可取。
^ 字符串的起始位置,行的开头
$字符串的结束位置,行的结尾
示例:用户名:字母,数字,下划线,长度为6,20.
^[0-9a-zA-Z_]{6,20}$

或者^\\w{6,20}$ 其中\是用于转换的
{start,end} 代表可以出现start到end之间数字的次数
\d 代表【0-9】
\D 代表非数字
\w 代表【a-zA-Z0-9_】 字符
\W 代表【^\w】

StringBuilder,StringBuffer

1.特点:
都是被final修饰,不能被继承
都是动态字符序列(采用动态数组的算法,来实现动态存储数据方式,完成字符串的动态存储,采用变长数组存储)
内存对象内容是可变的,说明他们是一个可变的字符序列
1)
StringBuilderAPI
StringBuilder append(String) 向原字符串追加新的字符串
StringBuilder insert(int index,String str) 在index位置向原字符串插入新的字符串str,index从0开始

StringBuilder delete(int index,int end) 删除start到end的字符串,小标不包含end,即到end-1

2.应用场景
有大量的字符串操作
3.String,StringBuilder,StringBuffer之间的转化
StringBuilder,StringBuffer到String的转化:调用toString()方法
String转化到 StringBuilder,StringBuffer:使用对应的构造器,比如:new StringBuilder(String str);
注:java优化String代码的示例:

public class StringJavaDemo{
public static void main(String[] args){
String str1="a";
String str2="b";
String str3=str1+str2;//ava会优化此代码,相当于Str3=new StringBuilder().appned(str1).append(str2).toString();

}
}

4.StringBuilder,StringBuffer之间的关系
1)相同点:
内部是char[],是可变的字符序列
API大致相同
2)不相同点:

StringBuffer,是java早期引入的,线程安全,速度慢

StringBuilder,是java 5.0引入的,非线程安全,速度快

3)总结
String采用定长数组,StringBuilder,StringBuffer采用变长数组

包装类

全部被final修饰,顺便提一下,java.lang.Math,System,String也被final修饰
包装类是使用面向对象的思想把简单的数据类型封装成类。
1.特点
包装类把简单的数据类型包装成类。
注:简单数据类型不是类,使用简单数据类型主要为了提高代码的运行效率
2.装箱和拆箱
把简单数据类型包装成对应的包装类称为boxing(示例:Integer i=1;将1包装成Integer再使用Object引用Integer对象)
把包装类型转换成简单数据类型称为unboxing(示例:Integer i=1,int p=i;//将包装类Integer转化成简单数据类型int) 
注:Integer的拆箱方法为 int intValue(),其他的包装类以此类推
1)包装类都重写了toString方法,equals方法,hashCode方法
2)Integer的API:
String toBinaryString(int i); 将int类型的数据以二进制字符串形式返回
int parseInt(String)  将字符串转化成int类型
int parseInt(String str,int i)  将字符串转化成对应的进制类型,str为被转换的字符串,i为进制类型(10,8,16)
Integer valueof(String str)  将字符串转换成Integer类型。

时间类和日期类

时间可用long类型来表示。
1)long System.currentTimeMillis();//从计算机的计时元年到当前时间的时间差,以毫秒为单位。
1.时间类
Date java.util.Data
1)API
int getYear(),返回一个值,此值是从包含或开始于此 
Date
 对象表示的瞬间的年份减去 1900 的结果
int getMonth();从0开始
int getDate();获取日
int Day();获取星期几,星期天为0
int getHours()  获取小时
int getMinutes();获取分钟
int getSeconds() 获取秒
long getTime 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
new Date(long l) 将时间差转换成Date类型
2.日历类
Calendar 
Calendar
 类是一个抽象类,补充一点抽象类的非抽象方法可调用抽象方法
Calendar 的直接已知子类:GregorianCalendar提供了世界上大多数国家使用的标准日历系统
1)Calendar 的API
static Calendar getInstance() 使用默认时区和语言环境获得一个日历。
int get(int field)           返回给定日历字段的值。 其中的field为Calendar
对应的常量(static int YEAR           指示年的 get 和 set 的字段数字。 )

void setTime(Date date)           使用给定的 Date 设置此 Calendar 的时间。 将Calendar 转成Date类型

Date getTime()           返回一个表示此 Calendar 时间值(从历元1970至现在的毫秒偏移量)的 Date 对象。 将Date转成Calendar 类型

2)总结:






3)补充:字符串和日期之间的转换
1))java.text.DateFormat,DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。
日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。
2))直接已知子类:SimpleDateFormat,
SimpleDateFormat
是一个以与语言环境相关的方式来格式化和分析日期的具体类。
3))将字符串转换为日期类:
 注:



DateFormat df=new
SimpleDateFormat(日期模式字符串);
Date
df.parse(String source)           从给定字符串的开始分析文本,以生成一个日期。 

3))将日期类转换为字符串


DateFormat df=new
SimpleDateFormat(日期模式字符串);

 String df.format(Date date)           将一个 Date 格式化为日期/时间字符串。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: