您的位置 首页 java

再也不怕被问到Java中有哪几种数据类型了?建议收藏

数据类型

废话不多说,在 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实例 ,但是,字符串实例是否存放在串池中要由程序员的定义决定。

创建字符串

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

System.out.println(s1 == s2);//false  
  1. 串池方式
 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知识。

文章来源:智云一二三科技

文章标题:再也不怕被问到Java中有哪几种数据类型了?建议收藏

文章地址:https://www.zhihuclub.com/185643.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图