JAVA 基础数据类型

Java是一种强类型语言, 这就意味着必须为每一个变量声明一种类型, 在Java中一共有8种基本类型, 其中有4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真值的boolean类型

整型

整型用于表示没有小数部分的数值,它允许是负数. 

java提供了4中数据类型

  • int    4字节 32位
  • short    2字节 16位
  • long    8字节 64位, 长整型数值有一个后缀L或l
  • byte    1字节 8位

java中int类型与机器无关

16进制数值有一个前缀0x或者0X; 8进制有一个前缀0, 010并不是十进制的10而是二进制的8, 此处也是容易混淆; 从Java7开始,加上前缀0b或0B就可以写二进制数; 并且在java7开始, 就可以用_来表示千分法,例如1_000就表示1千

浮点型

浮点型用于表示有小数部分的数值, 在java中有两种浮点型

  • float    4字节
  • double    8字节

double表示的这种类型的数值精度是float类型的两倍, 绝大部分应用程序double类型, float类型的数值有一个后缀F或f, 没有后缀F的默认为double类型, 当然也可以在后面加上后缀D或d.

用于表示溢出和出错的三个特殊浮点型, 例如 : 一个正整数除以0的结果为无穷大, 0/0或者负数的平方根结果为NAN

  • 正无穷 Double.POSITIVE_INFINITY
  • 负无穷 Double.NEGATIVE_INFINITY
  • NAN Double.NAN, 注意不能用这个来判断一个数是不是NAN, 他自己甚至不等于他自己, 可以使用Double.isNaN() 来判断

char类型

char类型原本用于表示单个字符

char类型的字面量要用单个引号括起来, 建议不要再程序中使用char类型

Boolean类型

boolean类型有两个值, false和true,用来判断逻辑条件, 整型值和布尔值之间不能进行相互转换.

在python中, 数值或者对象都可以代替boolean值, 值0或者长度等于0的内建对象都是False, 

运算符

在java中使用 +,-,*,/表示加减乘除运算.

当参与/运算的两边都是整数时, 表示整数除法,否则表示浮点除法. 整数的求余操作用%表示,

整数被0除时将会产生一个异常, 而浮点数被0除将会得到无穷大或NAN的结果

更多的数学计算都可以在Math库中找到, 比如

import java.lang.Math;
public class Hello {
    public static final int a = 1 ;

    public static void main(String[] args){

        System.out.println(Math.pow(2,3)); // 2**3
        System.out.println(Math.sqrt(4)); // 4的平法根
    }
}

自增,自减

n++,++n 将n当前的值加1

n-- ,--n 将n当前的值-1

这种方法会改变变量的值, 所以不能是数值来操作: 4++

前缀形式会先进行自加操作, 后缀形式会先进行运算操作后进行自加

public class Hello {
    public static void main(String[] args){
      int a=1,b=1;
      int c = a++;
      int d = ++b;
      System.out.println(c); //1
      System.out.println(d); //2
    }
}

比较运算

 == , != , >, < , >=, <=

逻辑运算

&&(与), ||(或), !(非)

&&和|| 是按照短路运算方式来求值的, 第一个操作数能够确定表达式的值, 后面的就不会再计算

三元表达式

表达式? 表达式为真时返回的值:表达式为假是返回的值

位运算符

处理整型是, 可以对各个为进行操作

  • &(and) 两位全部为1是, 这位就是1
  • |(or) 两位有一位为1, 这位就是1
  • ^(xor) 异或, 两个值不同返回1
  • ~(not) 取反
  • >> 左移, 舍弃低位数,前面填充0
  • << 右移 舍弃高位数

数值类型之间的转换

当所占字节数少的向所占字节多的类型转换时, 精度不会丢失, 但是下列几种情况有可能会产生精度丢失

  • int --> float
  • long --> float
  • long --> double

自动转换

当两个数值计算时, 都要先转化存储成同一类型, 然后在进行计算

  • 如果两个数中有一个是double类型, 另一个操作数就会转化为double类型
  • 否则, 有一个数是float类型, 另一个操作数就会转换成float类型
  • 否则, 有一个数是long类型, 另一个操作数就会转换成long类型
  • 否则, 两个操作数都将会变成int类型

强制转换

有时候需要进行除自动转换之外的转换, 比如double转换为int, java中允许强制类型转换来实现这样的操作,

public class Hello {
    public static void main(String[] args){
      double a=1.98;
      int b = (int)a;
      System.out.println(b);
    }
}

  强制类型转换来转化浮点数是通过截断小数部分来转换的, 如果想四舍五入可以使用Math.round()方法

如果要转化的类型的长度少于原来的长度, 就会产生一个完全不同的值, 超过部分将会被舍弃

字符串

java没有内置的字符串类型, 而是在标准java类库中提供了一个预定类, 叫做String. 每个用双引号括起来的字符串都是一个String类的一个实例

public class Hello {
    public static void main(String[] args){
     String s = "你好师姐";
     System.out.println(s);
    }
}

一些方法

public class Hello {
    public static void main(String[] args){
     String s = "你好师姐";
     System.out.println(s.length()); // 返回字符串的长度
     System.out.println(s.equals("你好师姐")); // 检测两个字符串是否相等
     System.out.println(s.equalsIgnoreCase("你好师姐")); // 检测两个字符串是否相等, 不区分大小写
     /*
     注意不要用==来判断两个字符串是不是相等, 这个运算符只能够确认两个字符是否放置在同一位置上,实际上只有字符常量是共享内存的, 而+或者substring等操作产生的结果并不是共享的
     */
     System.out.println(s.substring(0,2)); // 提取子串,顾头不顾尾, 重载可以只指定其实位置
     System.out.println(s.startsWith("你")); // 判断是否以某字符串开头
     System.out.println(s.endsWith("姐")); //判断是否以某字符串结尾
     System.out.println(s.indexOf("姐",2)); // 返回子串开始的位置, 可以指定开始查找的位置, 找不到返回-1
     System.out.println(s.replace("师姐","师妹")); // 返回一个替换后的新字符串
     System.out.println(s.toLowerCase()); // 全部变小写
     System.out.println(s.toUpperCase()); // 全部变大写
     System.out.println(s.trim()); // 去除两边空格
     System.out.println(String.join(" ","你","好","师","姐")); // 用第一个元素把后面的字符串连接起来
     System.out.println(String.format("%s, %s","你好","师姐")); // 字符串格式化
    }
}

  实际上字符串属于不可变数据类型,上面实际上都是返回了一个新的字符串, 像连续+的拼接实际上是很浪费时间空间的,使用StringBuilder类可以避免这个问题的发生

public class Hello {
    public static void main(String[] args){
     StringBuilder i = new StringBuilder();
     i.append("你"); // 在后面添加字符
     i.append("好");
     System.out.println(i.toString()); // 转换成字符串
     i.append("师姐");
     System.out.println(i.toString());
     i.insert(2,","); // 在指定位置插入
     System.out.println(i.toString());
     i.setCharAt(4,'妹'); // 修改指定位置的字符
     System.out.println(i.toString());
     i.delete(2,3); // 删除指定位置的字符串
     System.out.println(i.toString());
    }
}

数组

数组是一种数据结构,用来存储同一类型值的集合, 通过一个整型的下标可以访问数组的每一个值,

在声明数组变量时,需要指出数组类型(数组元素类型紧跟[])和数组变量的名字. 

int[] a;

不过这条语句只声明了变量a, 并没有将a初始化为一个真正的数组, 应该用new运算符创建数组

int[] a = new int[100]

创建一个数字数组时, 所有的元素初始化为0, 布尔数组的元素初始化为false, 对象数组的元素则初始化为一个特殊值null

除了使用new来初始化之外, 还可以通过{} 在声明时初始化

int[] list={1,2,3,4,5,6}

匿名数组: 创建一个新数组并用括号中的值进行初始化, 数组的大小就是初始值的个数, 使用这种方法可以快速的初始化一个新的数组

public class Hello {
    public static void main(String[] args) {
        int[] list;
        list = new int[]{1,2,3,4,5,6};
    }
}

一旦创建了数组, 就不能再改变他的大小(但是可以改变数组中的元素), 如果经常需要在运行过程中扩展数组的大小,  就应该使用另一种数据结构-数组列表(array list)

数组拷贝

public class Hello {
    public static void main(String[] args) {
        int[] list = {1,2,3,4,5};
        int[] list2 = list;
        list2[1] = 100;
        for (int a: list){
            System.out.println(a);
        }
    }
}

当使用赋值的方式设置另一个列表时, 这两个变量指向的是同一个地址, 修改一个是另一个也会随之改变

如果不希望产生这样的结果,可以使用Arrays.copyOf()方法

public class Hello {
    public static void main(String[] args) {
        int[] list = {1,2,3,4,5};
        int[] list2 = Arrays.copyOf(list,list.length);
        list2[1] = 100;
        for (int a: list){
            System.out.println(a);
        }
    }
}

  其中第二个参数是新数组的大小

posted @ 2018-12-30 22:43  瓜田月夜  阅读(117)  评论(0)    收藏  举报