旨在记录学习到的知识,遇到的问题。解决方法优先选择别人的回答,主要记录解决方法的思路和步骤。
1、 安装软件
一、安装idea和jdk和配置变量
(1)安装idea
官网为 https://www.jetbrains.com/idea/,至于破解目前推荐的办法找到黑马的java教程,一般来说它的第一节课会有一个破解的教程,是利用软件可以免费30天进行破解的,详细步骤略。
(2)安装jdk
官网为https://jdk.java.net/,目前一般使用8以上版本。具体安装步骤略。
(3)配置环境变量
配置环境变量的作用,意义和方法
https://blog.csdn.net/qq_14894629/article/details/127956624
简单来说,系统执行命令会先寻找命令所在位置。顺序为当前目录->系统变量->用户变量,配置系统变量后你无论在哪里执行命令,都能执行。
配置javahome的意义在于其他位置使用jdk,可以使用javahome代替,这样以后jdk变化了只要修改javahome对应的jdk就好了。
附一个javaapi文档 https://docs.oracle.com/en/java/javase/17/ 这个时javase17的文档
2、基础知识
这个地方感觉很难写,准备书上写道有用的就记下来,之后再重新整理吧。
(1)java区分大小写
(2)定义类名:名字必须以字母开头,后面可以用字母和数字的任意组合,长度没有限制,但是不可以使用java保留字,标准的命名规范为:大写字母开头的名词,如果名字由多个单词组成,则每个单词的首字母都要大写。
(3)注释可以用//或者/**/或者用 /*开头/结尾,可以用来生成javadoc文档。
2.1数据类型
(1)整型
整型用来表示没有小数部分的数值,允许是负数。
类型 | 存储需求 |
---|---|
int | 4字节 |
short | 2字节 |
long | 8字节 |
byte | 1字节 |
在java中,整型的范围与java代码的机器无关,所有占的位数固定。
可恶,丢失存档一份,这玩意不是会自动保存的嘛,太阳太阳太阳
更新2023/11/3
长整型数值的后缀有一个l或L,16进制数值有一个前缀0x或0X,八进制前缀0,如010对于十进制中的8,很显然容易混淆所以不建议使用。
从java7开始,加上前缀0b或者0B可以写二进制,另外可以为数字字面量加下划线如1_000_000表示100万,编译器会去除这些下划线。
(2)浮点类型
类型 | 存储需求 |
---|---|
float | 4字节 |
double | 8字节 |
float(单精度类型)类型的数值有一个后缀F或f,没有后缀的默认为double(双精度类型)类型,也可以再数值后加d或D,表示double类型。
可以用16进制表示浮点数值。例如0.125= 2 − 3 2^{-3} 2−3 可以表示成0x1.0p-3。在16进制表示法中,使用p表示指数,因为e是一个16进制数。注意,尾数采用16进制,指数采用10进制,指数的基数是2而不是10.
浮点数计算遵循ieee754规范,有三个表示溢出或者出错情况的三个特殊的浮点数值。
如,正无穷大(Double.POSTIVE_INFINITY),负无穷大(Double.NEGATIVE_INFINITY)NaN(Double.NaN)(不是一个数字)实际过程中很少遇到,判断NaN,使用Double.isNaN()方法。
浮点数类型无法做到精确计算,因为再二进制中无法精准表示1/10.
(3)char类型
char类型用于表示单个字符。有些Unicode字符也可以使用一个char值表示,有些则需要两个字符。
char类型的字面量可以用单引号括起来,双引号括起来的是字符串类型。
一些特殊字符需要用转义序列来表示。所有的转义序列都可以出现再字符字面量和字符串中。
转义序列 | 名称 |
---|---|
\b | 退格 |
\t | 制表 |
\n | 换行 |
\r | 回车 |
\ ’ | 双引号 |
\" | 单引号 |
\\ | 反斜杠 |
注意点:unicode转义序列会在代码执行之前转换。
·(3)boolean类型
Boolean有两个值,false或者true,用于判定逻辑条件。整形值和Boolean值之间不能相互转换。
2.2 变量和常量
2.2.1 声明变量
在声明变量时,先指定变量的类型,然后是变量名。如
// 定义变量
int valary;
由于声明是一条完整的java语句,所有的java语句都是需要分号结束,所以这里的分号是必须的。
变量名必须使用字母开头,并由字母和数字构成的序列。
2.2.2变量初始化
想对一个已经声明过的变量进行赋值,需要将变量名放在等号左侧,再把一个合适的值放在等号右侧,也可以将变量的声明和初始化放在同一行。变量的声明尽量靠近第一次使用的地方,是一种良好的编写习惯。从java10开始如果赋值可以判断出变量类型,可以用var定义(但是好像很少看到人使用)
2.3 常量
利用final关键字声明常量,关键字final表示这个变量只能被赋值一次,一旦被赋值后,就不能再更改了,习惯中,变量名使用全大写。希望某个常量可以再一个类中的多个方法中使用,通常这些变量被成为类常量。可以使用static final设置一个类常量。
2.4 枚举类型
枚举类型包括有限个命名的值。这些值可能不是同一类型,不太好保存。
enum Size{SAMLL,MEDIUM,LARGE}。
2.5算数运算符
同数学中的加减乘除取余。除0会产生异常。
一些数学函数
都需要导入Math类
发现没啥好记的,用的时候临时百度就好了。
2.6 数值转换
图中实线表示无信息丢失的转换,虚线表示可能有精度损失的转换。
当一个二元运算符连接两个值时(例如n+f,n为整数,f是浮点数),先会把两个操作数转换为同一种类型,然后再进行计算,
如果两个操作数中,有一个double,另一个操作数就会转换为double类型
否则,如果一个操作数是float类型,另一个操作数就会转换为float
否则,如果其中一个操作数是long类型,另一个操作数就会转换为long类型,
否则,两个操作数都会转换为int类型。
可能损失信息的转换要用强制类型转换来完成,如
double x=9.997;
int nx=(int)Math.round(x);
round方法可以对浮点数进行舍入运算来得到最接近的整数,方法的返回值是long,仍然需要强制类型转换。
2.7结合赋值和运算符
x+=4等价于x=x+4;
如果运算符得到一个值,其类型与操作数的类型不同,就会发生强制类型转换。如x是int的话
x+=3.5,会把x设置为(int)(x+3.5)
2.8自增与自减运算符
++x与x++
++在前面的话先改变运算的值,再参与运算,++在后面,变量先参加运算,再改变运算的值。
2.9 关系和boolean运算符
检测相等,使用两个等号。
检测不相等,使用!=。
大于,小于,小于等于,大于等于同数学符号。
&&是短路与。有假为假
||是短路或。有真为真
短路是指第一个操作数能够确定表达式的值,第二个操作数就不用计算了。
三元运算符。
condition?expression1:expression2
位运算符
& and ^xor
| or ~ not
利用&并结合使用适当的2的的幂,可以只留下其中的某一位。
假设n是一个整数变量,而且用二进制便是n从右边数为1,则
int x=(n&0b1000)/0b1000会返回1.
>
>
>>
>>和<<可以将数字左移或右移
移位运算符的右操作数要完成模32的运算(除非左操作数是long类型,在这种情况下需要对右操作数模64)
>
>
>
>>>
>>>运算符会用0填充高位,>>会用符号位填充高位。不存在<<<运算符。
2.10 括号与运算符级别
可以用括号确保运算顺序的准确性,增加程序的可读性。
中间顺序略过
3.6字符串
java中用双引号括起来的字符串都是String类的一个实例.
3.6.1 字串
String类的substring方法可以从一个较大的字符串中提取出一个字串。
// 包含头不包含尾
String s="hello";
String subs = s.substring(0, 3);
第一个参数为起始位置,第二个参数为结束位置。包含头,不包含尾。
3.6.2 拼接
使用加号可以拼接两个字符串。如果需要把多个字符串放在一个,用一个界定符分割,可以使用静态join方法。
//输出结果为s/s/s
String s=String.join("/","s","s","s");
java11往后,提供了一个repeat方法。
//输出结果是javajavajava
String s="java".repeat(3);
3.6.3 不可变字符串
String类中没有提供修改字符串中某个字符的方法。通常通过提取想要保留的字串,再与希望替换的字符拼接。
不可变字符串有一个优点,编译器可以让字符串共享,如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。java的设计者认为共享带来的高效率胜于提取字串,拼接字符串戴来的低效率。
3.6.4 检测字符串是否相等
用equals方法检测两个字符串是或否相等。
如果想要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
(==比较的是两个字符串是否存在同一个位置上,对于+或者substring等操作产生的字符串会比较错误)
3.6.5 空串与Null串
空串是长度为0的字符串。空串是一个java对象,有自己的串长度(0)和内容(空);
3.6.6 码点与代码单元
java字符串由char值序列组成。
length返回给定字符串代码单元长度,
charAt函数就会返回位置n的代码单元。
char类型不要随便使用。可能会产生奇奇怪怪的错误
3.6.7 String api
没啥好记录的,经常写代码,常用的就能记住,不常用的用时百度
3.6.8 API文档
略
3.6.9 构建字符串
经常需要拼接字符串,可以使用StringBuilder类。想增加内容时,调用append方法。构建完成时使用toString方法得到String方法。
常用方法略。
3.7输入与输出
3.7.1 读取输入
Scanner scanner=new Scanner(System.in)
可以读取标准输入流。
nextLine 方法读取一行输入
想要读取一个单词可以用next方法
boolean hasNext()检测输入中是否还有其他的单词
3.7.2 格式化输出
同c语言中使用printf
3.7.3 文件输入与输出
可以用scanner方法对文件进行读取
Scanner in=new Scanner(Path.of("myfile.text"),StandardCharsets.UTF_8);
如果文件名包含反斜杠就要使用转义。
可以使用printwriter对象进行写入。
PrintWriter pr=new PrintWriter("myfule", StandardCharsets.UTF_8);
访问文件,文件不存在会产生错误,需要用throws子句标记。
3.8 控制流程
3.8.1 块作用域
块是指由若干条Java语句组成的语句,并用一对大括号括起来。快确定了变量的作用域。一个块可以嵌套在另一个块中。不能再嵌套的两个块中声明同名的变量。
3.8.2 条件语句
if(condition)statement
更一般的语句为 if…else else子句与最近的if构成一组。
3.8.3 循环
while(condition) statment 满足条件,就执行语句。
do while 可以确保循环体至少执行一次
3.8.4确定循环
for语句
for(int i=1;i<20;i++)
{statement}
第一部分是对计数器初始化,第二部分给出循环条件,第三部分为如何更新计数器,3个部分应该对同一个计数器变量进行初始化,更新和检测。
循环中,判断两个浮点数是否相等需要注意,因为舍入的误差,可能永远达不到精确的最终值。
多重选择: switch语句
switch(c)
{
case 1:
...
break;
case 1:
...
break;
default:
...
break;
}
case标签可以是:
类型为char,byte,short或int的常量表达式
枚举常量
java7以后,case标签可以是字符串字面量
挡在switch语句中使用枚举常量是,不必再每个标签中指明枚举名,可以由switch的表达式值推导得出。
3.8.6终端控制流程语句
break会跳出所有的循环,continue越过当前循环体的剩余部分,立刻跳到循环首部。
3.9大数
BIgInterger能实现任意精度的整数运算,BigDecimal实现任意精度的浮点数运算。
BigInteger b=BigInteger.valueOf(100);
BigInteger bigInteger=new BigInteger("2222222222222222222")
再大数中不能使用算术运算符,而需要使用add和muultipy方法。
3.10 数组
3.10.1 声明数组
数组是一种数据结构,用来存储同一类型值的集合,通过一个整形下表可以访问数组中的每一个值。
int []a=new int[100];
这个代码声明并初始化了一个可以存储100个整数的数组。数组长度不要求是常量,一旦创建了数组,就不能改变他的长度。
一种创建数组对象并同时提供初始值的简写,
int []a={1,2,3,4,}
最后一个值后面允许由逗号,允许由长度为0的数组。
3.10.2 访问数组元素
创建数字数组时,所有元素都初始化为0,boolean数组的元素会初始化为false。对象数组元素初始化为null。获取元素个数可以用length函数。
3.10.3 for each循环
for(int element:array)
{statement}
foreach会循环数组中的每个元素,而不是下标值。
Arrays.toString能够快速的打印数组。
3.10.4 数组拷贝
java中,允许将一个数组拷贝到另一个数组变量,这时,两个变量引用同一个数组。
Arrays.copyOf(a,b)能够将数组的所有值拷贝到一个新的数组中去
第一个参数为要拷贝的数组,第二个参数为数组的大小,通常用来增加数组的大小。如果长度小于原始数组的长度,只拷贝前面的值。
3.10.5 命令行参数
java应用程序都有一个带String arg[]参数的main方法,这份参数表明main方法将接收一个字符串数组,也就是命令行上指定的参数。java应用程序中,程序名并没有存储在args数组中。
3.10.6 数组排序
相对数值型数组进行排序,可以用arrays中的sort方法,这个方法使用了优化的快速排序算法。
###3.10.7 多维数组
int[][]=new int[][];
foreach不能自动处理二维数组的每一个元素,他会循环处理行。想要快速打印一个二维数组可以用Arrays.deepToString
3.10.8 不规则数组
多维数组被称为数组的数组,即多维数组中的每一个元素都是一个数组。