JAVA基础知识之数据类型
JAVA的数据类型知识点主要包括基本数据类型,包装类,字符串类(String,StringBuffer, StringBuilder区别和用法),数组,数据类型转换等等,暂时只想到这么多,后面会再补充。
1.基本数据类型
重点是JAVA变量分为原始变量和包装变量,另外变量初始化时要注意变量类型能表示的范围以及精度的损失。
a.八种基本类型为 byte(8bit), short, int(32bit), long, float, double, boolean, char
b.对应封装类型为Byte,Short,Integer,Long,Float,Double,Boolean,Character
c.Java中的数值类型都是有符号的,取值范围是固定的,不随硬件环境和操作系统改变。
d.封装类和原始类型有以下不同点
- 原始类型做参数传递时是值传递,封装类型是按引用传递
- 封装类的对象初始值是null,但原始类型的变量的默认值不是。(int默认初始化为0)
e.Java中直接写的小数是double类型,直接写的整数是int类型,因此要注意类型转换时的精度损失以及表示范围,例如
- float f = 3.4 是会有精度损失的,正确写法是 float f = (float)3.4 或者 float f = 3.4F
- int a = 3; long b = a; int类型无法表示一个非常大的数,应写成 long b = aL 或者 long b = (long) a ???
f.null表示什么?如何理解String x = null
null仅仅表示该引用目前没有指向任何对象,编译器不会分配内存, null是将引用变量的值置0.
字符串类
Java字符串存储机制(内存分配方式)
对于String s1 = new String("abc"); String s2 = new String("abc");
两个引用对象s1和s2虽然内容相同都是"abc",但是s1和s2指向堆内存中不同的对象。
对于String s1 = "abc"; String s2 = "abc"
s1和s2引用的是同一个常量池中的对象,即,如果常量"abc"的对象已经存在【判断依据是equals(Object obj)的返回值】,则不会创建新的对象。
总结如下
String s1 = "abc";// s1指向常量区字符串对象"abc"
String s2 = "abc";// s2也指向常量区字符串对象"abc", s1和s2指向的是常量区的同一个对象,因此这里不会创建新对象
String s3 = new String("abc");// s3指向在堆中创建的新对象,此对象内容为abc
String s4 = new String("abc");// s4指向在堆中创建的另一个新对象,此对象内容为常量区的abc,但是s3和s4各自指向堆中不同的对象
典型面试题:
1.String s = null 和String s = ""是否相同?
答,不同。对于s = null,是定义一个字符串类型的引用,但是它不指向任何一个字符串对象。
对于s = ""; s是一个字符串的引用,它指向了另一个字符串对象,而且那个对象的内容为"",即空串。
2. new String("abc") 创建了几个对象
答,一个或两个。new会创建一个。另外,如果常量池中已经有"abc"字符串,就不会再在常量区创建一个字符串对象,反之如果常量区还没有"abc"字符串对象,就会在常量区再创建一个字符串abc。
字符串的比较 == , equals 和 hashCode
== 用来直接比较两个变量对应的值是否相等
例如,如果两个变量都是基本类型的变量,则是直接比较他们的值是否相等,如果两个变量指向的是对象类型的变量,则是比较这两个对象的首地址是否相等。
equals通常用来比较对象
equals方法是可以被子类覆盖的,如果没有覆盖,默认equals也是用==的方式做比较,比较的是对象首地址,首地址相同,则这两个对象是同一个对象。
而被覆盖后的方法就不一定了,例如String类中的equals,是比较对象指向的内容,而不是比较对象的首地址。
所以对于 String s1 = new String("abc");String s2 = new String("abc"); s1==s2 为false, 但是 s1.equals(s2)为true.
hashCode,如果hashCode没有被重写过,就返回该对象地址的编码值,否则是用来返回一个对象编码后的int值
那么为什么需要重写hashCode呢,这是为了保证与hash有关的集合类数据的一致性(HashSet, HashMap等)
首先来看看hashSet的put流程,先判断对象的hashCode在HashSet中是否已经存在,如果不存在,则存入对象;如果存在,则在用equals
判断一下该对象和存在的对象是否相等,如果相等,则不再插入;如果不相等,则根据具体算法将对象存放其他地方。(相同hashCode索引的对象,按链表存放?)
那么现在的问题是,在HashSet中,判断两个对象是否相等是用equals的,这要求在equals判断相等时,hashCode也必须相等才能在逻辑上符合对象相等。
假如两个对象通过equals相等,但是hashCode不相等,那么在HashSet中就会出现重复对象,这是不符合HashSet特征的。
所以就要求,在重写了equals方法之后,也必须重写hashCode方法,使得equals与hashCode符合下面的要求,
对于equals()相等的两个对象,其hashCode()返回的值一定相等
同时还能得到,对于equals不相等等两个对象,其hashCode可能相等,也可能不等(参见前面Hash容器存储原理)
String, StringBuffer, StringBuilder的区别
String
String是不可变类,一旦创建则不可以修改。String在实例化时可以用构造方式或者赋值方式。
StringBuffer
对象创建后仍然可以修改值。如果要修改String对象的值(内容),值能借助StringBuffer间接实现,但是会产生额外临时对象,影响效率。
String修改原理如下。
String s = "hellow"; s+="World";
以上代码等价为:
StringBuffer sb = new StringBuffer(s);
sb.append("world"); s = sb.toString();
下面来验证这个结论:
String s= "hellow";
String stmp = s;
s+="World";
System.out.println(stmp==s);//输出false
第二个
StringBuffer sb = new StringBuffer("hellow");
StringBuffer sbtmp = sb;
sb.append("world");
System.out.println(sbtmp==sb);//输出true
StringBuilder
与StringBuffe相似,都支持字符串修改,都在字符串缓冲区进行。区别是StringBuilder不是线程安全的。
因此这三个字符串类的执行效率是 StringBuilder > StringBuffer > String.
因此如果操作数据比较少,优先用String,如果单线程下数据量比较大,优先用StringBuilder, 如果在多线程下操作大量数据,则用StringBuffer.
数组
- Java中数组是不是对象:Java中的数组不仅有属性(length等),也有自己的方法(clone等),从这个角度来说JAVA数组是对象。
- JAVA数组的初始化
- type arrayName[]; 或者 type[] arrayName
- 与C++不同的是,JAVA数组被创建后会默认初始化,例如int类型会将元素初始化为0,对象则会初始化为nll
- JAVA数组在定义时,不会为数组元素分配存储空间,因此[]中不需要指定长度。而在使用时需要分配空间,例如: arrayName = new type[size]
- length属性与length()方法的区别
- length属性用来获取数组的长度
- length()方法用来计算字符串长度。
数据类型转换
基本数据类型转换
JAVA基本数据类型转换分两种
1.自动转换
从存储范围小的类型到存储范围大的类型
自动转换也叫隐式转换,由JVM自动完成,不需要额外编程,
具体规则为:byte→short(char)→int→long→float→double
例如: byte b = 10; short sh = b; byte自动向short类型转换
2.强制转换
从存储范围大的类型到存储范围小的类型
需要显示地进行类型转换,
具体规则为:double→float→long→int→short(char)→byte
例如 double d = 3.10; int n = d; double强制转换成int,(虽然没有语法错误了,但是还是会有精度损失,不同类型损失精度也不同)
注意,默认情况直接写小数,JVM会认为是double类型,直接写整数,会默认为int类型,
所以 float f = 3.4是无法通过编译的,需要写成 float f = (float)3.4, 或者 float f = 3.4F;
short sh = 5也是无法通过编译的,要写成short sh = (short)5;
基本数据类型和包装类之间的转换
string->byte
Byte static byte parseByte(String s)
byte->string
Byte static String toString(byte b)
char->string
Character static String to String (char c)
string->Short
Short static Short parseShort(String s)
Short->String
Short static String toString(Short s)
String->Integer
Integer static int parseInt(String s)
Integer->String
Integer static String tostring(int i)
String->Long
Long static long parseLong(String s)
Long->String
Long static String toString(Long i)
String->Float
Float static float parseFloat(String s)
Float->String
Float static String toString(float f)
String->Double
Double static double parseDouble(String s)
Double->String
Double static String toString(Double)
基本
JAVA基础知识之数据类型的更多相关文章
- (6)java基础知识-基本数据类型、数据类型转换
一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte: 1字节 取值范围 -128~127 short: 2字节 取值范围 -32768~32767 int: 4字节 取 ...
- 01-Java基础知识:数据类型与变量、标识符、运算符、表达式
Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2). int ( ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
- Java 基础知识(一)
Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...
- java 基础知识三 java变量
java 基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
随机推荐
- PostgreSQL Replication之第十章 配置Slony(4)
10.4 部署DDLs 对于生产性的应用程序来说,仅仅复制一个表明显是不够的.此外,通过没有办法保证数据从来不会发生改变.在某些时候,部署变化的数据结构(所谓的DDLs)是必要的. 现在的问题是,Sl ...
- VCL 如何加载Gif图片和Png图片
加上头文件#include <Vcl.Imaging.GIFImg.hpp> #include <Vcl.Imaging.pngimage.hpp> Image1->Pi ...
- [reprint]useful linux commands
linux一说都是搞开发玩的,敲敲键盘就能完成所有的工作.其实你也可以这么玩,玩游戏的除外哦. 那我们就来侃侃如何玩,linux是命令的天下,高级的命令那是相当的多,但是我们正真用到的也就那么几个看你 ...
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- have you declared this activity in your AndroidManifest.xml
对于那些刚开始接触安卓的开发者来说,遇到这个问题再正常不过了,出现这种问题的原因大概可分为: 1.android的四大组件都必须在AndroidMainifest.xml里面声明,所以首先看看有没有在 ...
- 封装mysql类
类: <?phpheader("content-type:text/html;charset=utf-8");//封装一个类/*掌握满足单例模式的必要条件(1)私有的构造方法 ...
- JS 实现中英文翻译
缺点就是还是会闪出中文,但是效果还行. var langPackage = { "主题":"Title", "下一页":"Next ...
- DDR3命令状态(二)
DDR3中的状态机Diagram,详见相册. ACT:Activate,表示输出行地址,和是否自动precharge控制位. PRE:Precharge,在读写后,可以根据A10来判断是否自己进行pr ...
- 在desk于webi中资料查询不一致
1,首先检查是否勾选重复列,重复列造成 2,缓存
- 「thunar」给thunar增加搜索文件功能
1.安装catfish sudo apt-get install catfish 2.配置thunar,添加[自定义动作] 打开 Thunar 后,点击 Edit -> Configure cu ...