java基础知识

环境搭建

java特性

  1. 纯面向对象;
  2. 跨平台的语言,可以在windows、linux等不同平台下运行
  3. 健壮的语言,吸收了C/C++语言的优点
  4. 有较高的安全性,在进行某些可能出错的事情时,会有异常提示
  5. 自动GC
  6. 强制类型检查
  7. 取消指针

Java虚拟机


JVM:可运行java字节码文件的虚拟计算机系统

  • ta有一个解释器组件,可以实现java字节码和计算机操作系统之间的通信
  • 对于不同的运行平台,会有不同的JVM

java的垃圾回收

  • java语言消除了程序员回收无用内存空间的责任
  • JVM提供了一种系统线程跟踪存储空间的分配情况,并在JVM空闲时,检查并释放那些可以被释放的存储空间
  • GC在java程序运行时自动启用,程序员无法精确控制和干预。

mac下配置环境变量常见问题

  1. 查看默认的 jdk 下载地址
/usr/libexec/java_home -V
  1. 如果你是第一次配置环境变量,可以使用"touch .bash_profile" 创建一个 .bash_profile 的隐藏配置文件(如果已经有存在的配置文件,则使用"open -e .bash_profile" 命令)

  2. 打开bash_profile文件,可以参考下列形式进行编辑,路径即为第1部分的路径

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/HomePATH=$JAVA_HOME/bin:$PATH:.CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_HOMEexport PATHexport CLASSPATH

由于我装了两个java版本,因此该文件设置成下面的形式,保证可以通过alias命令进行java版本的切换:

JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
JAVA_11_HOME=/Library/Java/JavaVirtualMachines/jdk-11.0.6.jdk/Contents/Home
JAVA_HOME=$JAVA_11_HOME
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_8_HOME
export JAVA_11_HOME
export JAVA_HOME
export PATH
export CLASSPATHalias jdk8='export JAVA_HOME=$JAVA_8_HOME'
alias jdk11='export JAVA_HOME=$JAVA_11_HOME'
  1. 使用"source .bash_profile"使配置生效
  2. 输入 echo $JAVA_HOME 显示刚才配置的路径,输入对应的“jdk8”,"jdk11"看下是否java版本也会跟着切换。

java的注释方法

  1. 单行注释://这里是单行注释
  2. 多行注释:/这里是多行注释/
  3. 文档注释(放在class或者方法最前面):/**这里是文档注释 */

基础语法

二进制

  1. 计算机中的数据都以二进制的形式进行存储
  2. 二进制转十进制:
  • 十进制的123,可以分解为:1 * 102+2 * 101+3 * 100
  • 二进制的1010,就是把对应的10改成2就可以,即分解为:1 * 23+0 * 22+1 * 21+ 0 * 20,即1010是十进制的8+2=10
  • 对应的,二进制的1111,就是:8+4+2+1=15,可以快速计算
  1. 十进制转二进制:
  • 十进制的表现形式可以这样理解,比如十进制的123,一直对其除以10,until最后的商是0。得到的余数分别是:3,2,1,则对应的十进制表现形式为123;对于十进制的168同样是这样,一直拿10除以,until最后的商是0,得到的余数分别是8、6、1,则其十进制表现形式为168。
  • 对于二进制,可以用十进制的数,除以2。比如拿1010,依次除以2,until最后的商是0,则得到的余数分别是0,1,0,1。
  1. 一个字节byte,就是8个位bit,而一个bit就对应一个二进制数。因此一个字节就对应最大为11111111的数,这个值转化为十进制就是255。所以如果追求极致性能,能用0-255范围内的,就不要用这个范围外的数值。

变量概述

  1. 变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。由于该内存单元的数据可以发生改变,因此命名为“变量”。(植物大战僵尸游戏中的阳光数量就是一个变量,可以手动修改)
  2. 变量按照数据类型划分:基本数据类型变量、引用数据类型变量
  3. 变量按照声明的位置划分:局部变量(方法内部、语句块内部)、成员变量(方法外部,类的内部定义的变量)

数据类型与变量

  1. 8大数据类型:
  • 数值型

    • 整数:byte(1字节,-128到127)、short(2字节)、int(4字节,-20亿到20亿)、long(8字节)
    • 浮点型:float(4字节)、double(8字节)
    • 字符型:char(2字节,\u0000到\uffff,最小的十六进制到最大的,这个就是文字的范围)
  • 布尔型:boolean(true 或者 false)
  1. 引用数据类型:
  • 类(class)
  • 接口(interface)
  • 数组(array)
  • 字符串(String)
  1. 标识符:Java对包、类、方法、参数和变量等要素命名时使用的字符序列称为标识符,规则如下:
  • 由字母、数字、下划线_、美元符号$组成

  • 不能以数字开头

  • 区分大小写

  • 长度无限制

  • 不能是Java中的保留关键字

  • 一定要“见名知意”

  1. 数据类型转化的时候,如果把一个容量小的类型变量,赋值给一个容量大的类型变量,如把int i=b,但是b是一个byte,则可以正常进行,反之可能会导致精度丢失,此时需要进行类型的强制转换。

float变量

  1. float变量定义时,赋值时可以在等号右侧浮点数字的后面,加入f,表示写入的数字类型是float,否则默认为double
float a=10.1f
  1. long类型变量定义赋值的时候,需要在整型数字后面加入l,表示写入的数字是long类型的
long b=123456789987l;
  1. char类型变量,定义赋值的时候,等号右侧需要使用单引号’’,且单引号中只能放一个英文字母,不能放两个。
    另外char类型可以转换为int。
    当使用++运算符的时候,会在ascii表中自动找下一个。
char c1='c';
System.out.println(c1);//c
System.out.println((int)(c1));//99
System.out.println(++c1);//d
System.out.println(++c1);//e
char c2='你';
System.out.println(c2);//c
System.out.println((int)(c2));//20320
System.out.println(++c2);//佡
System.out.println(++c2);//佢

方法的使用-简述

  1. 权限修饰符
    | 修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 不同包非子类 |
    | ------ | ------ | ------ |
    | private | Y | N | N | N |
    | 默认 | Y | Y | N | N |
    | protected | Y | Y | Y | N |
    | public | Y | Y | Y | Y |

  2. 还有:参数列表、返回值类型、方法名称

算术运算符

    • / %这五大基础运算符
  1. int/int,int和int的运算结果一定是int
  2. ++i,如果这个符号放在前面,则先自增,后进行其他操作(赋值等);如果是i++,则先进行其他操作,再自增。–符号也同理;
int i=10;
System.out.println(i++);//10
System.out.println(i);//11int j=10;
System.out.println(++j);//11
System.out.println(j);//11

赋值运算符

a+=b;//a=a+b;
a%=b;//a=a%b;

关系运算符

  1. 包含== != > < >= <=,返回一个boolean(true or false)

逻辑运算符

运算符 描述
& 与,true&false返回false,无论如何,左右都要运算
| 或,true|false返回true,无论如何,左右都要运算
^ 异或,符号两侧的不一样,返回true;符号两侧的一样,返回false;
!
&& 短路与,true&false返回false,如果左侧为false,右侧直接不运算直接返回false
|| 短路或,true||false返回true,如果左侧为true,右侧直接不运算直接返回true

字符串连接符

1、用+可以对两个字符串,进行连接;+的两侧,只要有一侧是String,如果另外一侧不是String,就会将其强制转化为String,此时的+就是字符串连接符,但不是运算符。

三目运算符

X ? Y : Z
X为boolean,若X为true,则执行Y;否则执行Z;

位运算符

  1. 转化为二进制再进行计算
  2. 位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
  3. &:都是1,结果才是1;否则是0;
  4. |:有一个是1,就是1
  5. ~:如果位为0,结果是1,如果位为1,结果是0;
  6. ^: 相同则结果为0,不同则结果为1。

运算符顺序

具体顺序,参照表格和网上资料,也可以使用时再查找,建议工作中保持运算符顺序逻辑清晰和一定可读性;

变量作用域

Q:静态方法为什么不能调用非静态成员(成员方法和成员变量)?
A:前者比后者的生成时间早;

  • 静态方法在项目编译时就运行了,是属于类的。
  • 非静态成员和对象相关,当new对象时会调用构造器,实例化对象,非静态变量才存在
  • 静态方法在编译的时候非静态变量还不存在,所以静态方法不能调用非静态成员
  • 而动态方法只能通过对象来调用,所以动态方法可以调用非静态变量。
  • 非静态方法可以调用静态成员。

编程规范

以“阿里巴巴Java开发手册.pdf”为标准,后续会进行文档下发。

转义字符

  1. 使用\进行转义,让原本的’ " \等符号,回归其本来的样子。。比如要打印一个双引号。。
  2. \n,换行,表示当前位置移到下一行的开头
  3. \r,回车,当前位置移到本行开头
  4. \t,水平制表符,通过\t可以保证打印出来的字符串间隔距离一样,比较整齐。
System.out.println("1\t2\t3");
System.out.println("1111\t2222\t3333");

流程控制

接收用户输入

共介绍了三种方式接收用户输入,三种各有利弊,详见下面的代码部分

import java.util.Scanner;public class DemoSysInput {//测试三种接收用户输入的方法public static void main(String[] args) {// TODO Auto-generated method stub//将系统输入System.in作为入参,new一个Scanner对象,此时会提示导入java.util.Scanner包Scanner sc=new Scanner(System.in);//方法1,使用nextInt(),nextFloat()等方法,缺点是用户输入必须符合指定类型,否则接收会报错InputMismatchExceptionint input1=sc.nextInt();float input2=sc.nextFloat();System.out.println("接收到的第1个是:"+input1);System.out.println("接收到的第2个是:"+input2);//方法2,使用next()接收所有类型的输入,其返回的是一个String,该方法会无视输入的空格,如下例String input3=sc.next();//此时我输入的是"  a1& c32 123"(注意里面有空格,且以两个空格开头)System.out.println("接收到的第3个是:"+input3);//返回的input3是"a1&"//方法3,使用nextLine()接收所有类型的输入,其返回的是一个String,会把一行中接收到的所有内容都返回,但是不能与方法2同时存在,运行时把方法1、2的部分注释掉String input4=sc.nextLine();//此时我输入的是"  a1& c32 123"(注意里面有空格,且以两个空格开头)System.out.println("接收到的第4个是:"+input4);//返回的input4是"  a1& c32 123"}}

switch

  1. 这是一种做选择题的分支语句,语法形式如下:
    switch(表达式){
    case 值1:语句块1;break;
    case 值2:语句块2;break;
    case 值n:语句块n;break;
    default:语句块n+1;break;
    }
  2. switch(表达式)中的表达式返回值必须是下列类型之一:
  • int
  • byte
  • char
  • short
  • String
  1. default语句可选,如果上面的case都没执行,也都要执行default。
  2. case 值中的值必须是一个常量,不能是变量。
  3. 如果某个case后没有写break,会继续往下执行其它的case,直到遇到break!如果都没有break,会全部执行一遍。。。

for循环

  1. 下列代码为死循环,会一直执行,因为for循环中判断条件默认为true
for(;;){}
  1. 下列代码输出为:1 3 2 3 2 3 2 3 2…
for(System.out.println(1);;System.out.println(2)){System.out.println(3);
}

循环类型选择

  • 知道循环次数,选择for循环
  • 先判读逻辑,后执行,while循环
  • 先执行后判断,do-while循环,至少执行一次

break与continue

  • break后终止所有循环
  • continue后,直接进入下一次循环
  • break只能退出其所在的循环语句,存在多层循环嵌套的时候,不能退出其外层的循环。如果需要跳出外层循环,则可以对外层循环命名(在循环语句前写上 循环名称:),再写break 循环名称;即可。

判断用户的输入类型

如果使用了nextInt(),nextFloat()等方法,为了代码健壮性,需要判断用户入参类型,可以借助对应的hasNextInt()等方法。

//将系统输入System.in作为入参,new一个Scanner对象,此时会提示导入java.util.Scanner包Scanner sc=new Scanner(System.in);
//使用nextInt()等方法,需要进行数据保护if(sc.hasNextInt()) {//输入的是intint input5=sc.nextInt();System.out.println("输入的数据类型正确:"+input5);}else {//输入的不是intSystem.out.println("输入的数据类型有误:");}

数组

数组概念

  1. 数组是相同数据类型多个数据的容器
  2. 数据顺序,按照线性顺序排列
  3. 下标从0开始

数组创建

//1、数据类型[] 数组名称={数据1,数据2,数据3};
int[] ages={10,11,12};//创建数组的同时,指定数组的内容;//2、数据类型[] 数组名称=new 数据类型[数据长度];
int ages2=new int[3];//创建数组,并指定长度,但不指定内容//3、不常见:数据类型[] 数组名称
int[] ages3;//4、不常见:创建数组,并指定内容
//数据类型[] 数组名称=new 数据类型[]{数据1,数据2,数据3}
int[] ages=new int[]{11,12,13};

数组操作

//1、给数组某个下标赋值:数组名称[下标]=值;
ages2[0]=100;//2、从数组某个下标取值,数组名称[下标]
System.out.println(ages[0]);//3、数组长度:数组名称.length
for(index=0;index<ages.length;index++){System.out.println(ages[index]);
}

数据常见问题

  1. 下标越界问题,outofBoundryException
    发生该问题后,程序马上停止运行。
  2. 空指针问题,NullPointerException
    由于数组也是引用类型,因此当整个数组的内存存储的是null时,对该数组操作会引起该错误。

数组常用算法——冒泡排序

直接看下面的代码

int[] array=new int[] {3,2,1,2,-2,12,33,21,2,3,2,34,23,242,32,3};//每次将最大的一个元素,冒到最后面(第二次为倒数第二个位置,第三次为冒到倒数第三个位置),共需要length-1次循环//每一个循环内部,需要依次两两对比元素,保证前小后大//0次循环,length-1//1次循环,length-1-1//2次循环,length-1-2//...i次循环,length-1-ifor(int i=0;i<array.length-1;i++) {for(int j=0;j<array.length-1-i;j++) {if(array[j]>array[j+1]) {//此时需要调换int tmp=array[j];array[j]=array[j+1];array[j+1]=tmp;}}}

数组常用算法——二分查找

  1. 二分查找,即需要在数组中找到目标的位置
  2. 二分查找只能针对已经有序的数组,如果数组无序,则应该首先进行排序,思路是每次折半查找。
  3. 二分查找的主要思路如下
  • 需要有三个pointer,分别指向最小下标,中间下标、最大下标
  • 每次先确认最小下标、最大下标(即查找的范围)
  • 计算中间下标的位置(最大+最小)/2
  • 比较中间下标对应的数据,与要查找的数据。如果相等,则就查到了;如果前者大,排除掉右侧更大的,最大下标等于中间下标-1;如果后者大,排除掉左侧那些比较小的,此时移动最小下标,使其等于中间下标+1
  • 当最小下标>最大下标,说明数据不存在

二维数组和多维数组

//多维数组new的时候,仅仅必须声明最外层的数组长度
int[][] array=new int[9][];//不报错
array[0]=new int[8]{1,2,3,4,5,6,7,8};
array[1]=new int[7];//当内外两层的数组都声明了长度,此时内层数组的维度是一样的,如下
int[][] array=new int[9][8];//不报错,外层数组有9个元素,内层有8个。

javaEE-java基础知识相关推荐

  1. java基础知识之初识java

    java基础知识之初识java JAVA基础课后总结 一 1.计算机程序 定义:程序(Program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合. 2.指令 定义:指令就是指示机 ...

  2. java 基础知识总结

    Java基础知识总结 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思 ...

  3. Java基础知识复习(一)

    Java基础知识复习(一) 目录 Java简介 命名规则 八种基本的数据类型 字面量 类型转换 变量的形态 逻辑运算符 位运算 移位运算 习题知识点 目录 Java简介 Java是由Sun公司在199 ...

  4. Java 基础知识总结(下)-王者笔记《收藏版》

    上一篇 Java基础知识学习总结之(上) 下一篇 Java 集合容器篇面试题  (上) java毕业设计项目<100套>推荐 毕设/私活/大佬必备,一个挣钱的开源前后端分离脚手架 2W字梳 ...

  5. 零基础学习Java真的很难?初学者必须了解的Java基础知识梳理

    作为最受欢迎的编程语言之一,Java是很多人转行的首选.对于零基础而言,在学习Java前要了解哪些语言特征和常识呢?下面,小编就来分享一下零基础学习Java者必须了解的Java语言常识以及知识. 从1 ...

  6. 干货!Java基础知识梳理,绝对经典

    作为最受欢迎的编程语言之一,Java是很多人转行的首选.对于零基础而言,在学习Java前要了解哪些语言特征和常识呢?下面,就分享零基础学习Java必须了解的Java语言常识以及知识. 从1995年诞生 ...

  7. java基础知识之加强

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  8. java基础知识复习(上半)

    java基础知识复习 java为什么被发明? Green项目的确立,应用于像电视盒一样的消费类电子产品,语言本身本身中立. java的三大版本? javaSE的定位在于客户端,只要用于桌面应用软件的编 ...

  9. java基础知识总结,javaweb参考资料大全

    Java基础知识总结 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思 ...

  10. 重拾java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

最新文章

  1. Vim编程之:tags,cscope,taglist
  2. eclipse 拨打电话、拨号,发短信
  3. Csharp: Winform 顏色選擇器 Color convert RGB and RGB convert Color
  4. Struts+Tomcat搭建
  5. window mysql5.5错误
  6. CCF201312-5 I’m stuck
  7. imp 只导入索引_Elasticsearch系列---实战零停机重建索引
  8. es6删除数组某一项_「JavaScript 从入门到精通」10.数组
  9. 存货控制中的ABC分类释义
  10. 清空对象里面所有的value值_Python 面向对象之组合用法
  11. 【数学建模】排队论(最优化)
  12. android pt分区,[玩机技巧之Android篇]系统分区之System、Data、cache 来自 淡影寒...
  13. 玩转Python,30行Python代码刷王者荣耀金币
  14. 企业号 网页授权 php,微信企业号开发之网页授权接口调用示例
  15. 语雀可以导出html吗,工具 - Confluence 迁移到语雀 - 《语雀使用文档》 - 书栈网 · BookStack...
  16. 登录双token方案
  17. Cache数据库入门
  18. 【C语言训练】自由落体问题
  19. Linux 域名解析实验
  20. 7、KNN(K近邻)

热门文章

  1. 【爬虫】002 python3 +beautifulsoup4 +requests 爬取静态页面
  2. SQL内置系统账户:Local system/Network service/Local Service 区别
  3. ubuntu20.04设置rc.local
  4. 把自己坑的Could not invoke service..
  5. 网络卡顿怎么办?快来试试华为云CDN
  6. MLX90615驱动笔记---IIC库函数(非IIC模拟)
  7. 【WINDOWS / DOS 批处理】tree命令详解
  8. Loaded Configuration File (none)
  9. 铝板规格及产品分类、用途知识一览
  10. 圆环百分比 echart数据图表实现圆环百分比