三大常用类型(字符串String、日期类Date、数字类Number)

三大常用类型(字符串String、日期类Date、数字类Number)

【摘要】三大常用类型(字符串String、日期类Date、数字类Number)~

前言

hi~

字符串

定义

有关字符串类型,java.lang.String 类,它的本质就是char[],它的实现代码:

1
2
3
4
5
6
public final class String implements CharSequence{
private char[] content;
private int capacity;
private int index;
//...
}

也就是说,字符串就是由字符数组组成的。但是,String是不变类,它的实例也就是不变对象。

如:

1
2
String s1 = new String("abc");//一旦这个字符串生成,则就是不可变的。
s1 = "def";//ok,这是新建了字符串def ,原来abc 会被GC回收

对于字符串而言,它是最常用的数据,所以,JVM针对它做了特殊处理;其次,专门有一个“串池”的内存空间来存放String实例,但是,字符串实例是否存放在串池中要由程序员的定义决定。

创建字符串

创建字符串的实例有如下两种方式:

  1. 普通方式[在堆空间中]
    1
    2
    3
    4
    String s1 = new String("abc");//ok
    String s2 = new String("abc");//ok

    System.out.println(s1 == s2);//false
  2. 串池方式
    1
    2
    3
    4
    5
    6
    String s3 = "abc";//ok
    String s4 ="abc";//ok

    System.out.println(s3 == s4);//true

    s4 = "xyz";//此时,会在串池中重新申请空间并存放 xyz,并把地址赋给s4
    由于字符串是不变对象,所以,它的每一次拼接都会产生临时对象。
    String s5 = “abc” + “def” + “xyz”;//abcdefxyz
    这个代码会产生5个对象,其中,2个临时对象。s5是引用,是地址。

所以,考虑到字符串的性能问题,JDK提供了StringBuilder拼接工作,它利用一个可变字符串数组来进行拼接。

StringBuilder和StringBuffer

StringBuilderStringBuffer这两个类的区别:

1.StringBuffer是多线程安全的类
2.StringBuilder是多线程不安全的类

本质上这两个类的功能一模一样,唯一不同的就是StringBuffer的所以方法都是同步的[synchronized]。

建议大家使用StringBuilder,因为大多数时候我们的环境都是单线程环境的。
即使是多线程环境,我们也可以自己加同步代码块来保证StringBuilder的多线程安全。

常用方法

...
...

字符的编解码操作

编码:把字符转换成字节的过程
解码:把字节转换成字符的过程

每一个字符背后都是一个整数[byte也是一种整数],所以,不同的字符集采用不同长度的编码,如:

ASCII 采用单字节
GBK 采用双字节编码
UTF-8 采用多字节[1~3]

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
String name = "张三丰";
//把此字符进行编码
byte[] arr = name.getBytes();//默认字符集
//
byte[] arr = name.getByte("UTF-8");

//也可以解码
String str = new Strin(arr);//默认字符集
String str = new String(arr,"UTF-8");//...

有关字符串的切割 --split方法
String str = "abc:def:::haha:heihei::";
String[] arr = str.split(":");

正则表达式

定义:就是一些有“特殊”功能的字符序列。
早先,JAVA并不支持正则表达式,从JDK1.4开始,引入了java.util.regex包,开始正式支持正则。

如何使用正则:

1.先把正则表达式[字符串]编译成Pattern实例
2.利用Pattern提供的方法或者进一步得到Matchr
3.利用Matcher进行匹配

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String regex = "a";
Pattern p = Pattern.compile(regex);//把这个字符串[正则]编译成Pattern实例
String str = "aaaab";//准备你要测试的字符串
Matcher m = p.matcher(str);//得到Matceher对象

//str.matches(regex);
//Pattern.matches(regex,str);

//接下来就可以使用Matcher的方法
m.matches(); 匹配一次,成功为true,否则为false
m.find();//依次去尝试匹配多次
m.group();//配合find使用
m.start();//配合find,匹配成功的起始位置
m.end();//配合find,匹配成功的最后位置
//...

日期

1
2
3
4
5
java.util.Date
\- java.sql.Date [专门针对数据库的数据类型]
Date的构造
public Date();
public Date(long millis);

注:在计算机中日期是使用一个长整型来表示的,它规定从1970年1月1日午夜开始到现在所经过的毫秒数。
通过 System.currentTimeMillils() 方法来获取这个值。
利用这个值可以来构建一个Date实例。

构建Date实例

如:

1
2
3
4
Date now = new Date(); //
//2个小时前
Date now2 = new Date(
System.currentTimeMillils()-2*60*60*1000);

构建一个 2008-8-8号? 怎么办?这就需要利用下面的Calendar类。

1
2
java.util.Calendar
\- java.util.GregorianCalendar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Code
Calendar cal = new GregiroanCalendar();
//但是不推荐这么做,因为使用了具体的子类,而应该:
Calendar cal = Calendar.getInstance();

//得到了日历类,就可以对它进行操作
//1. 可以修改时间 [通过长整型修改或通过修改年、月、日]
cal.set(Calendar.YEAR,2008);
cal.set(Calendar.MONTH,7);
cal.set(Calendar.DAY_OF_MONTH,12)

//2. 可以获取时间
Date now = cal.getTime();

//3.获取单个值
int year = cal.get(Calendar.YEAR);
..
int month = cal.get(Calendar.MONTH);

int week = cal.get(Calendar.DAY_OF_WEEK);
//注:返回的值是1~7, 1代表周日,7代表周六

日期的格式化

1
2
java.text.DateFormat
\- java.text.SimpleDateFormat

由于DateFormat中内置工厂方法的格式不符合我们的使用,所以,此处我们直接使用 SimpleDateFormat。

1
2
3
4
5
6
7
8
9
10
11
DateFormat df = DateFormat.getInstance();
//但是:
String p = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(p);
//现在,就可以利用sdf来格式化或解析一个字符串
如:
String str = "2008-08-8";
Date d1 = sdf.parse(str);
//
Date now = new Date();
String str2 = sdf.format(now); //2017-07-20

数字类

数字操作

包装类[Wrapper],也就是针对8种基本类型而言的。

基本类型 包装类型
byte Byte
short Short
int Integer
long Long
double Double
float Float
char Character
boolean Boolean

包装类就是基本类型的对象类型,并且基本类型与对应的包装类型之间可以自动解封箱。也就是它们之间可以自动转换。
如:

1
2
3
4
5
6
7
8
9
int i = 9;
Integer j = i;//自动封箱[auto boxing]
int k = j;//自动解箱[auto unboxing]

short s =19;
int i = s;//ok

Short s1 = new Short(19);
int i1 = s1;///ok

字符串与数字之间的转换

1
2
3
4
5
6
7
8
9
10
11
12
String iStr = "19";
Integer i = new Integer(iStr);//ok
//然后
int ii = i.intValue();//int ii = i; //ok

//或者利用parseInt方法
int k = Integer.parseInt(iStr);

int r = 119;
//String rStr = r +"";
//
String rStr = String.valueOf(r);

大数字类型

java.math.BigInteger 大整数
java.math.BigDecimal 大浮点数

原有的数字范围所不能表达的,就需要使用大数字。
如:

1
2
3
4
5
6
7
8
int i = 9;
int j = 19;
int k = i + j;

//换成大数据对象的计算:
BigInteger i = new BigInteger("9");
BigInteger j = new BigInteger("19");
BigInteger k = i.add(j);

数字的格式化 [美化数字]

数字和字符串之间的转换
如:
1358.6 => ¥1,358.6
以上的这个美化靠 String.valueOf做不到,需要使用NumberFormat 来进行。

#结束语
bye~

评论