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

简介: 拜读《核心技术卷》,笔记之。提纲1.编译运行第一个程序2.使用floorMod求模3.关于Math4.1数据类型 4.2 变量注意事项5.数值类型之间的转换(主要注意精度损失):6.

拜读《核心技术卷》,笔记之。

提纲

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.编译运行第一个程序

结构目录:

img_4ee3c5883b89f36d11266bbc36ec0f67.png

使用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



通过Javadoc进行具体查看:

img_02da3a58f6485d74da4f111f99d3d94f.png

  • 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 变量注意事项
  • 声明/定义


    img_18dc902abd308bbbfb60c08436424513.png
  • const和final
    img_363eeb8afd0e0c807848a999e993b80f.png


5.数值类型之间的转换(主要注意精度损失):
img_c43c0d09b6f68bac3c539288e1049428.png
  • 上图有6个实心箭头,表示无信息丢失的转换,有3个虚箭头,表示可能有精度损失的转换。比如下面的123 456 789是一个大整数,位数超过了float类型所能表达的位数,在转换的时候,将会得到同样大小的结果(注意底层是用二进制存储数据的),但却失去了一定的精度。

    img_3854c25bb5e7271c30c18b645b23243e.png

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

double x = 9.997;
int nx = (int) x;
img_760fff3c90b24a7c5283a34e24cb89ea.png

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


6.位运算

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

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

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

7.字符串 (参考

没有内置的字符串类型,标准库中提供了一个预定义类,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类关键方法:

img_412c724c2e046b4ebdbf2ffb7901abd3.png

img_c70935a6d964e57c67a8cb0d8d1c439c.png

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类关键方法:

img_075902fe8730d21116ee75c9a8d8491e.png

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);
   }
}
img_84620866cd45c2bc8ac9c4edbdeb912b.png
要想读取一个整数,就调用nextInt()方法
如:int age = in.nextInt();


next()输入不能隔着空格,不然会报错:

img_34af74727985add44792da96422b0b3b.png


Scanner关键API:

img_943a15c0f1fd501770ba044341b0b0a5.png

10.格式化输出
img_f3cb6db7b148bc2021a6f0f3aae7f6dd.png
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.);
    }
}

img_6f14517757a75c980928596038201461.png

img_c822cadf20d87cc80945d5e164d9c533.png

img_66689817860d2aef680f35d192db79d3.png

img_274adeb51fbd52aad9c57776ac7d245f.png



Date类和相关的格式化选项;格式包括两个字母,以t开始,以表3-7中的任意字母结束:
img_78ea873cbc881e0ef8544196c4f12a4c.png

img_c2f2a46b6b1d6e0479ff6310d264bf7f.png



Demo:

img_d5d75711b03347d82d793c8c9ab77f1d.png

        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());


  • 格式说明语法图:
    img_7966befec299496d374f44a4307a2de4.png
11.文件输入与输出

要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:

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

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

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

注意:

img_ac87828d1c24643c0240cf634355fa34.png

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

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

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

本节相关API

img_6fe37e91e5618db6512e8bf20e5bbdfe.png

12.块作用域的注意事项
img_5dedde2b580227e654a1d1d1b4e91d7a.png
13.一个while语句的Demo:

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

import java.util.*;

/**
 * This program demonstrates a <code>do/while</code> 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标签注意:
img_c831afad91ad23fd4780a43640a9376f.png
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为总数:

img_01569e3c734abc718422f3cf3e5c8c51.png

import java.util.*;

/**
 * This program demonstrates a <code>for</code> 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)/(1*2*3*...*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:

img_0440d91552e221c2cd965568b50d833c.png

下面用大数值进行计算:

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)/(1*2*3*...*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:

img_0249d684e5655f5eec50a2346c4eee86.png

img_437b8ac28133a9cc537049dc1bd825fc.png
目录
相关文章
|
3月前
|
Java C++ 索引
【Java】JavaSE基础知识
【Java】JavaSE基础知识
110 0
|
13天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
19天前
|
关系型数据库 Java 开发工具
Java入门高频考查基础知识9(15问万字参考答案)
本文探讨了Spring Cloud的工作原理,包括注册中心的心跳机制、服务发现机制,以及Eureka默认的负载均衡策略。同时,概述了Spring Boot中常用的注解及其实现方式,并深入讨论了Spring事务的注解、回滚条件、传播性和隔离级别。文章还介绍了MySQL的存储引擎及其区别,特别关注了InnoDB如何实现MySQL的事务处理。此外,本文还详细探讨了MySQL索引,包括B+树的原理和设计索引的方法。最后,比较了Git和SVN的区别,并介绍了Git命令的底层原理及流程。
29 0
Java入门高频考查基础知识9(15问万字参考答案)
|
19天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
46 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
19天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
32 0
|
19天前
|
存储 Java 编译器
Java入门高频考查基础知识2(超详细28题2.5万字答案)
多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息作出不同的响应。在具体实现上,多态允许一个父类的引用指向其子类的对象,并根据实际指向的对象的类型来调用相应的方法。在 Java 中,多态可以通过以下几种方式实现:在同一个类中,方法名相同,但形参列表不同,实现了多态。子类可以重写(覆盖)其父类的方法,实现多态。在父类引用中调用该方法时,根据实际指向的子类对象的类型来调用相应的方法实现。
38 0
|
25天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
89 3
|
1月前
|
SQL Java 数据库连接
JAVA数据库的基础知识
JAVA数据库的基础知识
15 1
|
1月前
|
Java 调度
Java中的多线程编程:基础知识与实践
【2月更文挑战第26天】在现代软件开发中,多线程编程是一个重要的概念。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制,以及线程同步和通信的方法。同时,通过实例分析,帮助读者更好地理解和掌握Java多线程编程的技巧。
|
1月前
|
Java
Java中的多线程编程:基础知识与实践
【2月更文挑战第25天】本文将深入探讨Java中的多线程编程,包括其基础知识和实践应用。我们将从多线程的基本概念开始,然后逐步深入到Java中实现多线程的方法,包括继承Thread类和实现Runnable接口。接着,我们将讨论多线程的同步和通信问题,以及如何使用wait()、notify()和notifyAll()方法进行线程间的通信。最后,我们将通过一个实例来演示如何在Java中创建和管理多线程。