3.3 数据类型

Java是一种强类型语言。必须为每一个变量声明一种类型。在java中,一共有8终基本类型

3.3.1 整形

类型 存储需求 取值范围
int 4字节 -2 147 483 648 ~ -2 147 483 647
short 2字节 -32768 ~ -32767
long 8字节 很小 ~ 很大
byte 1字节 -128 ~ 127

byte 和 short类型主要用于特定的应用场合,例如:底层的文件处理或者需要控制占用存储空间量的大数组。

  • 长整形数值有一个后缀L或者l(如 400000000L)。
  • 十六进制数值有一个前缀0x或0X
  • 八进制有一个前缀 0
  • 从Java7开始,加上前缀0b或者0B就可以写二进制数

3.3.2 浮点类型

类型 存储需求 取值范围
float 4字节 有效位数6-7位
double 8字节 有效位数15位

double表示这种类型的数值精度是float类型的两倍

  • float:有一个后缀F或f
  • double:后缀为D或d,和不加后缀

下面是用于表示溢出和出错的情况的三个特殊的浮点数值:

  1. 正无穷大
  2. 负无穷大
  3. NaN(不是一个数字)

例如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。

常量Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaN分别表示上面三个特殊的值。

​ 不能使用if(x == Double.NaN)检测一个特定值是否等于Double.NaN

​ 可以使用if(Double.isNaN(x))检测

3.3.3 char类型

char类型的字面量值要用单引号括起来。例如:'A'

char类型原本用于表示单个字符,但是有些Unicode字符可以用一个char值描述,另一些则需要两个char值。

转义序列 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\"(一个撇) 双引号 \u0022
\'(一个撇) 单引号 \u0027
\\(两个撇) 反斜杠 \u005c

警告:

// \u00A0 is a newline:会产生一个语法错误,因为读程序时\u00A0会替换为一个换行符。

// Look inside c:\users:产生一个语法错误,因为\u后面未跟着4个十六进制数。

3.3.4 Unicode和char类型

建议不要再程序中使用char类型,除非确实需要处理UTF-16代码单元。

3.3.5 boolean类型

boolean类型有 true 和 false 两个值。整型值和布尔值之间不能进行相互转换。

3.4 变量

变量名由字母开头并由字母或者数字组成的序列。变量名长度基本没有限制。

提示: 尽管$是一个合法的Java字符,但不要在程序中使用这个字符。它只用在Java编译器或其他工具生成的名字中。

可以在一行中声明多个变量:int i, j;

3.4.1 变量初始化

声明一个变量后,必须用赋值语句对变量进行显示初始化。

int vacationDays;
System.out.println(vacationDays); //错误,没有进行初始化

3.4.2 常量

利用关键字 final 指示常量。关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。常量名全大写。

public class Test {
    public static void main(String[] args) {
        final double CM_PER_INCH = 2.54; // 常量
        System.out.println(CM_PER_INCH);
    }
}

如果希望常量可以在一个类中的多个方法中使用,通常将这个常量称为类常量。使用关键字static final

public class Test {
    static final double CM_PER_INCH = 2.54; // 类常量

    public static void main(String[] args) {
        System.out.println(CM_PER_INCH);
        demo();
    }
    public static void demo(){
        System.out.println(CM_PER_INCH);
    }
}

类常量的定义位于方法的外部。如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。

3.5 运算符

当参加 / 运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。

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

3.5.1 数学函数与常量

Java中没有幂运算,要用Math类的pow方法。
double y = Math.pow(x,a); 将x的a次幂赋值给y,pow方法有两个double类型的参数,其返回结果也为double。

3.5.3 强制类型转换

double x = 9.886;
int nx = (int) x;

强制类型转换通过截断小数部分将浮点值转换为整形。

3.5.4 结合赋值和运算符

如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。如果x是一个int,则x += 3.5; ,将把x设置为(int)(x + 3.5).

3.5.5 自增与自减运算符

public class Test {
    public static void main(String[] args) {
        int m = 7;
        int n = 7;
        int a = 2 * ++m;  // a = 16, n = 8
        int b = 2 * n++;  // b = 14, n = 8
    }
}

3.5.8 括号与运算符级别

运算符 结合性
[].()(方法调用) 从左向右
! ~ ++ -- +(一元运算) -(一元运算)()(强制类型转换) new 从右向左
* / % 从左向右
+ - 从左向右
<< >> >>> 从左向右
< <= > >= instanceof 从左向右
= = != 从左向右
& 从左向右
^ 从左向右
| 从左向右
&& 从左向右
|| 从左向右
?: 从右向左
= += -= *= /= %= &= |= ^= <<= >>= >>>= 从右向左

3.5.9 枚举类型

enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};

3.6 字符串

Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫String。

3.6.1 字串

String类的substring方法可以从一个较大的字符串中提取出一个字串。

String greeting = "hello";
String s = greeting.substring(0, 3); // hel

3.6.3 不可变字符串

String类没有提供用于修改字符串的方法,所有在Java文档中将String类对象称为不可变字符串。

3.6.4 检验字符串是否相等

使用equals方法检验两个字符串是否相等。

使用equalsIgnoreCase方法,不区分大小写

== 运算符检测两个字符串是否指向同一个对象,但是出现相同内容的多个字符串在不同的位置上,结果为false.

3.6.5 空串与Null串

空串 "" 是长度为0的字符串。

3.6.7 String API

  • char charAt(int index)

    返回给定位置的字符

    String str = "hello";
    char ch = str.charAt(1);
    System.out.println(ch); // e
  • int codePointAt(int index)

    返回给定位置字符的ASCII码值

    String str = "abc";
    int s = str.codePointAt(2);
    System.out.println(s); // 99
  • int compareTo(String other)

    字符串比较函数

    String str = "bcd";
    String str2 = "cc";
    int i = str.compareTo(str2);
    System.out.println(i);

    如果字符串 str 小于 str2,返回一个负数

    如果字符串 str 等于 str2,返回0

    如果字符串 str 大于 str2,返回一个正数

  • boolean equals(Object other)

    判断字符串是否与other 相等,返回true.

  • boolean equalsIgnoreCase(String other)

    判断字符串是否与other相等(忽略大小写),返回true

  • boolean startsWith(String prefix)

    判断字符串是否以 prefix 字符串 开头

    String str = "abcd";
    boolean is = str.startsWith("ab");
    System.out.println(is); // true
  • boolean endsWith(String suffix)

    判断字符串是否以 suffix 字符串结尾

    String str = "abcd";
    boolean is = str.endsWith("cd");
    System.out.println(is); // true
  • int indexOf(String str)

    String str = "abcdabcd";
    
    int n = str.indexOf('d');
    System.out.println(n); // 3
    
    int k = str.indexOf('e');
    System.out.println(k); // -1
  • int indexOf(int cp)

    String str = "abcdabcd";
    int i = str.indexOf("abc", 3);
    System.out.println(i); // 4
    
    i = str.indexOf("abc", 0);
    System.out.println(i); // 0
    
    i = str.indexOf("ddd", 0);
    System.out.println(i); // -1
  • int indexOf(int cp)

    String str = "abcdabcdA";
    
    int i = str.indexOf(97);
    System.out.println(i); // 0
    
    i = str.indexOf(65);
    System.out.println(i); // 8
    
    i = str.indexOf(70);
    System.out.println(i); // -1
  • int index (int cp, int fromIndex)

    String str = "abcdabcdA";
    
    int i = str.indexOf(97, 1);
    System.out.println(i); // 4
    
    i = str.indexOf(65, 6);
    System.out.println(i); // 8
    
    i = str.indexOf(70, 0);
    System.out.println(i); // -1

    返回与字符串 str 或 ASCII匹配的最后的最后一个字串的开始位置。这个位置从原始串尾端或fromIndex开始计算。

  • int length()

    返回字符串的长度

  • int codePointCount(int startIndex, int endIndex)

    返回 开始到结束-1 之间字符个数

    String str = "abcdabcdA";
    
    int i = str.codePointCount(0, 5);
    System.out.println(i); // 5
  • String replace(CharSequence oldString, CharSequence newString)

    返回一个新字符串。这个字符串用newString 代替原始字符串中的所有 oldString。可以用 String 或 StringBuilder 对象作为CharSequence 参数。

    String str = "abcdabcd";
    
    String str2 = str.replace("abc", "123");
    System.out.println(str2); // 123d123d
  • String substring(int beginIndex)

    String str = "abcd123";
    
    String str2 = str.substring(3);
    System.out.println(str2); // d123
  • String substring(int beginIndex, int endIndex)

    String str = "abcd123";
    
    String str2 = str.substring(3, 5);
    System.out.println(str2); // d1

    返回一个新的字符串。这个字符串包含原始字符串中从 beginIndex 到串尾或 endIndex-1 的所有字符。

  • String toLowerCase()

    String str = "abcd123ABC";
    
    String str2 = str.toLowerCase();
    System.out.println(str2); //abcd123abc
  • String toUpperCase()

    String str = "abcd123ABC";
    
    String str2 = str.toUpperCase();
    System.out.println(str2); //ABCD123ABC

    返回一个新的字符串。这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成大写字母。

  • String trim()

    返回一个新的字符串。这个字符串将删除了原始字符串头部和尾部的空格。

    String str = " abcd123ABC ";
    
    String str2 = str.trim();
    System.out.println(str2); //abcd123ABC
  • String join(CharSequence delimiter, CharSequence... elements)

    返回一个新字符串,用给定的定界符连接所有元素

    String[] arrStr = new String[]{"a", "b", "c"};
    System.out.println(String.join("-",arrStr)); // a-b-c

3.6.9 构建字符串

按键或者来自文件中的单词。采用字符串连接的方式达到此目的的效率比较低。每次连接字符串,都会构建一个新的String 对象,既耗时,又浪费时间。使用 StringBuilder 类就可以避免这个问题的发生。

char ch = 'a';
String str = "bcd";

StringBuilder builder = new StringBuilder();
builder.append(ch);
builder.append(str);
String completedString = builder.toString();

System.out.println(completedString);  // abcd

在JDK5.0中引入StringBuilder 类。这个类的前身是StringBuffer,其效率稍有些低,但允许多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑,则应该用StringBuilder替代它。

StringBuilder API

  • StringBuilder()

    构造一个空的字符串构建器

    StringBuilder builder = new StringBuilder();

  • int length()

    返回构建器或缓冲器中的字符个数

  • StringBuilder append(String str)

    追加一个字符串(追加到末尾)并返回this

  • StringBuilder append(char c)

    追加一个代码单元(字符)并返回this

  • StringBuilder appendCodePoint(int cp)

    追加一个代码单元,并将其转为一个或两个代码单元并返回this

    char ch = 'a';
    String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    builder.append(65);
    builder.appendCodePoint(66);
    
    System.out.println(builder); // abcd65B
  • void setCharAt(int i, char c)

    将第 i 个代码单元设置为c

    char ch = 'a';
    String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    builder.setCharAt(1, 'e');
    
    System.out.println(builder); // aecd
  • StringBuilder insert(int offset, String str)

    在offset位置插入一个字符串并返回this

    char ch = 'a';
    String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    System.out.println(builder); // abcd
    
    builder.insert(2, "123");
    System.out.println(builder); // ab123cd
  • StringBuilder insert(int offset, Char c)

    在offset位置插入一个代码单元并返回this

    char ch = 'a';
    String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    System.out.println(builder); // abcd
    
    builder.insert(2, '1');
    System.out.println(builder); // ab1cd
  • String toString()

    返回一个与构建器或缓冲器内容相同的字符串

     char ch = 'a';
     String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    System.out.println(builder.toString()); // abcd
  • StringBuilder delete(int startIndex, int endIndex)

    删除偏移量从startIndex到 endIndex-1 的代码单元并返回this

    char ch = 'a';
    String str = "bcd";
    
    StringBuilder builder = new StringBuilder();
    builder.append(ch);
    builder.append(str);
    System.out.println(builder.toString()); // abcd
    
    builder.delete(1, 2);
    System.out.println(builder); // acd

3.7 输入输出

3.7.1 读取输入

想要通过控制台进行输入,首先需要构建一个Scanner 对象,并与 “标准输入流” System.in 关联。

Scanner in = new Scanner(System.in);

nextLine 方法将输入一行。

nextInt 读取一个整数

Scanner API

  • Scanner(InputStream in)

    用给定的输入流创建一个 Scanner 对象

    Scanner scan = new Scanner(System.in);

  • String nextLine()

    读取输入的下一行内容

    Scanner scan = new Scanner(System.in);
    System.out.println(scan.nextLine());
    // 控制台输入 aaa bbb ccc
    // 控制台输出 aaa bbb ccc
  • String next()

    读取输入的下一个单词(以空格作为分隔符)

    Scanner scan = new Scanner(System.in);
    System.out.println(scan.next());
    // 控制台输入 aaa bbb ccc
    // 控制台输出 aaa
  • int nextInt()

    Scanner scan = new Scanner(System.in);
    System.out.println(scan.nextInt());
    // 控制台输入 123 23
    // 控制台输出 123
  • double nextDouble()

    Scanner scan = new Scanner(System.in);
    System.out.println(scan.nextDouble());
    // 控制台输入 123
    // 控制台输出 123.0
    
    // 控制台输入 123.0
    // 控制台输出 123.0

    读取并转换下一个表示整数或浮点数的字符序列

  • boolean hasNext()

    检测输入中是否还有其他单词(是否有输入),如果有为true

  • boolean hasNextInt()

  • boolean hasNextDouble()

    检测是否还有表示整数或浮点数的下一个字符序列。

Java核心技术卷1 第10版 笔记的更多相关文章

  1. Java核心技术·卷 II(原书第10版)分享下载

    Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...

  2. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  3. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  4. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...

  5. 《Java核心技术卷1》拾遗

    之前对Java的基础知识有过学习,现在开始学习<Java核心技术卷1>,将一些新学的知识点,做简要记录,以备后续回顾: 1.double (1)所有的“非数值”都认为是不相同的 if(x= ...

  6. java的优点和误解 《java核心技术卷i》第一章

    <java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解   1:第一章:Ja ...

  7. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  8. Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】

    Java 的基本程序设计结构 现在, 假定已经成功地安装了 JDK,并且能够运行第 2 章中给出的示例程序.我们从现在开始将介绍 Java 应用程序设计.本章主要介绍程序设计的基本概念(如数据类型.分 ...

  9. java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

    11. 6 调试技巧 1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试.这个方法可以保留,因为在java虚拟机只调用启动类的main方法. 2)   ...

随机推荐

  1. 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

    用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...

  2. day09-正侧表达式

    while True: phone_num = input('please input your phone_num:') if len(phone_num) == 11 \ and phone_nu ...

  3. scala编程(六)——函数式对象

    Rational 的式样书 分数:rational number 是一种可以表达为比率 d n 的数字,这里的 n 和 d 是数字,其中 d 不能为零.n 被称作是分子:numerator,d 被称作 ...

  4. 关于用struts2框架中iframe对应的jsp页面的不到action的值的问题

    我们做web项目经常会用到frameset.frame以及iframe,这大大方便了我们页面的构建以及模块功能的划分.但是,再使用这些技术的同时也会遇到各种各样的问题,其中一个就是子页面中得不到str ...

  5. java 的ConcurrentHashMap底层数据结构

    集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...

  6. SQL热备原理

  7. Java IO: Buffered和Data

    作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中Buffered和data的输入输出流,主要涉及以下4个类型的流:Bu ...

  8. linux centos的安装及一些相关知识的整理

    相关知识点        ***网桥:主机和虚拟机之间使用"桥接"网络组网 VMware 0 ***Net适配器:把本地网中虚拟机的ip地址转换为主机的外部网络地址 ***仅主机适 ...

  9. CPU时间分片、多线程、并发和并行

    1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...

  10. python可变类型和不可变类型,深拷贝vs浅拷贝

    转载:https://www.cnblogs.com/huamingao/p/5809936.html 核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(un ...