数据类型
废话不多说,在 Java 中数据类型分为两大类:基本类型和对象类型。
基本类型(8种)
- 在Java中,最高位代表符号位,1为负,0为正。以8位二进制为例,所以:
对象类型
所有不是基本类型的都是对象类型,如: String 、 System …所以,我们编写程序,也就是不断地创建类型。因为我们想表达我们要表达的数据。下面介绍三种常用的对象类型。
字符串
定义
有关字符串类型, java.lang.String 类,它的本质就是 char[] ,它的实现代码:
public final class String implements CharSequence{
private char[] content;
private int capacity;
private int index;
//...
}
也就是说,字符串就是由字符数组组成的。但是,String是不变类,它的实例也就是不变对象。
如:
String s1 = new String("abc");//一旦这个字符串生成,则就是不可变的。
s1 = "def";//ok,这是新建了字符串def ,原来abc 会被GC回收
对于字符串而言,它是最常用的数据,所以,JVM针对它做了特殊处理;其次,专门有一个“串池”的内存空间来存放 String实例 ,但是,字符串实例是否存放在串池中要由程序员的定义决定。
创建字符串
- 普通方式[在堆空间中]
String s1 = new String("abc");//ok
String s2 = new String("abc");//ok
System.out.println(s1 == s2);//false
- 串池方式
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
StringBuilder 和 StringBuffer 这两个类的区别:
本质上这两个类的功能一模一样,唯一不同的就是 StringBuffer 的所以方法都是同步的[synchronized]。
建议大家使用 StringBuilder ,因为大多数时候我们的环境都是单线程环境的。 即使是多线程环境,我们也可以自己加同步代码块来保证 StringBuilder 的多线程安全。
常用方法
int length();//获取长度
boolean isEmpty();//判空
char charAt(int index);//根据位置获取字符
byte [] getBytes();//转化为字节数组
boolean equals(Object anObject);//判等
boolean startsWith(String prefix);//是否以prefix为前缀
int indexOf(int ch);//ch第一次在原字符串中出现的位置
String substring(int beginIndex, int endIndex);//获取子串
String concat(String str);//拼接
String replace(char oldChar, char newChar);//替换
String[] split(String regex, int limit);//分割
//...
可以参考官网api,地址:。
字符的编解码操作
编码 :把字符转换成字节的过程 解码:把字节转换成字符的过程
每一个字符背后都是一个整数[byte也是一种整数],所以,不同的字符集采用不同长度的编码,如:
ASCII 采用单字节
GBK 采用双字节编码
UTF-8 采用多字节[1~3]
如: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进行匹配
如:
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,匹配成功的最后位置
//...
日期
java.util.Date
\- java.sql.Date [专门针对数据库的数据类型]
Date的构造
public Date();
public Date(long millis);
注:在计算机中日期是使用一个长整型来表示的,它规定从1970年1月1日午夜开始到现在所经过的毫秒数。 通过 System.currentTimeMillils() 方法来获取这个值。 利用这个值可以来构建一个Date实例。
构建Date实例
Date now = new Date(); //
//2个小时前
Date now2 = new Date(
System.currentTimeMillils()-2*60*60*1000);
构建一个 2008-8-8号 ? 怎么办?这就需要利用下面的 Calendar 类。
java.util.Calendar
\- java.util.GregorianCalendar
//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代表周六
日期的格式化
java.text.DateFormat
\- java.text.SimpleDateFormat
由于DateFormat中内置工厂方法的格式不符合我们的使用,所以,此处我们直接使用 SimpleDateFormat。
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种基本类型而言的。
包装类就是基本类型的对象类型,并且基本类型与对应的包装类型之间可以自动解封箱。也就是它们之间可以自动转换。 如:
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
字符串与数字之间的转换
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 大浮点数
原有的数字范围所不能表达的,就需要使用大数字。 如:
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 来进行。
变量常量字面量
变量
变量,variable,是一种可以变化的量。 语法:
数据类型 变量名 [= 初始值]; []代表可以省略
变量名,由字母、数字、_组成,并且不能以数字开头。
如:i,a,ai,haha,a5...
注:给变量命名时尽可能地有意义[见名知意]
如:定义一个变量来存储年龄
int age;//变量没有初始化
age = 10;//给变量赋值
以上两行语句也可以合在一起:
int age = 10;
//定义一个长整型变量,并初始化为100.
long a = 100L; //长整型字面量以L或l结尾
//定义一个浮点数变量
double height = 176.5;
//单精度浮点
float weight = 68.5F;//以F或f结尾
常量
常量[literal],是不变的变量。 语法:
final 数据类型 常量名 = 初始值;
如:
int i = 100;
i = 90;//ok
final int J = 200;//常量
J = 230;//error
注:
常量名一般采用大写字母。
如:
final String MSG = "hahaha";
字面量
字面量[constant],“双引号括起来的”,就是字面本身的量。
只有8种基本类型以及字符串String才有字面量。
如:1,4,5,100L,true,false,'a',"abc";
作用:用来给变量或者常量赋值。
相关知识
了解计算机存储数据的方式
计算机存储数据的方式采用二进制【由0和1组成】
规定每8位为一个字节。
这样,1个字节所能表达的状态有:2^8=256 种
有关字符的表达方式
在Java中,字符使用 单引号 括起来,它有如下三种表达方式:
A.普通表达方式,每对单引号中只能有唯一的字符。
char c1 = 't';
B.特殊字符表达式[使用转义符转义过的]
char c3 = '\t';//制表符
这类特殊字符有:
'\r' 回车
'\n' 换行
'\'' 单引号
'\\' 反斜杠
'\"' 双引号
...
C.采用 UNICODE 字符表示法
语法:'\u 4位16进制表示法'
如:
char c1 = '我';
改成unicode表示法:
char c1 = '\u6211';
通过jdk提供的 native2ascii.exe命令可以把任意的中文转换成unicode字符码
ctrl + C 退出
字符是一种特殊的整数。 Java采用双字节编码,就意味着它可以表达 2 ^ 16 = 65536 个字符
在计算机中,要存储字符,都需要把字符转换成整数,进而成为二进制。这就需要字符映射表,也就是码表【字符集表】。 计算机中最原始的字符集是 ASCII码表 ,不同的码表对字符的码表是不一样的,其中, ASCII码表 采用单字节编码,也就是它最多可编256个字符。
中文字符集采用双字节编码,但是,为了向上兼容 ASCII 码值,前256的值与 ASCII 码一模一样,这样就兼容了 ASCII码表 。【所有主流的字符集都会无条件向上兼容 ASCII码表 】 中文字符集: GB2312 -> GBK 全球统一的字符集: UTF-8 [支持中文],它采用动态编码技术。
类型转换
- 隐式类型转换 。当小范围变量、字面量赋值给大范围变量时发生。如:
byte b1 = 12;
int i = b1;//ok
char c = 'a';
i = c;//ok,结果是 97
- 显示类型转换【强制类型转换。 当大范围变量、字面量赋值给小范围变量时发生。 语法:(新类型)变量或者表达式或者字面量。
int i = 97;
char c = i;//error,有可能丢失精度
char c = (char)i;//ok,做了强制类型转换
结束语
欢迎关注公众号「Java全栈笔记」,获取更多Java知识。