【Java基础】基本类型与运算【重要】

0.   Java基本数据类型

Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long、int、short、char和 byte,位运算符具体如下表:


运算符


说明


<<


左移位,在低位处补0


>>


右移位,若为正数则高位补0,若为负数则高位补1


>>>


无符号右移位,无论正负都在高位补0


&


与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。


|


或(OR),对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。


~


非(NOT),一元运算符。


^


异或(XOR),对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。


<<=


左移位赋值。


>>=


右移位赋值。


>>>=


无符号右移位赋值。


&=


按位与赋值。


|=


按位或赋值。


^=


按位异或赋值。

Java一共提供了8种原始的数据类型(byte、short、int、long、float、double、char、boolean),这些数据类型不是对象,而是Java中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立即在栈上被分配空间。除了这些基本类型外,其他类型都是引用类型,这类变量在声明时不会被分配内存空间,只是存储了一个内存地址。

注意:

1) 在Java中,默认声明的小数是double类型的,而整数默认是int类型。

2) 在Java中,null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。null是将引用变量的值全部置0。

 1.不可变类

http://www.cnblogs.com/qlqwjy/p/7944456.html

不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。

下面的理解可能会易懂一些:

{概念:不可变类的意思是创建该类的实例后,该实例的属性是不可改变的。Java中的8个包装类和String类都是不可变类。所以不可变类并不是指该类是被final修饰的,而是指该类的属性是被final修饰的。

自定义不可变类遵守如下原则:

1、使用private和final修饰符来修饰该类的属性。

2、提供带参数的构造器,用于根据传入的参数来初始化属性。

3、仅为该类属性提供getter方法,不要提供setter方法。

4、如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。}

2.   值传递与引用传递的区别

1)值传递:方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

2)引用传递:也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,所以方法执行中形式参数的改变将会影响实际参数。

注意:

在Java中,原始数据类型在传递参数时都是按值传递,而包装类型在传递参数是是按引用传递,但包装类型在进行计算的时候会自动拆箱。

参考:JDK1.5新特性

3.   不同数据类型的转换规则

当参与运算的两个对象的类型不同的时候就需要进行类型的转换(显式或者隐式),隐式转换规则是从低精度到高精度,byte

自动类型转换

低级数据可以自动转换为高级数据类型。
1. char转换为高级类型的时候如int或者long等,会自动转换为其对应的ASCII码
2. byte char short在参与运算的时候会自动转换为int,但是使用+=运算的时候不会发生转换
3. 基本数据类型和boolean之间是不能发生转换的
多种类型数据混合运算的时候,会自动转换为最高级类型之后进行计算。

强制类型转换

从高级数据类型转换为低级数据类型的时候就需要进行强制类型转换
byte -> char
char -> byte char
short -> byte char
int -> byte short char
long -> byte short char int
float -> byte short char int long
double -> byte short char int long double

强制转换注意:
例如对于short s = 1; s = s + 1; 由于s + 1会强制转化为int进行计算,所以在赋值(s =
s+1)的时候就出现int型赋值给short,就会报错(cant conver XXX)。所以需要显式的转换一下s=(short)(s+1);

但是由于+=运算符是Java语言规定的算法,所以s+=1并不会报错。

4.   运算符的优先级

    public class Test{
           publicstatic void main(String[] args){
                  bytea = 5;
                  intb = 10;
                  intc = a >> 2 + b >> 2;
                  System.out.println(c);
           }
    }

答案为0,由于“+”的优先级比“>>”高,因此程序中的表达式等价于a>>(2 + b)>>2。

5.   左移右移操作

1) 左移(<<):将参与运算的对象对应的二进制数左移指定位数,右位补0,高位左移后溢出就舍弃。左移n位表示原来的值乘2的n次方,经常用来代替乘法操作,因为CPU直接支持位运算,故位运算比乘法运算的效率高。

2) 右移分为有符号右移(>>)和无符号右移(>>>)。二者的不同点在于“>>”在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1.而”>>>”则不同,无论参与位运算的数字为正数或为负数,在执行运算时,都会在高位补0.

注意:

1) 在对char、byte、short等类型的数进行移位操作前,编译器都会自动地将数值转化为int类型,然后才进行移位操作。

2) 在Java中,为了保证移位的有效性,采用了取余的操作,即a>>n等价于a>>(n%32)。

6.   char型变量存储中文汉字

在Java中,默认使用的Unicode编码方式,即每个字符占用两个字节,因此可以用来存储中文。虽然String是由char所组成的,但是它采用了一种更灵活的方式来存储,即英文占用一个字符,中文占用两个字符,采用这种存储方式的一个重要作用就是可以减少所需存储空间,提高存储效率。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;  

    public classTest {  

       public static voidjudgeChineseCharactor(String str){
          StringregEx= "[\u4e00-\u9fa5]";
          //判断是否存在中文字符
          if(str.getBytes().length == str.length()){  //一个汉字占两个字节
             System.out.println("无汉字");
          }else{
             Patternp = Pattern.compile(regEx);
             Matcherm = p.matcher(str);
             while(m.find()){
                System.out.print(m.group(0) + "");
             }
          }
       }  

       public static void main(String[] args) {
          judgeChineseCharactor("Hello World");
          judgeChineseCharactor("Hello 你好");
       }  

    }

在上例中,首先通过字节长度和字符串长度判断字符串是否包含中文字符,若包含,则用正则表达式匹配的方式找出字符串中的所有中文字符

时间: 2024-10-12 04:04:21

【Java基础】基本类型与运算【重要】的相关文章

Java基础--基本类型与运算

八个基本类型: boolean/1 byte/8     -2^7~2^7-1 char/16    0~2^16-1 short/16   -2^15~2^15-1 int/32      -2^31~2^31-1 float/32 long/64    -2^63~2^63-1 double/64 每个基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成. Integer x = 2; // 装箱 int-->Integer int y = x; // 拆箱

黑马程序员--Java基础--基本类型

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 变量.JAVA基本类型.运算符和表达式 目录: 1变量 2JAVA基本类型 3运算符和表达式 1. 变量 1.1. 什么是变量 在日常生活中,人们会用到大量的数据,像去ATM机取款,首先,需要插入银行卡,这个过程其实就是ATM机的系统在获取银行卡号这个数据,而后,输入密码,这个过程也是在获取数据,也就是密码.在后续进行的业务处理中,像存钱.取钱.转帐汇款等等,银行卡号和密码会被反复的.频繁的使用, 那就需要一

Java基础东西(按位操作运算)

http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:"这都不会啊,都是Java基础的东西呀!"我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈.因此,把心得总结如下,欢迎收看. 在这里先感谢一下,JavaEye上的高手们的技术博客指点.TKS very much. 技术总结:

关于java中Double类型的运算精度问题

标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);        System.out.println(1.0-0.42);        System.out.

java 基础 浮点类型

1.浮点类型用于表示小数的数据类型. 2.浮点数原理:也就是二进制科学计数法. 3.Java的浮点类型有float和double两种. 4.Java默认浮点类型计算的结果是double类型,字面量也是double类型. 1.十进制浮点数科学计数法: 219345 = 2.19345*(10^5) 2.二进制浮点数科学计数法: 10111 = 1.0111*(2^100) 1.float类型共32位,1位为符号位, 指数8位, 尾数23位. 2.float的精度是23位(即能精确表达23位的数,超

java 基础 整数类型

1.Java有四种整数类型:byte.short.int和long. 2.Java默认整数计算的结果是int类型. 3.整数的字面量是int类型. 4.若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L(或l)表示该值是long类型. byt b = 5; byt a = b + 5;错误 int a =  b + 5;正确 byt a = 122 + 5;正确 byt a = 123 + 5;错误,超出范围

java 基础 字符类型

1.char类型的字面量可以是一个英文字母.字符或一个汉字,并且由单引号包括. 2.Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值. unicode: 1.unicode编码是全球范围内的编码方法. 2.unicode编码的英文部分与ASCII码兼容(ASCII表示范围0~128), 同时英文字符和数字是连续编码的. 3.Java在处理char类型的数据时,在底层是按unicode码来处理的. 编码是什么? 计算机硬件系统只能用0和1表示数,我们人为地做了

Java基础——基本类型包装类型的引入(1)

基本类型包装类型的引入 1.概述 基本类型就是我们之前所说的类似int.String.float等常用的一些数据类型,这一些是基本的数据类型,为了对基本类型数据进行更多的操作 ,以及更方便的操作,Java针对每一种数据类型提供了相应的类类型,即包装类型. 2.对应关系 byte(Byte).short(Short).int(Integer).long(Long).float(Float).double(Double).char(Character).boolean(Boolean) 3.详解(1

13. Java基础之类型信息(RTTI和反射)

一. 背景 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). Java是如何让我们在运行时识别对象和类的信息的,主要有两种RTTI的方式,一种是"传统的"RTTI,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 二. RTTI RTTI(Run-Time Type Infomation),运行时

Java基础_自加运算

int a = 4, b = a++; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=4 int a = 4, b = ++a; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=5 * a:单独使用: 放在操作数的前面和后面效果一样.(这种用法是我