您的位置:首页 > 其它

(22) - 简要知识点(二) (String类,System类,Random类,等等)

2013-10-08 23:08 537 查看
----------------------
ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------

在学习中,穿插了部分知识点的概述,做了初步认知,当往后涉及,可进一步研究,这里部分知识点只做了初步认知。

1、String类

字符串是一个特殊对象,切记字符串一旦被初始化就不可改变,即str = “aa”;再str = “bb”;不是字符串”aa”改变,而是str指向了新的”bb”字符串。所以不宜大量str的赋值操作。

(1)String的常用操作

常用操作有具体的手册,这里不再祥述,简单说明下。

获取方法:length(),charAt(int),indexOf(int)等。

判断方法:contains(str),isEmpty(),startsWith(str),endsWiths(str),equals(str)等。

字符串转换:

(a)构造函数转换:String(char[]),String(char[], offset,count)等。

(b)转成字符数组:char[] toCharArray()等。

(c)字节数组转字符串:String(byte[]),String(byte[], offset, count)等。

注:String(byte[] bytes, Charsetcharset)字符串和字节数组在转换过程中,是可以指定编码表的,通过charset参数指定。

(d)字符串转字节数组:byte[] getBytes()

(e) 将基本数据类型转换成字符串:

StaticString valueOf(int)

StaticString valueOf(double)

或用 3+“” 的形式,相当于String.valueOf(3);

字符串替换和切割:

替换:String replace(oldchar, newchar)

切割:String split(str);

字串:获取字符串中的一部分

Stringsubstring(begin);

Stringsubstring(begin,end)//输出字串,包含头不包含尾。

大小写转换,比较,去空格:

(a)将字符串转成大写或小写。

StringtoUpperCase();

StringtoLowerCase();

(b)将字符串两端的多个空格去除。

String trim();

(c)对两个字符串进行自然顺序的比较。

int compareTo(String)

(2)String的一些注意点

字符串最大特点就是一旦被初始化就不可以再改变,因此会引起和多注意的地方。

Stringstr = “abc”;与String str1 =new String(“abc”);有什么区别?

str是一个引用型变量,”abc”是一个对象,该对象初始一次不能再变,类似成常量。若再令str = “kk”;它不将”abc”内存内容换成”kk”,而是另外创建’kk’的内存,令str指向”kk”。

当需要判断str == str1时,结果为false,虽然内容都是”abc”,但两者所指对象不同,str指向”abc”,str1指向new的对象。

那么可以有以下的一些推断:

public staticvoid  main(String[] args) {
String s1 = "abc";//一个对象,即”abc”
String s2 = "abc";
String s3 = new String("abc");//两个对象,”abc”和new的String对象
String s4 = new String("abc");

System.out.println(s1 ==s2);//true,同一对象
System.out.println(s1 ==s3);//false,"abc"!= new的对象
System.out.println(s3 ==s4);//false,new对象 != new对象

System.out.println(s1.equals(s3));//true,用equals能单纯的比较字符串内容
}


其实String是由final修饰的类,那么String不能继承也不能派生,其对象的也有了类似于常量的约束了,引用变量的对象不可变,但其所指地址可变。

(3)StringBuffer与StringBuilder

StringBuffer类:

有final关键字修饰,它是一个字符串的容器,它是字符串缓冲区,可以对字符串内容进行增删。

普通的String对象,多次赋值将会产生很多的新字符串对象(原有不变,引用将指向新的字符串),将增加内存,于是出现了字符串的缓冲区。

特点:

(a) 长度是可以变化的。

(b) 可以直接操作多个数据类型

(c) 最终用toString方法变成字符串

常用方法:

//存储
StringBuffer append(); //将指定数据作为参数添加到已有数据的结尾处。
StringBuffer Insert(index,数据);//可以将数据插入到指定index位置。

//删除
StringBuffer delete(start, end);//包含start,不包含end
StringBuffer deleteCharAt(index);// 删除指定位置字符

//获取
char  charAt(int index);//得到index角标下的字符
int  indexOf(String str);//返回与str相等字串第一次出现的位置
int  lastIndexOf(String str);//从尾部根据str字符串获取位置
int  length();//获取长度
String substring(int  start,int end);//获取从start到end(不包括)的字串

//修改
StringBuffer  replace(int start, int end, String str);//修改原StringBuffer中从start到end(不包括)角标中的内容,与String不同,是真正的在原串中替换。
void setCharAt(int index, char c);替换某一位字符,且不返回。

//反转
StringBufferreverse();//反转,将原串逆序显示


StringBuilder类:

与StringBuffer功能类似,是JDK1.5版出现的。既然功能与StringBuffer类似,那么为什么还要在1.5版后增加StringBuilder呢?

这里就要一起说下StringBuffer类及StringBuilder类的区别了:

学过vector和ArrayList或者HashTable和HashMap我们就能知道,在集合中有同步方式和异步方式,而异步方式在效率上比同步方式要高。

那么StringBuffer就是线程同步方式,即在多线程下操作方法时会进行同步判断,那么这样难免会有损效率,但是却能保证线程的安全型。

StringBuilder是线程异步的方式,因此不保证线程安全,但是有效率。

那么在单线程的情况下,我们采用StringBuilder比StringBuffer是要高效的,如果在多线程情况下,要求安全性,还是得用老的StringBuffer。

2、System类

System类中包含一些有用的类字段和方法,他不能被实例化,全静态方法。

如getProperties(),gc(),等。

out:标准输出,默认控制台。

In:标准输入,默认键盘。

因为Properties是HashTable的子类,也就是Map集合的一个子类对象。

那么可以通过Map的方法取出该集合中的元素。

该集合中存储都是字符串,没有泛型定义。

//在系统中定义自己的信息

System.setProperty("mykey","myvalue");

//获取指定属性信息

String value =System.getProperty("os.name");

4、Random类

Random类用于产生随机数的类,只是这些随机还是有规则的,我们称之为伪随机。我们在进行随机时,随机算法的源数字称为种子(seed),随机数的产生在种子数的基础上进行,那么伪随机会出现同一个种子下,多次随机产生的数字是一样的,即不是真正的随机数,称伪随机数。

伪随机数,即产生的随机数并不是真正意义上的随机数,该随机数通过算法产生,

当数据达到一定数量,还是有规律可循的。

(1)常用的一些方法

//产生一个随机数,值介于int区间。那么要产生指定值,可进行一定的数学转换,如用%取模限制范围等。
public int nextInt();
//随机产生一个int值,该值介于0到n区间,包括0。
public int nextInt(int  n);
//产生一个小数,若要大于1以上,取其结果乘int值,即可。
public double nextDouble();
//设置一个产生随机数的种子
public void setSeed(long seed);


示例:

import java.util.Random;

public class RandomDemo {
public static void main(String[] args) {
//在构造时刻加seed种子或后面调用setSeed(seed)设置
//Random dom1 = new Random(seed);
Random dom = new Random();

//整数随机数
//本来是0-9,加1后值为1-10,包括负数
int a = dom.nextInt()%10+1;
int b = dom.nextInt(10)+1;
long c = dom.nextLong()%10+1;
System.out.println(a+" :"+b+" :"+c);
//小数
//本来是0-1.0范围内,乘个整数则可大于1
float fl = dom.nextFloat()*2;//0-2
double db =dom.nextDouble()*5;//0-5
System.out.println(fl+" :"+db);
}
}


5、Runtime类

Runtime类封装了运行时的环境,每个java应用程序都有一个Runtime类实例,使程序能够与其所在系统运行环境相连接。使程序能开进程运行。

应用程序不能创建自己的Runtime类实例(无构造函数)。可以通过getRuntime方法获取当前运行时。

进一步说明,该类是单例设计模式。

一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和方法。

一般可以用于内存管理或执行其它程序等,这里只是概述,知道是干什么的,具体应用时查阅API手册。

5、Date类

Date为时间类,时间格式为:

其中DateFormat类为抽象类,SimpleDateFormat为其子类,

通常获取系统时间是以个按秒计算的长整数long,于是用格式化的方法转成我们想要的具体格式SimpleDateFormat对象预先设置需要的时间格式,便可对应输出具体格式。

其中EEEE指星期,MM指月,dd指日,yyyy指年,h,m,s分别为时分秒等等。

示例:

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
public static void main(String[] args) {
/*
Date date = new Date();
//获取当前时间,不过是个以秒为单位的long数,需转换
System.out.println(date.getTime());
*/

//定制格式,MMMM为中字月份如二月,MM为数字月份,如02
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
Datedate = new Date();
System.out.println(dateFormat.format(date));
}
}


6、Calendar类

Calendar抽象类,直接子类为GregorianCalendar,用于获取时间的特定部分,如获取年月日等。

获取时间:

Calendar c = Calendar.getInstance();

//或者利用查表法,sop为封装了System.out.println()输出

sop(c.get(Calendar.YEAR)+"年");

sop("明天:"+(c.get(Calendar.DAY_OF_MONTH)+1));

设置时间:c.set(2012,2,23);//设置时间,月从0开始,2代表3月

改变时间:c.add(Calendar.DAY_OF_MONTH,-3);//前推3天

其中像YEAR,DAY_OF_MONTH等是Calendar的常量字段,较多,但易理解,想进一步了解可查阅api手册。

----------------------
ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: