Java基础知识的全面巩固_note1(附各种demo-code)

56 阅读8分钟

拜读《核心技术卷》,笔记之。 ###提纲 1.编译运行第一个程序 2.使用floorMod求模 3.关于Math 4.1数据类型 4.2 变量注意事项 5.数值类型之间的转换(主要注意精度损失): 6.位运算 7.字符串 8.StringBuilder 9.读取输入(控制平台) 10.格式化输出 11.文件输入与输出 12.块作用域的注意事项 13.一个while语句的Demo 14.switch语句的case标签注意: 15.大数值:BigInteger、BigDecimal


#####1.编译运行第一个程序 **结构目录:** ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a4b99d886276437a9dbd1d22ad21a13f~tplv-k3u1fbpfcp-zoom-1.image) **使用cmd编译:** ``` D:\>cd OK/corejava

D:\OK\corejava>cd v1ch02/Welcome

D:\OK\corejava\v1ch02\Welcome>javac Welcome.java

D:\OK\corejava\v1ch02\Welcome>java Welcome Welcome to Core Java!

D:\OK\corejava\v1ch02\Welcome>


**Welcome.java文件内容:**

/**

  • This program displays a greeting for the reader.
  • @version 1.30 2014-02-27
  • @author Cay Horstmann */ public class Welcome { public static void main(String[] args) { String greeting = "Welcome to Core Java!"; System.out.println(greeting); for (int i = 0; i < greeting.length(); i++) System.out.print("="); System.out.println(); } }
**上面的cmd中,javac程序是一个Java编译器,它将文件Welcome.java编译成Welcome.class.java程序启动Java虚拟机。虚拟机执行编译器放在class文件中的字节码。**


#####2.使用floorMod求模
语法:

floorMod(position + adjustment, modulus);

package Test; import java.lang.Math;

public class Havaatry {

public static void main(String[] args) {
	// TODO 自动生成的方法存根
	int hehe = Math.floorMod(2+15,12);
	System.out.println(hehe);				

}

}


#####3.关于Math

三角函数 Math.sin Math.cos Math.tan Math.atan Math.atan2

对数 Math.exp Math.log Math.log10

两个常量 Math.PI Math.E

<br>
**通过Javadoc进行具体查看:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a53b6c607fd544f4ae062ab493dbaab3~tplv-k3u1fbpfcp-zoom-1.image)

- java的Math.pow:

double y = Math.pow(x, a);

**//将y的值设置为x的a次幂。**

#####4.1数据类型
- 长整型值后缀一个L或者l(如400000000000L)。
- 十六进制前缀0x或0X。
- 八进制前缀0,例如010对应八进制的8.显然八进制表示法容易混淆,建议最好不使用八进制常数。
- Java 7 开始,可以用0b或0B写二进制数,如0B1001就是9.另外,同样是从Java 7 开始,还可以为数字字面量加下划线。如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只为易读,Java编译器会去除这些下划线。
- 绝大部分应用程序都采用double类型,float类型的精度很难满足需求。float类型需要后缀F或f,否则默认浮点数值为double。
- Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY、Double.NaN三个常量分别表示正无穷大、负无穷大、NaN(不是一个数字,计算0/0或者负数的平方根结果为NaN)。
- boolean类型只有false和true两个值,用来判定逻辑条件。**整型值和布尔值之间不能进行相互转换。在C++中,数值甚至指针可以代替boolean值,值0相当于布尔值false,非0值相当于布尔值true,在Java中不可以!**
- final表示的变量只能被赋值一次,一旦被赋值就不能再更改。

#####4.2 变量注意事项
- 声明/定义
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/84fbd4dbf1b1427da15638a7fce3afc5~tplv-k3u1fbpfcp-zoom-1.image)
- const和final
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32fd3e45ad004e2590b0c85527cfdefb~tplv-k3u1fbpfcp-zoom-1.image)
<br>

#####5.数值类型之间的转换(主要注意精度损失):
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6ad43894780f4c12b808ce76b0ed3b0e~tplv-k3u1fbpfcp-zoom-1.image)

- **上图有6个实心箭头,表示无信息丢失的转换,有3个虚箭头,表示可能有精度损失的转换。比如下面的123 456 789是一个大整数,位数超过了float类型所能表达的位数,在转换的时候,将会得到同样大小的结果(注意底层是用二进制存储数据的),但却失去了一定的精度。**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6086b467280c49a48fabb16da671e232~tplv-k3u1fbpfcp-zoom-1.image)

- **强制类型转换:会丢失精度**

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

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a6d74756a0c64490b7467aaad4e232b1~tplv-k3u1fbpfcp-zoom-1.image)

---

舍入运算: double x = 9.997; int nx = (int) Math.round(x);

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ddc28af2ece14661903cb149b151e512~tplv-k3u1fbpfcp-zoom-1.image)

<br>
#####6.位运算
**&(“and”) | (“or”) ^(“xor”)  ~(“not”)**
这些运算符按位模式处理。例如,如果n是一个整数变量,而且用二进制表示的n从右边数第4位为1,则

int fourthBItFromRight = (n & 0b1000) / 0b1000;

会返回1(结果递等为0b1000 / 0b1000),否则返回0(递等为 0b 0000 / 0b1000)。


#####7.字符串 ([参考](https://www.jianshu.com/p/55dc55ddf382))
没有内置的字符串类型,标准库中提供了一个预定义类,String,例如:

String greeting = "Hello"; 每个用双引号括起来的字符串都是 String 类的一个实例

<1>子串(substring方法)

String greeting = "Hello"; String s = greeting.substring(0,3); //Hel,不包含3,从0开始计数

<2>拼接(+)

System.out.println("The answer is"+answer); 使用定界分隔符(join):

String all = String.join("/","S","M","L","XL"); //"S/M/L/XL"

<3>不可变字符串(例:将Hello改为Help!)

String greeting = "Hello"; greeting = greeting.substring(0,3)+"p!";

将来自文件或键盘的单个字符或短的字符串汇集成字符串

<4>检测字符串是否相等:(equals 方法)

s.equals(t) //比较字符串s和t,返回true或false 检测字符串是否相等,不区分大小写(equalsIgnoreCase 方法)

"Hello".equals("hello") //返回false "Hello".equalsIgnoreCase("hello") //返回true

双等号(==)只能确定两个字符串是否放置在**线程池**中的同一个位置上

<5>空串与null

检测空串(""):

if (str.length() == 0) 或 if (str.equals("")) null表示目前没有任何对象与该变量关联。检测方法:

if (str == null) 检测一个字符串既不是null,也不为空:

if (str != null && str.length() != 0) 先检测str不为null,如果在一个null值上调用方法,会出现错误


**String类关键方法:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5ff79bab1b9e4b3cbc5f00b430515881~tplv-k3u1fbpfcp-zoom-1.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4adb5acf61244d9a8a8cef07012e85f1~tplv-k3u1fbpfcp-zoom-1.image)

#####8.StringBuilder
**使用:**
1.构建一个空的字符串构建器 :

StringBuilder builder = new StringBuilder();

2.加入字符或字符串

builder.append(ch) ; //appends a single character builder.append(str) ; // appends a string

3.在需要构建字符串时就凋用 toString 方法,得到String对象:

String completedString = builder.toString();

**StringBuilder类关键方法:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b75513881ea244d29f6d4c0723f45f04~tplv-k3u1fbpfcp-zoom-1.image)

#####9.读取输入
Demo  代码中的方法均以Enter作为结束:

import java.util.*;

/**

  • This program demonstrates console input.

  • @version 1.10 2004-02-10

  • @author Cay Horstmann */ public class InputTest { public static void main(String[] args) { Scanner in = new Scanner(System.in);

    // get first input System.out.print("What is your name? "); String name = in.nextLine();//读取一行,可以读入空格

    // get second input System.out.print("How old are you? "); int age = in.nextInt();//读取一个整数

    // display output on console System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));

    //读取一个单词 String s = in.next();

    //读取一个浮点数 double d = in.nextDouble();

    System.out.println("s = " + s + ". d = " + d); } }

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ae0a012b5b2b467e9eebc51a3d153d73~tplv-k3u1fbpfcp-zoom-1.image)

要想读取一个整数,就调用nextInt()方法 如:int age = in.nextInt();


<br>

**next()输入不能隔着空格,不然会报错:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac76a1922e694d6db2bdddafefdd8d86~tplv-k3u1fbpfcp-zoom-1.image)
<br>

**Scanner关键API:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f2d470d7539847b3828faefaf1364f2a~tplv-k3u1fbpfcp-zoom-1.image)


#####10.格式化输出
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ef4575bfd11a4b7aa54db1c7ec7165d2~tplv-k3u1fbpfcp-zoom-1.image)

package Test; import java.lang.Math;

public class Havaatry { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.printf("%f \n",10000.0/3.0); System.out.printf("%.2f \n",10000.0/3.0); System.out.printf("%,.2f \n",10000.0/3.0); System.out.printf("%+.2f \n",10000.0/3.0); System.out.printf("% .2f \n",10000.0/3.0); System.out.printf("%(.2f \n",-10000.0/3.0); System.out.printf("%#f \n",3333.); } }

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/91eb7935bfaf4f80b4cd88fd3904e1c2~tplv-k3u1fbpfcp-zoom-1.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d2383fa130194147b1017e2267e63f74~tplv-k3u1fbpfcp-zoom-1.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3ee1692852704e3c9916f171196d92cd~tplv-k3u1fbpfcp-zoom-1.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a762b7e7c6e3485c9da9b62b292237eb~tplv-k3u1fbpfcp-zoom-1.image)
<br>
**Date类和相关的格式化选项;格式包括两个字母,以t开始,以表3-7中的任意字母结束:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/19d6555055074086ac5785d7d910ecec~tplv-k3u1fbpfcp-zoom-1.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ceacf7cda276416fa083c5e82da88858~tplv-k3u1fbpfcp-zoom-1.image)
<br>
**Demo:**

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/05ec1fa30f214570979927995e4e69fc~tplv-k3u1fbpfcp-zoom-1.image)

---
	System.out.printf("%1$s %2$tB %2$te, %2$tY   \n", "Due date:", new Date());
	System.out.printf("%s %tB %<te, %<tY", "Due date:", new Date());
---
<br>
- **格式说明语法图:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b9b825579438475fa247f14b0893a110~tplv-k3u1fbpfcp-zoom-1.image)

#####11.文件输入与输出
**要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:**

Scanner in = new Scanner(Paths.get("myfile.txt"),"UTF-8");

!!!!!!!在这之后,就可以利用前面介绍的任何一个Scanner方法对文件进行读取

!!!!!!!"UTF-8"乃字符编码,如果省略了这个参数,则会使用运行这个Java程序的机器的“默认编码”。这不是一个好主意, 如果在不同的机器上运行这个程序,可能会有不同的表现。

**注意:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ff728655789940d9bbe9d781f9c04640~tplv-k3u1fbpfcp-zoom-1.image)

要想写入文件就需要构建一个PrintWriter对象,在构造器中,只需要提供文件名:

PrintWriter out = new PrintWriter("myfile.txt","UTF-8");

**如果文件不存在,创建该文件。可以像输出到System.out一样使用print、println以及printf命令。**

**本节相关API**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2299fa08cc524049b3eebb74339d7696~tplv-k3u1fbpfcp-zoom-1.image)



#####12.块作用域的注意事项
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d38eae1d89474cb58e95dae8713b4bb6~tplv-k3u1fbpfcp-zoom-1.image)


#####13.一个while语句的Demo:
**首先计算退休账户中的余额,然后再询问是否打算退休,只要用户回答“N”,循环就重复执行。这是一个需要至少执行一次循环的很好示例,因为用户必须先看到余额才能知道是否满足退休所用。**

import java.util.*;

/**

  • This program demonstrates a do/while loop.

  • @version 1.20 2004-02-10

  • @author Cay Horstmann */ public class Retirement2 { public static void main(String[] args) { Scanner in = new Scanner(System.in);

    System.out.print("How much money will you contribute every year? "); double payment = in.nextDouble();

    System.out.print("Interest rate in %: "); double interestRate = in.nextDouble();

    double balance = 0; int year = 0;

    String input;

    // update account balance while user isn't ready to retire do { // add this year's payment and interest balance += payment; double interest = balance * interestRate / 100; balance += interest;

      year++;
    
      // print current balance
      System.out.printf("After year %d, your balance is %,.2f%n", year, balance);
    
      // ask if ready to retire and get input
      System.out.print("Ready to retire? (Y/N) ");
      input = in.next();
    

    } while (input.equals("N")); } }

执行结果: How much money will you contribute every year? 30 Interest rate in %: 0.3 After year 1, your balance is 30.09 Ready to retire? (Y/N) N After year 2, your balance is 60.27 Ready to retire? (Y/N) N After year 3, your balance is 90.54 Ready to retire? (Y/N) N After year 4, your balance is 120.90 Ready to retire? (Y/N) N After year 5, your balance is 151.36 Ready to retire? (Y/N) N After year 6, your balance is 181.90 Ready to retire? (Y/N) N After year 7, your balance is 212.54 Ready to retire? (Y/N) N After year 8, your balance is 243.26 Ready to retire? (Y/N) Y

#####14.switch语句的case标签注意:
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/961377b7b9984f35bbcd5dce447c37e8~tplv-k3u1fbpfcp-zoom-1.image)


#####15.大数值:BigInteger、BigDecimal
**如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
使用静态的valueOf方法可以将普通的数值转换为大数值:**

BigInteger a = BigInteger.valueOf(100);

**遗憾的是,不能使用人们熟悉的算术运算符(如:+和 * )处理大数值。而需要使用大数值类中的add和multiply方法。**

BigInteger c = a.add(b); / / c = a + b BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); / / d = c * ( b + 2 )


**下面上一个例子,先用普通数据类型写一个(排列组合的)组合算法,其中变量k为欲取数,n为总数:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4ab8336c7b394d2395129a33340b1efb~tplv-k3u1fbpfcp-zoom-1.image)

import java.util.*;

/**

  • This program demonstrates a for loop.

  • @version 1.20 2004-02-10

  • @author Cay Horstmann */ public class LotteryOdds { public static void main(String[] args) { Scanner in = new Scanner(System.in);

    System.out.print("How many numbers do you need to draw? "); int k = in.nextInt();

    System.out.print("What is the highest number you can draw? "); int n = in.nextInt();

    /* * compute binomial coefficient n*(n-1)(n-2)...(n-k+1)/(123...*k) */

    int lotteryOdds = 1; for (int i = 1; i <= k; i++) lotteryOdds = lotteryOdds * (n - i + 1) / i;

    System.out.println("Your odds are 1 in " + lotteryOdds + ". Good luck!"); } }

**测试——组合10中取2,结果为45:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cb155b5566a34930a6ae8518851012ec~tplv-k3u1fbpfcp-zoom-1.image)

**下面用大数值进行计算:**

import java.math.; import java.util.;

/**

  • This program uses big numbers to compute the odds of winning the grand prize in a lottery.

  • @version 1.20 2004-02-10

  • @author Cay Horstmann */ public class BigIntegerTest { public static void main(String[] args) { Scanner in = new Scanner(System.in);

    System.out.print("How many numbers do you need to draw? "); int k = in.nextInt();

    System.out.print("What is the highest number you can draw? "); int n = in.nextInt();

    /* * compute binomial coefficient n*(n-1)(n-2)...(n-k+1)/(123...*k) */

    BigInteger lotteryOdds = BigInteger.valueOf(1);

    for (int i = 1; i <= k; i++) lotteryOdds = lotteryOdds.multiply(BigInteger.valueOf(n - i + 1)).divide( BigInteger.valueOf(i));

    System.out.println("Your odds are 1 in " + lotteryOdds + ". Good luck!"); } }

比较:

lotteryOdds = lotteryOdds * (n - i + 1) / i;

**跟**

lotteryOdds = lotteryOdds.multiply(BigInteger.valueOf(n - i + 1)).divide(BigInteger.valueOf(i));


**关键API:**
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cc00e020853843e9a87105684a7375d2~tplv-k3u1fbpfcp-zoom-1.image)

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ddf79b3b85ba402ca5a25a7d11c61eb2~tplv-k3u1fbpfcp-zoom-1.image)