java学习(结合达内课程和java核心技术卷一)

旨在记录学习到的知识,遇到的问题。解决方法优先选择别人的回答,主要记录解决方法的思路和步骤。

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)整型
整型用来表示没有小数部分的数值,允许是负数。

类型存储需求
int4字节
short2字节
long8字节
byte1字节

在java中,整型的范围与java代码的机器无关,所有占的位数固定。

可恶,丢失存档一份,这玩意不是会自动保存的嘛,太阳太阳太阳
更新2023/11/3

长整型数值的后缀有一个l或L,16进制数值有一个前缀0x或0X,八进制前缀0,如010对于十进制中的8,很显然容易混淆所以不建议使用。
从java7开始,加上前缀0b或者0B可以写二进制,另外可以为数字字面量加下划线如1_000_000表示100万,编译器会去除这些下划线。

(2)浮点类型

类型存储需求
float4字节
double8字节

float(单精度类型)类型的数值有一个后缀F或f,没有后缀的默认为double(双精度类型)类型,也可以再数值后加d或D,表示double类型。

可以用16进制表示浮点数值。例如0.125= 2 − 3 2^{-3} 23 可以表示成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 不规则数组

多维数组被称为数组的数组,即多维数组中的每一个元素都是一个数组。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值