java数据结构
旧的程序:数据结构+算法
新的程序:数据结构+算法+框架+架构,天生构建大型项目核心
数据结构目标,开发者合理利用资源(内存)计算数据
java提供两种的数据结构:
1)基本类型:它本身不属于面对对象概念,占用内存少,运行速度快(C语言面向过程)
2)引用类型(java/python语言面向对象,面向对象和生活很相近,面向对象成为开发的主流方式),相对基本类型占用空间大,相对基本类型而言运行的速度慢。好处:拥有额外的方法(JAVA底层写好了),开发者事半功倍,开发效率高。
八种基本类型:
1)byte 一个字节=8bit,-128~127,默认值0 Byte
2)short 两个字节,取值:-32768~32767,默认值0 Short
3)int 四个字节,取值+-21亿,默认0 Integer
4)long 八个字节,默认值0 Long
5)float 四个字节,默认值0.0 Float
6)double 八个字节,默认值0.0 BigDecimal Double
7)char 2~4字节(ascii,unicode(utf-16,utf-8)) Character
8)boolean true1/false0 一个字节 Boolean
八个基本类型如果和对象一起使用,是不能直接使用的,需要类型转换。
包装类型:把基本类型进行封装(包装),变成对象,有额外方法。
基本类型名字全小写,包装类型名字按大驼峰规则,首字母大写
基本类型和包装类型他们只能表达一个类型的一个值 例:int a = 10; a = "20"//java是静态语言,在编译语法时检查
不够灵活,生活中有表达一组值的例:学生成绩100,99,66
数组:他可以存储一个类型的多个值,它的内存空间是连续的
数组的两种声明的方式:
1) int[] arr = new int[3]; //声明一个整型数组,数组3个元素,第一个元素下表0 arr[0],最后一个下标arr[arr.length-1]
2)int[] arr = {100,99,88}; 数组4个元素,arr[0]
String[] s = new String[3];数组三个元素 s[0]值为null
String[] s = {"语文","数学","英语"};数组三个元素,s[0]语文
数组的缺点,只能一个类型。复杂生活物品抽象就无法使用数组来表达,在java中最强大的,一等公民——对象
万物皆可对象(Object)。
Student学生对象
1)创建类Student
2)创建属性(属性、成员变量)
no 学号 Integer
name 姓名 String
sex 性别 Boolean
birthday 出生日期 java.util.Date 必须使用,java.sql.Date数据库(开发不使用)
school 毕业学校 String
salary 薪资 Integer/Float
package com.tedu.day4;
import java.util.Date;//日期类型必须导包,必须导util工具类下
//创建一个学生实体类
public class Student {
//成员变量,属性,字段
//4种:public、default不写、protected保护、private私有
public Integer no;//学号
public String name;//姓名
public Boolean sex;//性别
public Date birthday;//出生年月日
public String school;//毕业学校
public Double salary; //薪资
}
package com.tedu.day4;
import java.util.Date;
import org.junit.Test;
public class TsetStudent {
@Test
public void student() {
Student student = new Student();
student.no = 2050233;
student.name = "李四";
student.sex = true;
student.birthday = new Date();//创建一个当前时间
student.school = "达内";
student.salary = 50000D;//50000.0,+d、+D
System.out.println(student.no);
System.out.println(student.name);
System.out.println(student.sex);
System.out.println(student.birthday);
System.out.println(student.school);
System.out.println(student.salary);
}
}
流程控制
1、顺序结构:从左向右执行,从上向下执行,每条语句都执行,执行一次
2.、分支判断结构:部分代码执行,部分代码不执行
3、循环结构 :反复执行一段代码(执行多次)
分支结构
1)if单分支:if、if-else、多分支else-if
需求:天晴晒被子,
if(boolean表达式){晒被子}
package test;
import org.junit.Test;
//if分支判断语句
public class TestIf {
//if语法
@Test
public void testIf() {
//需求:天晴晒被子
boolean running = true;//是否下雨布尔变量,判断的依据(条件)
//取反代表天晴,他是一个条件,条件为true执行后面袋面,条件false为假则不执行
//if特殊,如果if语句语句代码题(代码段)如果里面只有一句话,大括号可以省略
if(!running) {//好习惯,不论代码段中是否只有一句话,都写上大括号
System.out.println("晒被子");
}
}
//if-else语法
@Test//单独运行这个测试方法,双击方法名,右键运行
public void testifElse() {
//天晴晒被子,下雨收衣服(分支互斥,不会同时发生)
boolean boo = true;
//如果判断条件true成立if后面的代码段执行
//如果判断条件false不成立则执行else后面的代码段执行
if(!boo) {
System.out.println("天晴晒被子");
}else {
System.out.println("下雨收衣服");
}
}
//else-if语法,多分支
@Test
public void testElseIf() {
//需求:电话号码,110警察,114查号,119火警,120医院根据不同的电话输出不同的语句
//分支天生是互斥,所以只要有一次判断成功其他分支就不再判断
int phone = 130;
if(phone==110) {
System.out.println("警察");
}else if(phone==114) {
System.out.println("查号");
}else if(phone==119) {
System.out.println("火警");
}else if(phone==120) {
System.out.println("医院");
}else{//上面所有的分支都不成立就执行else里面的代码
System.out.println("非法电话号码");
}
}
2)switch 多分支
和else if类似,语法结构不同的。
switch、case、default
package test;
import org.junit.Test;
//switch多分支判断语句
public class TestSwitch {
@Test
public void tsetSwitch() {
//需求:电话号码,110警察,114查号,119火警,120医院根据不同的电话输出不同的语句
int phone = 130;
//不良现象,switch语句特性
//如果有一个分支成立,这个分支后的所有分支就不再判断,判断失效,后面的所有自动输出
switch(phone) {
case 110://判断:phone的值是否和case的相等
System.out.println("警察");
break;//在每个分支后架次语句,跳出switch语句
case 114:
System.out.println("查号");
break;
case 119:
System.out.println("火警");
break;
case 120:
System.out.println("医院");
break;
default://eles作用
System.out.println("电话号码非法");
break;//可加可不加,因为他已经是最后一个
}
}
}
package test;
import java.util.Scanner;//导包,别错误
import org.junit.Test;
//需求:输入一个数字对应的去执行相应的内容
//1,查询余额
//2.取款
//3.存款
//4.退出
//特点:用户去输入,根据用户输入进行判断,执行相应的动作
public class ATM {
@Test
public void atm() {
//用户动态输入Scanner类,他可以支持获取键盘的输入内容
//他获取到内容,可以字符串,也可以他转换成整数
//监控键盘输入,需要给一个参数:键盘System.in
//程序运行到这句话就停止了:等待用户输入值,输入后回车就结束了
//这个现象叫做阻塞
Scanner scan = new Scanner(System.in);
System.out.println("请输入数字:");
int in = scan.nextInt();//获取键盘输入的数字
switch(in) {
case 1:
System.out.println("查询");
break;
case 2:
System.out.println("取款");
break;
case 3:
System.out.println("存款");
break;
case 4:
System.out.println("退出");
break;
default :
System.out.println("请输入正确命令");
}
}
}
一个类中有多个单元测试方法
1)执行所有的单元测试方法:在空白处鼠标右键执行,他会执行所有的方法
注意:测试方法没有顺序,单元测试方法是互相独立,互相之间没有关系,没有顺序要求!
2)只执行某一个单元测试方法:光标停留在某个方法里面(双击方法名)运行
循环结构
package test;
import java.util.Scanner;//导包,别错误
import org.junit.Test;
//需求:输入一个数字对应的去执行相应的内容
//1,查询余额
//2.取款
//3.存款
//4.退出
//特点:用户去输入,根据用户输入进行判断,执行相应的动作
public class ATM {
@Test
public void atm() {
//用户动态输入Scanner类,他可以支持获取键盘的输入内容
//他获取到内容,可以字符串,也可以他转换成整数
//监控键盘输入,需要给一个参数:键盘System.in
//程序运行到这句话就停止了:等待用户输入值,输入后回车就结束了
//这个现象叫做阻塞
Scanner scan = new Scanner(System.in);
while(true) {
System.out.println("请输入命令数字:");
int in = scan.nextInt();//获取键盘输入的数字
switch(in) {
case 1:
System.out.println("查询");
System.out.println();
break;
case 2:
System.out.println("取款");
System.out.println();
break;
case 3:
System.out.println("存款");
System.out.println();
break;
case 4:
System.out.println("退出");
System.out.println();
int in12 = 10;//基本类型,在方法结束自动释放空间
scan.close();//对复杂对象需要手动关闭
return;//方法的结束
default :
System.out.println("请输入正确命令");
System.out.println();
}
}
}
}
两种死循环:
while(true){
teturn;//结束程序
}
for(;;){
trturn;//结束程序
}
退出循环
1)break;跳出循环
2)continue;跳过循环
3)return;退出(退出方法)
package test;
import org.junit.Test;
//退出循环
public class TestExitLoop {
@Test
public void exitLoop() {
int i = 0;
while(i<6) {
i++;
if(i==3) {
//break; 跳出,i=3时直接结束循环,会接着执行循环后面的代码
//continue; 跳过 i=3时跳过本次循环(不执行后面的代码)如何进行下一次循环
return; //退出:结束方法 直接结束方法不会再执行循环外面的任何代码
}
System.out.println(i);
}
}
}
小结
1)执行流程
a.顺序执行:从上往下,从左到右(赋值语句,先执行右边,然后赋值给左边)所有代码都执行
b.分支判断:它是程序的灵魂。程序体现用户业务逻辑(618商品促销活动,赠卷VIP用户,不同折扣:)
c.循环执行:也是业务逻辑的体现,反复执行多次,直到退出的条件成立
2)分支执行
a)if语句(单分支)
if
if-else
else-if
b)switch(多分支)
switch - case
switch-case-default
两个特殊点:
a.正常每个case后都应该跟break;语句
b.switch(n) n的类型:char、byte、short、int 、char、String long不行(转换由大往小转,大转小可能造成精度丢失)
3)循环
a.while
b.do-while
c.for
while和do-while的差异:while条件不满足直接不执行,do-while条件不满足也会执行一次(先执行再判断)
java的代码要经过编译,你看到的源代码和编译后的代码不一致
for循环声明变量i,只在for循环内部有效,出了for循环这个简单类型变量就被释放了,不能再使用了。
4)死循环
a.while(true)
b.for(;;)/for(;true;);
5)退出循环
a. break 跳出
b. continue 跳过本次循环
c. return 结束方法