java基础

面向对象

面向对象与面向过程对比

面向过程利用函数,将问题分解为先后顺序的一个个步骤,依次调用,占用资源低,速度快
面向对象将问题分解为一个个步骤,再对步骤进行分门别类,形成一个个对象,进行不同对象之间的调用解决问题,占用资源相对高,速度相对慢

面向对象的三大特性

1、封装
封装就是将类的实现步骤隐藏,选择性提供操作的方法。类似发动机,我们不需要关心它是如何实现运作的。
内部的零件,架构已经被包裹起来(封装)
我们只需要知道给它提供汽油(方法启动前的各种配置,或需要的环境)
点火(点火的方法,启动后方法就被载入jvm,进行运作)
持续给油让它运作(持续运作方法,不中断它,让它一直保持运行)
换挡控制变速箱改变它的速度(提供给用户的方法,让用户调用,改变它的运作状态)
它就能通过暴露的齿轮给我们传递不同的动力(最终向用户输出的反馈)

2、继承
子类可以继承父类,以实现父类的功能,可以对它进行增加,也可以再额外拥有自己的方法

3、多态

java环境

一、解释型语言和编译型语言的区别

1、编译型
性能更快,集中翻译成指定平台的指令集,只能在该平台运行。

2、解释型
逐条翻译逐条执行,性能差,优势是可以针对不同平台进行不同编译,垮平台运行

二、JDK、JRE、JVM

在这里插入图片描述
1、JVM
java虚拟机,是一种用于计算设备的规范,通过在实际的计算机上仿真模拟各种计算机功能来实现的
引入jvm后,java在不同平台上运行不需要重新编译
java使用jvm屏蔽了平台相关信息,编译程序只需生成在jvm上运行的目标代码(字节码),就可以在多种平台不加修改的运行

2、JRE
运行JAVA程序的环境,可以让计算机系统运行java程序,JRE内部有一个JVM,以及标准的函数库

3、JDK
java软件开发工具包,jdk里面有java的运行环境JRE(JVM+java系统类库)和java工具
没有jdk无法编译java程序(指java源码,.java文件)
如果只想运行java文件(指class,或jar或其他归档文件),只要确保安装了JRE
JavaSE:标准版
JavaEE:企业版
J2ME:移动设备,嵌入式设备开发

jdk的基本组件
javac:编译器,将源程序转成字节码
jar:打包工具
javadoc:文档生成器,从源码注释中提取文档
jdb-debugger:查错工具
java:运行编译后的java程序(class后缀)
appletvlewer:小程序浏览器
javah:产生可以调用java过程的c过程,或建立能被java程序调用的c过程的头文件
jconsole:系统调试和监测的工具

JDK安装目录下的文件结构
bin:包含java,javac等JDK的各种工具命令
conf:配置文件
include:主要包含java与C交互的头文件(有大量.h文件,.h文件为C或C++的头文件)
JNI:用java调用本地的C编程,从而可以操作硬件相关功能
jmods:java的各个模块的jmod文件。java9开始庞大的java系统被分成各种不同的模块,从而更加轻量化
legal:授权文档
lib:(src.zip为java源代码)

基本数据类型

一、计算机数据介绍

位(bit):二进制 0或1
字节(Byte):8个bit (例:0000 0000)
2^10 = 1024(K) 2^20 = (M) 2^30 = ( G) 2^40 = (T)

二、类型分类

数值型

java所有数值类型占据的字节数量和平台无关
java7开始,加上前缀0b就可以写二进制数,0b1001就是9
java7开始,可以为数字字面量加下划线,如1_000_000

类型存储需求取值范围备注
byte1字节(8位,2^8个数)-128-127
short2字节(16位,2^16个数)-32768-32767
int4字节(32位,2^30 + 2^2 = 4G个数)-2G ~ 2G-1
long8字节(64位,2^64个数)
浮点型

double的精度是float的两倍

类型存储需求取值范围备注
float4字节32位,2^30 + 2^2 = 4G个数该类型带后缀F表示
少数情况使用该类型,如需要快速处理单精度数据,
或需要存储大量数据
double8字节8字节(64位,2^64个数)初始值不能为null
没有带后缀F默认为该类型

所有的浮点数值计算都遵循IEEE754规范
浮点数值不适用金额计算,要用BigDecimal

字符型

char用于表示单个字符,对应的是unicode编码
java中char用UTF-16编码描述一个代码单元
建议在程序中不使用char类型,除非确实需要对UTF-16代码单元进行操作,最好将需要处理的字符串用抽象数据类型表示

类型存储需求取值范围备注
char底层用数字来表示字符,通常用来表示字符常量
布尔型

整型值和布尔值之间不能进行相互转换

类型存储需求取值范围备注
boolean默认为false,如果是Boolean类型,默认为null,会至空

2、引用类型

三、使用细节

整型默认是int类型。
如果该数值比较小(没有超出取值范围),且直接赋值给byte或short,java也可以当成byte或short处理
如果直接给出一个巨大的整数,java不会自动把它当成long型处理,除非添加L或l后缀。

四、类型介绍

1、整型
整型的范围与运行java代码的机器无关,取值范围是固定的,所有数值类型所占的字节数量与平台无关
java没有任何无符号类型
长整型后缀L
十六进制前缀0x
八进制前缀0,不常用
java7开始前缀加0b可以写二进制数,可以为数字字面量加_用以区分

2、浮点类型
表示有小数部分的数值
double类型的精度是float类型的两倍,没有后缀F默认为该类型
float类型用的比较少,快速处理单精度数据,或需要存储大量数据能用
浮点类型数值计算都遵循ieee 754规范
浮点类型不适应禁止处现舍入误差的金融计算

3、char
用于表示单个字符,通常表示字符常量
java中char类型用utf16编码描述一个代码单元
建议不要在程序中使用char类型,除非需要对utf16代码单元进行操作,最好将需要处理的字符串用抽象数据类型表示

4、boolean类型
整型和布尔之间不能相互转换

五、类型转换

自然转换
在这里插入图片描述

long转double,long转float,int转float可能会发生精度丢失(溢出情况等)
强制转换
浮点转int:通过截断小数部分的方式(若想进行舍入计算,要用Math.round( ))
布尔值不应该与任何类型进行转换

变量

简介

java所有变量必须先声明,后使用,变量名由字母、数字,下划线和$组成,数字不能开头
指定类型的变量,只能装对应类型的数据
每个变量属于一种类型,类型位于变量名之前
可以在一行申明多个变量,但可读性降低

变量初始化

声明变量后必须用赋值语句对变量进行显式初始化,声明尽可能靠近第一次使用的地方

常量

final修饰,只能被赋值一次的变量,之后无法修改,名字全用大写
如果希望常量在类中的多个方法内都可以用,通常用static修饰为类常量
如果常量被申明为public,其他类的方法也可以使用这个常量

运算符

一、简介

参与/的两个数为整数表整数除法,否则为浮点除法
整数被0除会抛出异常
浮点数被0除会的到无穷大或NaN的结果

strictfp

默认情况下,虚拟机允许将中间计算结果采用扩展的精度,但当使用strictfp修饰的方法必须使用严格的浮点计算来产生理想的结果
如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算

//main方法中的所有指令都将使用严格的浮点计算
public static strictfp void main(String[] args)

二、自增自减

这些运算符改变了变量的值,因此不能操作数值
前缀方式先进行+1运算
后缀方式先使用变量原来的值
x++,x–,++x,–x

三、关系运算符与布尔运算符

各种关系运算符使用==检测是否相等
&&表与
‖表示逻辑或
支持三元运算符: x<y?x:y
&:表与,应用于布尔值,得到的结果也是布尔值
|:表或,应用于布尔值,得到的结果也是布尔值
^:异或
~:非
<<:将二进制左移
(>>):将二进制右移动,用符号位填充高位
(>>>):用0填充高位

String类型

字符串是用标准的Unicode格式存储

一、概念

java字符串由char序列组成,char采用UTF-16编码表示Unicode代码点的代码单元
Java没有内置字符串类型,而是在标准库提供了一个预定义类叫String
字符串和非字符串值拼接会转化成字符串
String类没有提供修改字符串的方法,String是不可变的,优点是编译器可以让String共享
不能用==检测两个字符串是否相等,它只能判断两个字符串是否放在同一个位置上
每次连接字符串都会构建一个新的对象,耗时且浪费空间,StringBuilder可避免这个问题

StringBuilder b = new StringBuilder();
b.append(te);
b.append(st);

基本方法

//字符串位于other前,返回负数,相等,返回0 .位于other之后,返回正数
compareTo(String other)
//如果字符串以suffix结尾,返回true
endWith(String suffix)
//如果字符串以suffix开始,返回true
startWith(String suffix)
//如果字符型与other相等,返回true
equals(Object other)
//如果字符型与other相等,返回true,忽略大小写
equalsIgnoreCase(String other)
//返回字符串第一个索引位置
indexOf(String str)
//返回字符串第一个索引位置,从fromIndex开始计算
indexOf(String str,int fromIndex)
//返回字符串最后一个索引位置
lastindexOf(String str)
//返回字符串最后一个索引位置,从fromIndex开始计算
lastindexOf(String str,int fromIndex)
//返回字符串长度
int length()
//替换
replace(CharSequence oldString,CharSequenece newString)

//截取
substring(0,3)
//转小写
toLowerCase()
//转大写
toUpperCase()
//删除头部和尾部的空格
trim()

可变字符串

每次连接字符串都会构建一个新的String对象,耗时且浪费空间
StringBuffer:线程安全,但执行效率低
StringBuilder是jdk5引入的类(前身是StringBuffer),线程不安全,效率高

输入输出

一、输入

1、输入语句

Scanner in = new Scanner(System.in);

2、文件输入(写入)
写入文件要PrintWriter对象,提供文件名,文件不存在会自动创建该文件

PrintWriter pw = new PrintWriter("file.txt");
二、输出

1、格式化输出
printf用于格式化输出,每一个以%字符开始的格式说明用相应的参数替换,转换符用于指示被格式化的数值类型,可用于限定手机号,身份证号码等一系列有规律的内容,详情百度

2、文件输出(读取)
写入文件要用File对象构建Scanner对象

Scanner in = new Scanner(Paths.get("file.txt"));

流程控制语句

一、if…else
二、switch

用于进行处理多个选项,该语法会去寻找匹配的case标签,执行到语句结束或遇到break停止
没有匹配的case标签,就会寻找default语句

三、while循环

while循环先检测循环条件,因此循环条件不满足时循环也不会开始
如果希望循环体至少循环一次,可以使用do…while循环

四、for循环

for循环利用每次迭代之后更新的计数器或类似的变量来控制迭代次数,它是while循环的简化形式
它的三个部分对应计数器变量初始化,检测和更新

五、中断控制流程语句

1、break
结束当前循环,break后可以加标签,直接跳出标签位置层的循环

2、continue
忽略本次continue后面的语句,直接开始下一次循环。(放在循环的最后一行没有意义)
continue也可以带标签,用于忽略标签所代表的循环的剩下的语句,重新开始下一次标签所代表的循环。

3、return
结束方法

数组

一、简介

数组本质上还是变量,是引用类型,用来存储同一类型值的集合
数据结构里数组存,取是最快的,数组变量保存了数组对象的首地址,(追求性能索引都从0开始,当取地址时,可以直接用加法运算,而不需要用减法,减法需要转换成补码然后进行加法运算,速度没有直接用加法快【计算机底层根本不能做减法】)
数组一旦创建就不能改变大小

二、使用数组

1、数组创建
静态初始化:int[] a = new int[]{1,2,3,4,5}
动态初始化:int[] a = new int[4];
系统会自动赋初始值
数值类型为0
布尔类型为false
引用类型为null

2、遍历数组
1.for循环
2.for each
3.System.out.prinntln(Arrays.toString(a));也可以快速打印数组所有值

3、数组拷贝
通过Arrays.copyOf可以将一个数组的所有值拷贝到一个新的数组中去,这个方法通常用来增加数组的大小
如果数组元素是数值型,多余的元素赋值0,布尔型赋值false,若长度小于原始数组长度,只拷贝前面的数组元素

a = Arrays.copyOf(a,2*a.length);

4、数组排序
Arrays.sort()可以进行排序

5、多维数组
Java实际上没有多维数组,只有一维数组,多维数组被解释为数组中的数组(每个值又是数组)

正则表达式

一、通配符,每个通配符都只能代表一个字符

. : 一个字符
\d :一个数字
\D :一个非数字
\w :一个单词字符
\W :一个非单词字符
\s :一个空白
\S :一个非空白字符
[a-d]:范围,a,b,c,d中一个字符
[adm]:枚举,a,d,m中一个字符
[am4-6]:混合,a,m,4,5,6其中一个字符
[^a-d]:求否,不是a,b,c,d其中的一个字符
[a-g&&[^c-e]]:求与,不是a,b,f,g其中的一个字符

二、出现频率

?:前面的字符可以出现0-1次 {0,1}
*:前面的字符可以出现0-N次 {0,}
+;前面的字符出现1-N次 {1,}
{m,n}:前面的字符可以出现m-n次
{m,}:前面的字符可以出现m-无限次
{,n}:前面的字符可以出现0-n次
{n}:前面的字符可以出现n次
^:开头
$:结尾

三、成组

(abc)[1,2]:可代表abc、abcabc
((abc)|(123))* :可代表“ ”,abc123
((abc)|(123)):可代表“ ”,abcabc,123123

四、java对正则表达式的支持

1、String类
matches(regex):判断该字符串是否匹配正则表达式
split(regex):根据指定的分隔符将字符串分割成多段
replaceAll(regex,replacement):将regex匹配的内容替换成replacement

2、Pattern和 Matcher类
用于实现从文本中提取有效的信息,比如手机号码,等。
Pattern对象是正则表达式编译后在内存中的表现形式,因此,正则表达式字符串必须先被编译成Pattern对象,
然后利用该Pattern对象创建对应的Matcher对象,执行匹配所涉及的状态保留在Matcher对象中,多个Matcher
对象可以共享一个Pattern对象。

多线程

常用方法

//查看当前线程id
Thread.currentThread().getId()

反射

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值