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. Django+ajax 返回json数据挨个显示在页面及页面和后台相互传值

    通过Ajax传到后台一个值,根据该值返回数据库表中的某一列的值,然后逐个显示到页面,并且给每个加上超链接,可以进行点击查看详细信息 1.通过Ajax传到后台一个值,红色部分为往Django后台传值,蓝 ...

  2. c# winForm 将窗体状态栏StatusStrip 分成左中右三部分 右边显示当前时间

    实现效果:通过StatusStrip显示窗体状态栏同时将状态栏分成三部分居左边显示相关文字信息中间空白显示居右边显示时间信息 1.创建窗体及添加StatusStrip  默认StatusStrip名称 ...

  3. php获取服务器和mysql等信息输出到页面(基于ci框架)

    function show($varName) {    switch($result = get_cfg_var($varName)) {     case 0:      return '< ...

  4. 动态添加checkbox

    <!--动态添加 checkbox--> <script type="text/javascript"> var data = new Array(); & ...

  5. [LC] 293. Flip Game

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  6. E. Tree Painting(树形换根dp)

    http://codeforces.com/contest/1187/problem/E 分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而 ...

  7. Reading

    Reading一共18min 需要背诵专业学科分类的词汇. 单词上,背四级词汇和托福词汇,达到约1w词汇. 句子上,练习速度和用词准确,其中准确包括含义准确和语序准确.  

  8. CentOS换yum源和epel源为国内源

    CentOS换源 YUM源 备份原来的repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bac ...

  9. CF-1144F-Graph Without Long Directed Paths

    题意: 给出一个无向联通图,要求你给出每条边的方向,使得无论从哪个点出发最多只能走一条边: 思路: 对于每个点,要么出度为0,要么入度为0即可.所以这就是一个判断二分图. 二分图 #include & ...

  10. MyBatis延迟加载及缓存

    延迟加载 lazyLoadingEnabled 定义: MyBatis中的延迟加载也成为懒加载,就是在进行关联查询的时候按照设置延迟加载规则推迟对关联对象的select检索.延迟加载可以有效的减少数据 ...