第一章 Java数据类型
在计算机编程中,实体类型的实现必然会涉及到数据类型的概念
了解数据类型的分类、特性和管理的过程有利于更灵活地使用和理解计算机语言
本博客中,将对于Java中数据类型的划分、划分原因和其他的数据类型的区别做出讲解
并且利用实际的编程,深化对于不同数据类型产生和存储的理解
一、数据类型
(1) 基础数据类型
基础数据类型和其他数据类型的最大的区别是bit上的,在创立基础数据类型的时候,计算机会分配一个固定长度的内存来进行存储,本篇博客会给出数据类型对应的bit值。
Java中存在的4种主要的数据类型和它们对应的bit值:
- 整形(byte short int long)
- 浮点型(float double)
- 字符型(char)
- 布尔型(boolean)
名称 | bit值 | 名称 | bit值 |
---|---|---|---|
byte | 8 | float | 32 |
short | 16 | double | 64 |
int | 32 | char | 16 |
long | 64 | boolean | 8 |
//小小提示:关于bit值和可以表示的数字的范围可以自行思考,比较简单,这里省略~
(2) 引用数据类型
类 数组 接口
- String字符串
- 初始化默认值:null
- 创建的时候有两个原子操作,基础的数据类型就只有一个原子操作
String str;
str = " ";
- String类型和基本数据类型的区别
1)在内存中存在堆内存和栈内存,堆内存是共享的,而栈内存是私有的
2)在创建基础数据类型时,会在栈内存中直接占用一个固定大小(这个大小就和我们上面提到的bit值是一致的),在给数据赋值的时候,栈内存内的数据变动
3)而在创建String的时候,会在栈内存里面生成一个地址编码,这个编码指向堆内存中的一块内存,真正的数据存储在堆内存里面
4)如果比较两个String的话,其实是在比较两者的地址编码,而不是在比较其中的内容
直观的来看就是这样的:
而为什么要这样设置的原因,与所要表示的长度限制有关,比如String的长度位置,难以用bit来描述范围 - List类型和String类型同理:从概念上,它们都是类
//这个具体的更多之后展开补充~
二、编程比较
talk is cheap,show me the code~
为了更加了解上述的内存的区别,编写程序来判断储存的区别
(1) 对于多属性对象的相等判断
package com.cjx0929;
public class User{
// 编写User的属性
String name;
String id;
int age;
int[] list;
// 初始化
public User(String name, String id, int age,int[] list){
this.name = name;
this.id = id;
this.age = age;
this.list=list;
}
// 判断字符串是否相等的函数,如果长度不等就直接不等,如果相等再一个个比较内容
//也可以使用.equals()的方法进行比较,!=比较的是地址
public boolean equalsString(String a,String b) {
if(a.length()!=b.length())
{
return false;
}
for(int i=0;i<a.length();i++)
{
char c1 = a.charAt(i);
char c2 = b.charAt(i);
if(c1!=c2)
{
return false;
}
}
return true;
}
// 比较的是数组,思路和字符一致,长度相等就遍历比较
public boolean equalsArray(int[] a,int[] b)
{
if(a.length!=b.length)
{
return false;
}
for(int i=0;i<a.length;i++)
{
int c1 = a[i];
int c2 = b[i];
if(c1!=c2)
{
return false;
}
}
return true;
}
// 对所有属性进行遍历,调用之前写好的函数来判断
public boolean userequals(User anouser){
if(this.age!=anouser.age) {return false;}
if(!this.equalsString(this.name,anouser.name)|!this.equalsString(this.id,anouser.id))
{
return false;
}
if(!this.equalsArray(this.list, anouser.list))
{
return false;
}
return true;
}
//主程序判断
public static void main(String[] args){
User user1 = new User("Allen","allen01",20,new int[10]);
User user2 = new User("Allen","allen01",20,new int[10]);
// "".equals(user2)
System.out.println (user1==user2);
System.out.println(user1.userequals(user2));
}
}
输出结果
false
true
符合之前的学习知识,改变实例的值,发现也符合我们的判断~
(2) 对于字母内容不区别大小写情况下的相等判断
对于属性是字符串的形式,如果字母不区分大小写认为是相等的话,编程实现:
package com.cjx0929;
public class Alpha {
String name;
public Alpha(String name)
{
this.name = name;
}
// 可以将字母全部转化为大写的函数
public char transformAlpha(char a){
int number1= Integer.valueOf(a);
if(number1>96) {
int number2 = number1-32;
char b = (char)number2;
return b;
}
return a;
}
public boolean equalChar(Alpha b){
String name1 = this.name;
String name2 = b.name;
if(name1.length()!=name2.length())
{
return false;
}
for(int i=0;i<name1.length();i++)
{
char c1 = name1.charAt(i);
char c2 = name2.charAt(i);
if(c1!=c2)
{
char c3 = this.transformAlpha(c1);
char c4 = this.transformAlpha(c2);
if(c3!=c4)
{return false;}
}
}
return true;
}
public static void main(String[] args){
Alpha alpha1 = new Alpha("Alice");
Alpha alpha2 = new Alpha("AlicE");
System.out.println(alpha1.equalChar(alpha2));
}
}
输出结果
true