温故而知新---Java(一)
学习不仅要学习新的东西,而且还要时不时的回过头捡漏...
本文参考老马说编程系列等文,在此推荐大家关注老马说编程系列文章
正文
基础知识
数据类型主要是为了对数据进行分类,方便理解和操作,在Java中,有如下基本数据类型:
- 整数类型:有四种整型 byte/short/int/long,内存空间分别占用1/2/4/8个字节
- 小数类型:有两种类型 float/double,,内存空间分别是占用4/8个字节
- 字符类型:char,表示单个字符,内存空间是占用2个字节
- 真假类型:boolean,表示真假
对象是一种基本数据类型、数组和其他对象组合而成的一个比较复杂的数据类型
内存可以直接理解成一个很长的数组,CPU可以直接定位到内存中的任何一个位置
变量的起源是由于将数据类型置于内存后,为了方便地找到和操作这个数据,给这个位置起的一个名字;所以叫变量,是因为它仅仅表示的是内存中的位置,这个位置存放的值是可以变化的
内存表示
一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块,一块用于存储数组内容本身,另一块用于存储内容的位置。
上图在进一步解释,就是我们经常说的,基本数据类型保存的是值本身,而引用类型保存的是值所在的位置
运算规则
运算时要注意结果的范围,使用恰当的数据类型。两个正数都可以用int表示,但相乘的结果可能就会超,超出后结果会令人困惑
int a = 2147483647*2; //2147483647是int能表示的最大值
a的结果是-2。为什么是-2我们暂不解释,要避免这种情况,我们的结果类型应使用long,但只改为long也是不够的,因为运算还是默认按照int类型进行,需要将至少一个数据表示为long形式,即在后面加L或l,下面这样才会出现期望的结果:
long a = 2147483647*2L;
另外,需要注意的是,整数相除不是四舍五入,而是直接舍去小数位:
double d = 10/4;
结果是2而不是2.5,如果要按小数进行运算,需要将至少一个数表示为小数形式,或者使用强制类型转化,即在数字前面加(double),表示将数字看做double类型,如下所示任意一种形式都可以:
double d = 10/4.0; double d = 10/(double)4;
在进行小数运算的时候,经常会出现一些很奇怪的值,比如执行
这是由于计算机底层对于浮点数(小数)表示并不精确导致的,归根到底都是由于2进制的原因
自增/自减是对自己做加一和减一操作,但每个都有两种形式,一种是放在变量后,例如a++, a--,另一种是放在变量前,例如++a, --a
int a = 0;
System.out.println(a++);//
int b = 0;
System.out.println(++b);//
int c = 0;
System.out.println(c--);//
int d = 0;
System.out.println(--d);//-1
逻辑运算符具体有如下几种
- 与(&):两个都为true才是true,只要有一个是false就是false
- 或(|):只要有一个为true就是true,都是false才是false
- 非(!):针对一个变量,true会变成false, false会变成true
- 异或(^):两个相同为false, 两个不相同为true
- 短路与(&&): 和&类似,不同的是A&B,如果A是false还需在判断B是false,而A&&B,如果A是false,那么直接就是false
- 短路或 (||):与|类似,不同的是A|B,如果A是true还需在判断B是true,而A||B,如果A是true,那么直接就是true
补充
补码
二进制使用最高位表示符号位,用1表示负数,用0表示正数。但负数表示不是简单的将最高位变为1,比如:
- byte a = -1,如果只是将最高位变为1,二进制应该是10000001,但实际上,它应该是11111111。
- byte a=-127,如果只是将最高位变为1,二进制应该是11111111,但实际上,它却应该是10000001。
这种表示法称为补码表示法,而符合我们直觉的表示称为原码表示法,补码表示就是在原码表示的基础上取反然后加1。取反就是将0变为1,1变为0。为什么负数要使用补码的形式呢?这是因为补码在计算加减的时候能保证是正确的!
位移操作
左移:操作符为<<,向左移动,右边的低位补0,高位的就舍弃掉了,将二进制看做整数,左移1位就相当于乘以2。
无符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。
有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补什么取决于原来最高位是什么,原来是1就补1,原来是0就补0,将二进制看做整数,右移1位相当于除以2。
有的小数计算为什么是正确的
System.out.println(0.1f+0.1f); //0.2 System.out.println(0.1f*0.1f); //0.010000001
按照上面所说的,第一行应该不等于0.2才是正确的,但是为什么等于0.2呢?其实,这只是Java语言给我们造成的假象,计算结果其实也是不精确的,但是由于结果和0.2足够接近,在输出的时候,Java选择了输出0.2这个看上去非常精简的数字,而不是一个中间有很多0的小数。在误差足够小的时候,结果看上去是精确的,但不精确其实才是常态。如果真的需要比较高的精度,一种方法是将小数转化为整数进行运算,运算结束后再转化为小数,另外的方法一般是使用十进制的数据类型,这个没有统一的规范,在Java中是BigDecimal
温故而知新---Java(一)的更多相关文章
- 温故而知新(java实现)单例模式的七种写法
第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton ...
- 温故而知新java事务
一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java温故而知新-杨辉三角形
Java温故而知新-杨辉三角形 一. 先说需求 需求 打印输出杨辉三角形,行数可变,支持50行内的任意数. 预期结果如图所示 1 这是第几行呢,是第1 1 1 这是第几行呢,是第2 1 2 1 这是第 ...
- java基础--温故而知新 (01)
1 myeclipse是一个eclipse插件.使用java语言开发.进程是javaw.exe--非命令行方式启动. 2 考这些术语的公司,往往都是世界一流的好公司.(技术广度+英语) java ...
- 温故而知新之java的collection framwork
经常用到的List,Map等这些数据结构,都是来自于java的util包下,而java对于其整体设计,简称为collection framwork.(ps.其实,Map接口并不继承自collectio ...
- Java温故而知新-插入排序
插入排序 插入排序的基本思想是将待排序的元素依次插入序列合适的位置,然后将这个位置后面的元素依次向后移动一位 位置1 2 3 4 5 6 序列5 4 2 1 8 3 设第1位为最初始的基础元素,也就是 ...
- 《温故而知新》JAVA基础八
集合接口与泛型 定义: 集合接口会操作一系列相同属性数据的对象类型的数据结构,类似于数组,但是相对于数组来说更显得高端大气 集合的接口分为Collention和Map两大类,不直接操作,而是通过子类的 ...
- 《温故而知新》JAVA基础四
类的封装 定义:将类的一些信息隐藏起来,不允许外部的程序直接的访问,而是通过该类提供的一些方法来获取 好处:只能通过特定的法方法访问数据,保护了数据, 实现封装的步骤: 修改属性的可见性:(一般类属性 ...
随机推荐
- 去除IE10+上文本框巨丑无比的删除图标以及显示密码图标
去除IE10+上文本框巨丑无比的删除图标以及显示密码图标 IE浏览器总是让人喜欢让人厌,在最新的IE浏览器(IE10+)上使用表单时,文本框内后面会出现很巨丑无比的“删除图标”以及“显示密码图标”,如 ...
- thinkphp博客项目纪录
项目地址:http://files.cnblogs.com/files/wordblog/blog.zip
- Linux mint 18.1 / Ubuntu 16.04 安装steam
这里以Limit Mint 18.1为例: 安装steam: sudo dpkg -i steam.deb 运行后会有如下错误: 直接运行如下命令修复, 并自动启动steam: LD_PRELOAD= ...
- linux内存分配方法总结【转】
转自:http://www.bkjia.com/Linuxjc/443717.html 内存映射结构: 1.32位地址线寻址4G的内存空间,其中0-3G为用户程序所独有,3G-4G为内核占有. 2.s ...
- nvidia tx1使用记录--基本环境搭建
前言 之前有专门写过一篇nvidia tk1使用记录--基本环境搭建,本以为自己有过tk1的经验后,在tx1上搭建和它一样的环境会轻车熟路,结果却是在nvidia tx1上花的时间居然比tk1还多.我 ...
- linux initcall 介绍 (转自http://blog.csdn.net/fenzhikeji/article/details/6860143)
现在以module_init为例分析initcall在内核中的调用顺序 在头文件init.h中,有如下定义: #define module_init(x) __initcall(x); 很明显 ...
- css 水平、垂直居中
水平居中 行内元素 行内元素:(img.span.文字等行内元素),通过在父级元素设置 text-align:center 使元素水平居中. 块级元素 块级元素:(div.p.h1...h6.ul.l ...
- Android检测富文本中的<img标签并实现点击效果
本文旨在:通过点击一张图片Toast输出位置与url链接. 闲话少说,实现原理大概是酱紫的::通过正则表达式检测富文本内的图片集合并获取url,在src=“xxx” 后面添加 onclick方法,至于 ...
- MVC开发模式与javaEE三层架构
1.MVC开发模式 1. M:Model,模型.JavaBean * 完成具体的业务操作,如:查询数据库,封装对象2. V:View,视图.JSP * 展示数据3. C:C ...
- 深入理解 WordPress 数据库中的用户数据 wp_user
WordPress 使用 wp_users 数据表存储用户的主要数据,该数据表结构类似于wp_posts 和 wp_comments 数据表,存储的是需要经常访问的用户数据,该数据表的结构以及该数据表 ...