10.13

注:
此篇随笔知识总结参考与《java核心技术卷1》
图片来源于网络
只用于个人学习总结以及分享学习心得使用

注释形式:
//
/**/
第一种只能注释单行代码
第二种可以界定一种范围来注释

数据类型:
有8种基本类型:
1.4种整形:int,short,long,byte(表示没有小数部分的数值,允许是负数)
2.2种浮点类型:float,double(表示有小数部分的数值,注:float类型后要有f/F作为后缀,不然就会默认为double类型)
3.1种字符类型:char(字符型,一般情况表示单个字符,还有Unicode字符可以用char值描述)
4. 一种布尔类型:boolean(有两个值true和false,多数用于判断逻辑条件之中)

声明变量:
每个变量都有一个类型type,声明变量就是“变量类型+变量名”
接下来列举:
double a;
int b;
long c;
boolean d;
(不能用java的保留字作为变量名)

接下来声明完变量后就要对变量进行初始化
如果使用未初始化的变量会ERROR
对声明过的变量进行赋值:“变量名 = 值;”
也可以声明和赋值同时进行:“变量 变量名 = 值;”
(注:变量的声明尽可能靠近第一次使用变量的地方,这是一种良好的程序编写风格)

常量:
final指示常量
final这个关键词只能被赋值一次,赋值之后就不能再更改了
希望一个常量可以在一个类的多个方法中使用,这时候可以用“static final”设置一个类常量
(注:类常量定义于main方法的外部)

枚举类型:
变量的取值只在一个有限的集合内
列:服装尺寸,编码
这时候可以自定义枚举类型,关键字“enum”

enum Size {small,medium,large,extra_large}
Size s =Size.small;

Size类型的变量只能储存这个类型中声明给定的值,或者null(空值)

运算符:

  • 算术运算符:+、-、*、/(加减乘除)
    注:/和%的区别
    第一个是除法,整数和整数是整数除法,其中一个是浮点数时,就是表示浮点除法
    第二个是求余数,15%2=1
    注:整数被0除会产生异常,浮点数被0除将会得到无穷大或者NaN的结果
  • 数学函数和常量:
    Math类中有数学函数
    平方根用“sqrt”方法
double x = 4;
double y =Math.sqrt(x);

幂运算在java中没有,但是我们可以借助pow方法
double y =Math.pow(x,a);
表示的是x的a次方

floorMod方法:

Math类三角函数:Math.sin……
Math类指数函数反函数:Math.exp……
表示pai和e常量的近似值:Math.PI,Math.E

import static java.lang.Math.*;

  • 数值类型之间的转换

java SerializerFeature 保留null值_System


注:图源百度

红色箭头是表示会损失精度的转化

  • 强制类型转换
double x = 9.9997;
int x1 = (int)x;
//注:如果想对浮点数进行舍入运算
//可以用Math.round
  • 结合赋值和运算符
x += 4;
x = x + 4;

以上两个是相等的

  • 自增与自减运算符
int n = 12;
n++;
//前缀形式会先加1
  • 关系和boolean运算符
3==7//检测相等性
3!= 7//检测不相等

小于、大于、小于等于、大于等于
<、>、 <= 、>=

&&和||一个是与一个是或者
&&:条件同时满足
||:满足其中一个条件

三元操作符:“ ?: ”

  • 位运算符
    &、|、^、~
    意思分别为:
    and、or、xor、not

和 <<可以将位模式左移右移

  • 括号与运算符级别

10.14

  1. 字符串:
    没有字符串类型,在java类库中提供了一个预定类,自然的叫做String
    双引号括起来的都是String类的一个实例
String a ="";
String b ="Hello";
  • 子串
    substring方法可以从一个较大的字符串中提取出一个字串
    例如:
String a = "hello";
String b =a.substring(0,3);//从0开始,到3为止,但是不包括3
  • 拼接
    java语言允许使用+号链连接两个字符串
String a ="aaa";
String b ="bbb";
String c ="ccc";
String d =a+b+c;
System.out.println(d);

将一个字符串和一个非字符串的值进行拼接时,后者会转换成字符串(任何一个java对象都可以转换成字符串)

int age = 13;
String rating ="age"+age;
System.out.println(rating);

这种特性经常使用在输出语句中

System.out.println("age"+age);

字符串里如果有空格,那么打印语句的时候也会打印这个空格

如果需要把多个字符串都放在一起,用一个界定符号分割,可以使用静态join方法

String all = String.join("/","a","b","c","d");
System.out.println(all);

输出:a/b/c/d

在java11中,还提供了一个repeat方法:

String re ="java".repeat(3);
//输出javajavajava
  • 不可变字符串

String类没有提供修改字符串中某个字符的方法如果想修改,可以提取想保留的子串,再和希望的字符拼接

c = c.substring(0,1)+"a";
//这个就是运用了上面子串中说的substring方法
//从0开始,到1结束,但不包括1
System.out.println(c1);

由于不能修改字符串中的单个字符,String类对象称为是不可变的,几就是几,虽然不能修改该这些值,但是我们可以重新赋值给c

  • 检测字符串是否相等
    可以用equals方法检测两个字符串是否相等
    表达式:s.equals(t);
    如果字符串s和t相等则返回true,如果不相等就返回false
    s和t可以是字符串变量也可以是字符串字面量
String a ="aaa";
"hello".equals(a);

不区分大小写的检测字符串是否相等用:equalsIgnoreCase方法

一定不要用==检测两个字符串是否相等,这个运算符只能确定两个字符串是否能存在于同一个位置上,如果存在一个位置上他们必然相等
但是完全有可能将内容相同的多个字符串副本放置再不同的位置上

String greeting = "Hello";
        if (greeting == "Hell0") {
            //return一个true
        }
        if (greeting.substring(0,3)=="Hel"){
            //return一个false
        }
  • 空串与Null串
    空串""是长度为0的字符串可以用如下代码检测
if (greeting.length() == 0){
            
        }
        if (greeting.equals("")){
            
        }

空串是一个java对象,有自己的长度和内容,长度为0,内容为空

String变量可以存放一个特殊的值,名字是null

表示目前没有任何对象和该变量关联

要检查一个字符串是否为null

if (greeting == null){

        }

要检查一个字符串既不是null也不是空串

if (greeting != null && !greeting.equals("")){

        }
        if (greeting != null && greeting.length()!=0){

        }
  • 码点与代码单元
    后续补充
  • StringAPI
    API注释汇总了一些最常用的方法
    每一个API的注释都是从包名开始
    如java.lang.String
    (方法后续补充意义和是示范代码)
  • 阅读联机文档
    http://docs.oracle.com/javase/9/docs/api
  • 构建字符串
    有时候需要由较短的字符串来构建字符串
    如果一直采用字符串拼接来达到这个目的效率低
    每次拼接都要构建一个新的String对象
    可以使用StringBuilder类来避免这个问题
StringBuilder builder = new StringBuilder();
        builder.append("111");
        builder.append("123");
        String a1 = builder.toString();
        System.out.println(a1);

API注释包含了StringBuilder类中的重要方法:

后续补充……

  1. 输入与输出:
  • 读取输入
    输出调用System.out.println(
    输入要构造一个System.in关联的Scanner对象
Scanner scanner = new Scanner(System.in);
        String name =scanner.nextLine();//一行输入
        String name1 =scanner.next();//一个单词
        int name2 =scanner.nextInt();//整数

记得前面需要import java.util.*

  • 格式化输出
    格式化输出
    此格式是真的字面意思
    比如你希望输出美元,美分数等等……
    用printf方法


    (还有用于prinf的标志的表,暂时没有找到图片……)
  • 文件输入与输出
    想要读取一个文件,需要构造一个Scanner对象
Scanner scanner = new Scanner(Path.of("my.txt"), StandardCharsets.UTF_8);

如果文件名中包含反斜杠符号,就要记住反斜杠之前要再加一个额外的反斜杠转义

Scanner scanner = new Scanner(Path.of("my.txt"), StandardCharsets.UTF_8);
        PrintWriter out = new PrintWriter("my.yxy",StandardCharsets.UTF_8);

10.17

接上

  1. 控制流程:
  • 块作用域

深入学习控制之前需要了解block的概念

复合语句使用若干条java语句组成的语句,用一对大括号括起来,块确定了变量的作用域

应该block之间可以进行嵌套

注:但是不能再嵌套的两个块中声明相同的两个变量

  • 条件语句

java中条件语句的形势是if (condition)statement

需要执行多个语句可以使用block statement

if (condition){
statement1
statement2
……
}
int a= 10;
if (a ==10){
    System.out.println("a="+10);
}else {//else是当if条件不满足执行block中的语句
    System.out.println("a!="+10);
}

注:else的部分是可选的

else子句与最邻近的if构成一组

  • 循环

条件为true的时候,while循环执行一条语句(块语句)

while (condition) statement

注:while在前的如果开始时循环条件为flase,块中的语句将一次都不会执行

如果想让while在前面执行语句,就用do while语句

do statement while (condition)

(示范代码后续补充)

  • 确定循环

for语句

注:如果在for语句中定义了一个变量,那么这个变量就不能在循环体之外使用

如果希望在循环体外使用循环计数器的最终值,就要确保这个变量在循环外声明!

(示范代码后续补充)

  • 多重选择

switch语句,将于选项值相匹配的case标签开始执行直到遇见break语句

如果没有相匹配的case标签,则会执行default语句

注:如果case标签里的语句没有使用break则会继续执行下一个case标签里的语句,有时候可能会引发严重的错误

(示范代码后续补充)

  • 终端控制流程的语句

break语句:跳出循环

(示范代码后续补充)

标签:

break 标签;

执行后,会跳转到带标签的语句块末尾(标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号)

continue语句:中断正常的控制流程。

(示范代码后续补充)

  1. 大数
    基本的浮点数和整数不能满足要求可以使用java.math包中的两个类:BigInteger和BigDecimal
    BigInteger:实现任意精度的整数运算
    BigDecimal:实现任意精度的浮点数运算
    注:使用静态的valueOf方法可以将普通的数值转换成大数
BigInteger a =BigInteger.valueOf(1000000000);
//对于更大的数我们可以使用一个带字符串的构造器
BigInteger reallyBig = new BigInteger("100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");

注:不可以使用算术运算符处理大数,需要使用大数类中的方法(比如add和multiply方法)

(示范代码后续补充)

10.18

数组:

  • 声明数组

数组是一种数据结构,用来储存同一类型的集合

声明数组:int a[i](a是一个整形数组,i就是数组中下标为一的整数)

不过,这里只声明了一个数组,并没有初始化

int[] a = new int[100](初始化了一个可以存储100个整数的数组)

当然,你也可以创建一个new int[n]的长度的数组,这个声明则会创建一个长度为n的数组

数组长度也不一定非要是常量

但一旦创建了数组就不能改变他的长度

int[] smallPrimes = {1,2,3,4,5,6};
//这是一个创建数组对象并且同时提供初始值的简写方式
//接下来我们来创建一个String类型的数组
       String[] name={
                "张三",
                "李四",
                "王五",
                "天六"
        };
        //匿名数组
        int[] smallPrimes = {1,2,3,4,5,6};
        smallPrimes = new int[]{3,3,3,3,3};
        System.out.println(smallPrimes);
        //简写形式
        int[] anonymous = {1,3,3,3,1};
        smallPrimes = anonymous;
  • 访问数组元素

一旦创建了数组,就可以在数组之中填入元素,列如可以使用一个循环

int[] a = new int[100];
        int i;
        for(i=0;i<100;i++){
            a[i] =i;
            System.out.println(a[i]);
        }

创建一个数字数组的时候,所有的元素都是初始化为0

创建一个布尔数组的时候,所有的元素都是初始化为false

对象数组的元素则初始化一个null,表示还未存放任何对象

String[] strings = new String[10];
        //则会创建包含10个null的数组
		        for (int i =0;i<strings.length;i++){
            System.out.println(strings[i]);//在控制台打印出null
                   
        }
		

        //如果你想让这数组包含空串,需要为元素指定空串
        for (int i =0;i<10;i++){
            strings[i] ="";
            for (int i1 =0;i1<10;i1++){
                System.out.println(strings[i]);
            }

        }
for (i=0;i<a.length;i++){//使用 array.length
            System.out.println(a[i]);//打印数组中的每一个元素
        }
  • for each循环

for(variable:collection)statement

注:collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象比如ArrayList

for(int element:a)

system.out.println(element)

打印数组a的每一个元素,一个元素占一行

“for each element in a”

当然,如果用array.length也是有一样的效果

但是这个语句明显显得更加简洁,不用去为了下标而担心

当然,坏处是如果你不想处理一个数组的整个元素,传统的for循环处理下标的方式更方便

  • 数组拷贝

在java中允许将一个数组变量拷贝到另一个数组变量,这时两个变量将引用同一个数组

int[] smallPrimes = new int[]{1,2,3,4,5,6,7,8};
        //一个数组要记得初始化,光声明是用不了的
        int[] LuckNumbers = smallPrimes;
        LuckNumbers[5]=12;
        for (int i=0;i<LuckNumbers.length;i++){
            System.out.println(LuckNumbers[i]);
        }

如上的是一种方法,还有一种方法要使用Arrays类的copyOf方法

int[] smallPrimes = new int[]{1,2,3,4,5,6,7,8};
        //忘记啦,一个数组要记得初始化,光声明是不行的
        int[] LuckNumbers = smallPrimes;
        LuckNumbers[5]=12;
//        for (int i=0;i<LuckNumbers.length;i++){
//            System.out.println(LuckNumbers[i]);
//        }
        int[] LuckNumbers1 = Arrays.copyOf(LuckNumbers,LuckNumbers.length);
        //第一个参数是被拷贝的数组,第二个参数是新数组的长度
        LuckNumbers = Arrays.copyOf(LuckNumbers,2*LuckNumbers.length);
        int[] new111 =Arrays.copyOf(smallPrimes,smallPrimes.length);
        System.out.println(new111[0]);//控制台打印一下看看有没有拷贝
        System.out.println(new111[1]);
        System.out.println(new111[2]);
        System.out.println(new111[3]);
  • 命令行参数

java Message -g cruel world

  • 数组排序

想要对数组进行排序,可以用Arrays的sort方法

int[] a =new int[200];
        //……
        Arrays.sort(a);

(抽牌随机抽数字……代码后续贴)

  • 多维数组
int[][] two11 ={
                {1,2,3,4},
                {2,2,2,2},
                {3,3,3,3}
        };
        System.out.println(two11[0][0]);
//多了一个框表示横向纵向,还是从0开始
  • 不规则数组

多维数组被称为数组的数组

(示范代码后续补充)