Java-Review-Note——1.Java基础知识

来源:互联网 发布:网络语偷猪是什么意思 编辑:程序博客网 时间:2024/05/21 22:25

Java-Review-Note——1.Java基础知识

标签: JavaStudy


1.面向过程与面向对象的对比

用简单的例子来帮助理解:平时玩的棋类游戏

面向过程要思考的是:(步骤)

开始游戏
-> 甲方先走 -> 绘制棋盘 -> 判断输赢
-> 乙方走 -> 绘制棋盘 -> 判断输赢
-> 重复上面两个过程,直到输出最后结果

面向对象要思考的是:(功能)

分为三个部分(对象):玩家对象棋盘系统规则系统
流程如下:
甲乙两个玩家对象,负责接收用户的下子(输入),然后告诉棋盘系统
棋局的变化,同时刷新棋盘,并且利用规则系统进行输赢,是否犯规
等的判定。

思考

相比前者,面向对象表现得更为灵活,试想如果想加一个
悔棋功能,哪个会更容易实现点?

笼统定义:将生活中的对象进行描述,通过类的形式,描述事物的属性和行为
面向对象是从宏观来看待问题的,面向过程则是从微观来解析问题


2.Java相关名词

四种技术架构JAVASEJAVAEEJAVEME(嵌入式,已过时),JavaCard(适用于智能卡的Java平台)

Java主要优点

面向对象跨平台多线程安全简单和健壮性,以及改进了的解释性:
为了弥补解释语言较慢的不足,Java采用预编译方法,生成字节代码,有些JAVA环境用JIT编译器将
字节码编译成机械码,直接运行,针对重复执行的服务端软件可以达到C的速度。

JVM Java虚拟机(Java Vitual Machine)

是一种想象中的机器,在实际计算机上通过软件模拟来实现,在Java运行环境中处于可信地位,
它使得Java可以跨平台执行,包含一套字节码指令集一组寄存器一个栈一个垃圾回收堆
一个存储方法域

运行原理:在任何一个平台上都给编译程序一个共同的接口,Java源程序经过编译器编译后变成字节码,
字节码再由虚拟机解释执行,虚拟机将每条执行的字节码送给解释器,解释器翻译成特定机器上的机器码
最后在特定的机器上运行

JRE与JDK

JRE(Java Runtime Enviroment)运行时环境: JVM + 核心类库
JDK(Java Development Kit)开发工具集: JRE + 编译器

JVM的垃圾回收机制(Garbage Collection)

回收的是没有任何引用指向的对象空间,一般情况下Java会自动进行垃圾收集
如果想要手动请求垃圾收集,可以调用system.gc()或者finalize()方法建议;
也仅仅是建议而已,并不能精确地控制垃圾回收机制的执行

环境变量配置

新建:JAVA_HOME:jdk的安装路径,比如:C:\Program Files\Java\jdk
修改:PATH,光标移到最前面(Home键),添加:%JAVA_HOME%\bin;
新建:CLASSPATH,添加:%JAVA_HOME%\lib\tools.jar;

Java代码的运行原理


3.基础知识


运算符


算术运算符(12个)

需要注意

  • 如果除号的前后都是整型,那么结果也为整型 eg:5 / 2 = 2
  • 求余运算符通常用于整型,当然浮点型也可以,但结果是不准确的,但对精度要求
    较高时就不要了,可以使用BigDecimal类型
  • 自增和自减作为前缀还是后缀的问题:前缀:先自增,后参与运算 后缀:先参与运算,后自增
    比如,这样的程序

输出结果:

你算对了没?对付这种自增自减的问题,更重要的是细心,还有一点要注意的是:
自增自减运算符只能对单个变量起作用,表达式和常量是没用的
eg:(a + b)++ 想让相加后的结果+1,但是确是错的,
同样,常量也是不行的,6++,这样也是错的!切记!


逻辑运算符(7个)

需要注意

短路现象,区分逻辑与/或短路与/或 的区别,短路与/或
之前前置条件为真/假,后面就不会判断了,结果一定为真/假


三元运算符

a ? b : c

如果a成立执行b,不成立执行c,精简版的if-else,另外要注意,b,c 需为表达式,即
有返回值!


位运算符(7个):

<<: 左移1位等于乘以2
>>: 右移一位等于除以2;再取整,移位溢出的丢弃
>>>: 无符号右移 最高位不是用原来的最高位填充,而是直接用0来填充最高位
~:按位取反,~a = - a -1
&:操作数都为1结果为1,否则结果为0
|:操作数都为0,结果才为0,否则为1
^:操作数相同为0,不同结果为1

不用第三个变量交换两个变量的值得方法

利用他们的和:a = a + b;b = a - b;a = a - b;
用^运算符:a = a^b; b = a^b; a = a^b;

编码相关常识

原码:最高位为符号位,比如8位二进制对应的取值范围为:
[1111 1111,0111 1111] 即:[-127,127]

反码:正数反码不变;负数最高位不变,其他位取反
比如:
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反 一般转换成原码后才能看出他的数值

补码:正数补码不变;求反码后 最低位 + 1
比如:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补 同样也是需要转成原码才能看出值

计算机加入符号位会使基础电路变得十分复杂,1 - 1 = 1 + (-1) = 0
那么机器就可以只有加法没有减法,演变过程:
原码:0000 0001 + 1000 0001 = 1000 0002 = -2
=> 反码:原式 = [0000 0001]反 + [1111 1110]反 = 1111 1111 = -0
0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0
=> 补码:原式 = [0000 0001]补 + [1111 1111]补 = 0000 0000 = 0
-0的问题解决了,还能表示多一个最低数,比如[-127,127]用补码:[-128,127]

进制转换

所有进制转十进制权值相加,示例如下:

二级制(0,1): 1011 = 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 11
八进制(0~7): 53 = 5*8^1 + 3*8^0 = 43
十六进制(0123456789ABCDEF): 2B = 2*16^1 + 12*16^0 = 43

十进制转其他进制一直求余法先转二进制再转

二进制与八进制互转三合一法,不够补零;

比如:11010111.0100111转八进制
小数点左边部分:011 010 111 右边部分010 011 100 => 327.234
如果是八转二:取一分三法,如327 = 011 010 111

二进制与十六进制互转四合一法取一分四法,和八进制类同,略..

八进制与十六进制互转:先转二进制,再转


运算符优先级


数据类型

基本数据类型

整型:intshortlongbyte;都是有符号的
浮点型:floatdouble
字符型:char
布尔值:boolean

要注意

①Java中,如果是想表示float类型的必须在后面加后缀F,如果没有后缀的话会被默认double类型
②在Java中char占用两个字节哦!因为Java使用Unicode 16位的编码方式,可以表示所有的字符
③布尔值boolean只有两个值:要么是true,要么是false,不能用1,0来表示真假!

数据类型的自动转换

自动转换(隐式):如果满足以下两个条件就会进行自动转换:
转换后的类型比原来的类型大转换前后类型相互兼容
比如:两个byte变量相加后,结果是int类型
强制转换(显式),前面加个(数据类型),需注意精度丢失的问题

包装类相关

我们可以直接调封装器类的下述方法获得对应参数,以Integer为例

Integer.MAX_VALUE = 0x7FFFFFFF; //正数最大值
Integer.MIN_VALUE = 0x80000000; //负数最大值
Integer.SIZE = 32; //字节数

Integer还提供了几个进制转换的方法

转二进制:toBinaryString()
转八进制:toOctalString()
转十六进制:toHexString()
二,八,十六转十进制:decode()

另外int和Integer可以直接比较是否相等,因为Java会自解装,如果
是两个Integer比较,需要掉intValue()方法进行比较;或者调
compareTo方法也行。


常量与变量

需注意的

对于局部变量,当我们想要使用一个变量的时候,要先对他进行初始化,不然编译器会报错!!!
而例外的情况:实例变量与类变量,编译器会自动地对他们进行初始化
默认:boolean变量 为false,char默认为’\000’


字符串

字符串相关的操作方法

  • 1.字符串的连接:用”+”加号可以连接成字符串,比如: 123 + “” = “123”
  • 2.求字符串的长度: str.length()
  • 3.求子串:str.subString(开始下标,”结束下标”) //注意是从0开始算的
  • 4.判断是否相等:这里要注意==这个比较的是字符串是否存储在同一位置!如果是比较内容我们要用equals(“”);
  • 5.返回给定下标处的字符: str.charAt(int index); //从0开始算的
  • 6.将指定字符串连接到字符串的尾部: str.concat(“HeHe”);
  • 7.检索某字符在字符串中第一次出现的下标: str.indexOf(“a”);
  • 8.检索某字符在字符串中最后一次出现的下标:str.lastIndexOf(“a”);
  • 9.去掉头尾的空白:str.trim(),这个在数据库操作中比较常用
  • 10.替换字符串中的某段: str.replace(“想替换的字符串”,”替换后的字符串”);
  • 11.比较两个字符串的大小,无视大小写:str.equalsIgnoreCase(stg);
  • 12.全部字符转化为小写:str.toLowerCase()
  • 13.全部字符转化为大写:str.toUpperCase();
  • 14.切割字符串,返回字符串数组:str.split(String),比如有:abcdeabcab
    split(“a”)会返回一个字符串数组:{“bcde”,”bc”,”b”},转义字符要注意!!!
    另外还有另外一个构造方法可以对多个字符进行分割,比如:split(new char{‘c’,’d’,’e’})
  • 15.字符串拼接:使用concat比+好,当然前提是拼接的两个都是字符串,字符串
    拼接首选StringBuffer

正则表达式

口诀一个字符用\,多个字符用[],字符次数用{}

符号 作用 ^ 代表一行的开头 $ 代表一行的结尾 | 代表左右两表达式间是或的关系,匹配左边或右边 通配符 .(小数点) 除换行符(\n)外任意字符 \s 空白字符(空格,\r,\n,\t) \S 非空白字符 \d 数字(0-9) \D 非数字 \w 单词字符(A-Z,a-z,0-9,下划线,字母) \W 非单词字符 表示匹配次数的副词 {a,b} 它前面的东西可以出现a-b次 {a,} 它前面的东西至少出现a次 {,b} 它前面的东西最多出现b次 {a} 它前面的东西必须出现a次 ? 它前面的可以出现0次或1次 * 它前面的东西可以不出现或出现任意次数 + 它前面的东西至少出现一次 方括号表达式 [abcef] 枚举,可以是括号里的任意一个字符 [a-f] 范围:可以是a-f中的任意一个字符 [a-f1-3] 枚举与范围,可以是abcdef123中的任意一个字符 [^a-c] 求否,不含a,b,c中任意一个字符 [a-g&&[^b-d]] 求交集,不含a,e,f,g中任意一个字符

字符串匹配:String提供了一个matches()的方法用来匹配正则表达式,附上几个常用的正则:

\\手机号码String str = "13800138000";String phoneRegex = "^((1[3,5,8][0-9])|(14[5,7,9])|(17[0,1,5,6,7,8]))\\d{8}$";boolean match = str.matches(phoneRegex);\\身份证号码String idCardRegex = "(^\\d{15}$)|(^\\d{17}[0-9Xx]$)";\\邮箱String emailRegex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";

字符串查找与替换:Java提供了Pattern(正则模板类)和Matcher(匹配工具类)
Matcher提供了两个核心方法,find()查找匹配的字串,group()去除上次与表达式匹配的字串。
start()获得匹配字串的起始下标,end()获得匹配字串的结束下标,
groupCount()查询有多少个复合表达式的字串。
另外,查找的时候切记别带上^和$!

示例:查找字串中的邮箱

public class Main {    public static void main(String[] args) {        String str = "有几个邮箱:123@gmail.com,123@qq.com, 123@bb.cc";        String emailRegex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";        Pattern pattern = Pattern.compile(emailRegex);        Matcher matcher = pattern.matcher(str);        while (matcher.find()) {            System.out.println(matcher.group());        }    }}

运行结果

你可以

需注意

:String str = “abc” str = “cba”那么string对象是否会发生改变呢?
答:不会,str只是作为一个引用指向一个字符串存储的内存空间,str存储的只是
一个地址,当我们定义字符串变量时,系统会先对String常量池中的字符串进行匹配
有的话直接使用已经存在的字符串常量,否则在池中再生成一个!


程序流程控制

if语句else语句总是和其最近if语句相互搭配,当然前提是他们在同一块中
switch:要注意的就是记得给每个case写个break,不然每个都会执行一遍
whiledo-while()的区别:无论条件是否成立,后者至少执行一次
for(初始化,条件判断,迭代):循环嵌套时一定要有条件跳出循环,小心死循环
break语句:可以直接终止循环,多层嵌套时,跳出一层循环
continue语句:直接停止本次循环的剩余语句,直接进行下一次循环
return语句:只能用在方法(函数)中,结束当前的方法


数组

  • 创建:int[] array = new int3; //定义一个容量为3的整型数组
  • 初始化:定义的时候初始化,或者利用for循环进行赋初值
  • 使用获取长度:array.length; 数组复制:长度,类型相同的
    直接数组名赋值就好;main()的参数拿来用,命令行下可以在java … 后添加参数
  • 多维数组Java的多数组的列数可以是数目不同的
    例子如下:
public class arrayTest {      public static void main(String[] args) {          //①直接一开始赋初值          int[][] array1 =           {                  {123},                  {456},                  {789}          };          //②创建规则的二维数组 5*3的          int [][] array2 = new int[5][9];                  //③创建不规则的二维数组:3行,列数依次为:3,2,1          int [][] array3 = new int[3][];          //指定每一行的列数          array3[0]= new int[3];          array3[1]= new int[2];          array3[2]= new int[1];                        //赋值        for(int i = 0;i < array3.length;i++)          {              for(int j = 0;j < array3[i].length;j++)              {   ...  }          }      }  }  

MusicTime:失落沙洲——徐佳莹


2 0
原创粉丝点击