202105小白训练营-day03 数据结构

Posted 长安紫薯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了202105小白训练营-day03 数据结构相关的知识,希望对你有一定的参考价值。

单元测试

岗位:开发、测试(保证写的代码的正确)
开发者自己做完业务代码,需要自测(自己测试自己写的代码)
1)打印调试信息到控制台:syso 坏处,它浪费我们代码执行时间。以前调试时检查是否正确,正确后,真正交付用户时,把这些代码屏蔽掉。删除、注释掉(在编译compile后注释语句会从目标文件删除)
2)单元测试 jUnit(每个类的每个功能要测试-方法)要写调试,它通过一个日志级别概念。相当于全局的开关,开时就输出日志信息打印控制台,关闭时就不会输出,不执行,不影响程序效率。

单元测试是每个开发者都必须要做的事情!每天每个类都要写单元测试。

引入junit单元测试支持

1)第三方(非java原生)导包 *.jar,工程要支持junit 4,我们开发代码才可以使用
2)创建单元测试方法,替代main方法。独立方法去运行
3)main、业务方法、单元测试方法,怎么区分它们?junit提供技术:注解@Test(戴帽子)
4)把我们要测试的代码写到@Test的方法内,不写在main中了
5)右键运行,会有新菜单 java junit。运行时会额外弹出一个框,里面有进度条。如果绿色代表执行成功,如果棕色代表出错了。(改代码,重新运行)

main和junit单元测试的方法有什么区别?

main是原生方法,java的规范。
main不是必须,如果这个类需要执行(运行)必须写main,入口函数。类可以有很多方法,但main方法只有一个。运行时java会自动找main方法。有就运行,没有就不运行。
单元测试方法不是原生,不是java提供的,第三方junit提供。单元测试的方法在一个类中可以有多个。
单元测试方法可以选择某个进行执行。单元测试的方法比main方法更加灵活。
本质差异,junit单元测试的方法能否替代掉main方法?
1)main方法最终可以类似QQ、游戏,单独运行程序。(目标可以运行程序)main可以充当,但是没有junit灵活。
2)junit单元测试只为测试而生,运行时跟测试就无关。(目标就是测试)

程序

1)旧程序定义:数据结构+算法*
2)新程序定义:数据结构+算法+框架(三大框架ssm)+架构(分布式、微服务、大数据)

数据结构

1)数据存储
数据要计算,要临时存储在内存中,执行代码时,先把数据放入内存,需要计算时,从内存中去获取数据,计算完,在把数据放回内存中。内存是个稀缺资源。使用内存时必须合理使用内存。给占用小的分配小的资源,给大就分配大的资源。

怎么把生活中事务对应去变成计算机对应资源,最终体现内存所占用的大小?
在java中分为两类:
1)基本类型变量,8种
2)更复杂结构:对象,引用类型

八种基本类型

分为3类:整数类型、小数类型、其它
整数类型4个:byte、short、int、long
小数类型2个:float、double
其它2个:char、boolean

特点:长度不同,表现不同的东西,基本类型都有默认值
计算机最小单位:bit比特,开发语言java最小单位:byte字节;1byte=8bit
操作系统32b、64b
1)byte 字节型,1个字节,0,-128~127
2)short 短整型,2个字节,0,-32768~32767
3)int 整型,4个字节,0,默认,±21亿
4)long 长整型,8个字节,0
5)float 单精度浮点型,4个字节,0.0
6)double 双精度浮点型,8个字节,0.0,默认
7)char 字符型,2个字节 ISO-8859-1 ASCII(2~4个)unicode 3个字节,4个字节。空字符NUL
8)boolean 布尔型,1个字节,false

为什么java要有8个基本类型

java基本类型获取和访问的速度快;包装类型对象,它有额外很多方法,这些内容都要占内存,访问速度慢。基本类型占用内存空间小,执行速度快。包装类型(对象)占用内存空间大些,但是开发方便,无需自己去写这些额外方法。

java面对对象语言,使用额外方法,把基本类型封装包装类型。它就可以享受这些额外方法。

两个数字:100,200用什么类型存储?

package cn.tedu.datatype;

//导包
import org.junit.Test;

//表达一个值要尽量使用刚刚好的存储类型,合理分配资源
//太小存不下,太大浪费空间
public class TestSpace {
	@Test
	public void number() {
		//存储100使用哪个基本类型更合适?
		byte b = 100;
		short s = 100;	//错误的,浪费空间了
		//可以使用byte存储,也可以使用short来存储,但显然
		System.out.println(b);
		
		//存储200使用哪个基本类型更合适
		//Type mismatch: cannot convert from int to byte
		//类型不匹配,默认输入一个整数,java当做int类型
		byte b1 = (byte)200;	//强制类型转换,强制java编译器200是字节类型
		short s1 = 200;
		System.out.println(b1);	//字节表达:-128~127(256=2^8)
		System.out.println(s1); //短整型:-32768~32767(64k,6w)
	}
}

默认值

package cn.tedu.datatype;

import org.junit.Test;

//打印8个基本类型的默认值
public class TestDefaultValue {
	//类级别变量,写在类名下面的,也称为成员变量,也叫字段field,属性property
	byte b;
	short s;
	int i;
	long x;	//l有些字体不易和其他字母区分,所以开发中不要使用l
	
	float f;
	double d;
	
	char c;
	boolean bn;
	String s;	//默认值null
	
	@Test
	public void defaultValue() {
		//新的概念,局部变量-方法(必须初始化),成员变量
		//int a;
		//The local variable a may not have been initialized
		//局部变量必须初始化
		//System.out.println(a);
		
		//快捷键:ctrl+alt+下箭头(复制光标所在行)
		System.out.println("byte:" + b);
		System.out.println("short:" + s);
		System.out.println("int:" + i);
		System.out.println("long:" + x);
		
		System.out.println();  //空行
		
		System.out.println("float:" + f);
		System.out.println("double:" + d);
		
		System.out.println();
		
		System.out.println("char:" + c);
		System.out.println("boolean:" + bn);
	}
}

字符特殊性

把人类文字通过计算机去表达,计算机0和1,二进制。a,b
解决方案ASCII编码,它把人类09,az设置一个数字顺序,编号。
a字母97整数(十进制转换二进制)二进制值:0110 0001
我们在键盘上敲击一个a字母,把a字母去查ASCII编码表中查询a字母的对应编号97,
把97整数转换二进制 0110 0001,最后计算机能识别。计算机又把二进制转换十进制97,把97又转换a字母,然后在屏幕上展现。
这个过程意义,为什么要做2次转换呢?人类和计算机通讯。

字符默认值:ASCII码表它第一个值0:NUL,总共128个,A 65,a 97
字符类型它有一个特殊性:它可以有两个身份:
char c1 = ‘a’;
char c2 = 97;

ASCII码表

在这里插入图片描述

为什么需要包装类型?

基本类型实现不了的。
基本类型为了性能快,它不提供去获取这个值的取值范围。
java把基本类型“包装”,java给每个基本类型都有一个对应包装类型,包装后就是对象,
它就提供额外方法,例如提供获取这个类型的最大值max和最小值min(取值范围)。

包装类型(8个)

在java中基本类型全小写,包装类型首字母大写
1)byte Byte
2)short Short
3)int Integer*
4)long Long
5)float Float
6)double Double
7)char Character*
8)boolean Boolean

取值范围

package cn.tedu.datatype;

import org.junit.Test;

//八个包装类型对应取值范围
public class TestScope {
	@Test
	public void scope() {
		System.out.println("Byte 取值范围:" 
				+ Byte.MIN_VALUE+"~"+Byte.MAX_VALUE);
		System.out.println("Short 取值范围:" 
				+ Short.MIN_VALUE+"~"+Short.MAX_VALUE);
		System.out.println("Integer 取值范围:" 
				+ Integer.MIN_VALUE+"~"+Integer.MAX_VALUE);
		System.out.println("Long 取值范围:" 
				+ Long.MIN_VALUE+"~"+Long.MAX_VALUE);		
		
		System.out.println();
		
		System.out.println("Float 取值范围:" 
				+ Float.MIN_VALUE+"~"+Float.MAX_VALUE);	
		System.out.println("Double 取值范围:" 
				+ Double.MIN_VALUE+"~"+Double.MAX_VALUE);	
		
		System.out.println();
		//字符有没有最大值和最小值?ASCII的0对应NUL和127对应DEL键(不可见字符)
		System.out.println("Character 取值范围:" 
				+ Character.MIN_VALUE+"~"+Character.MAX_VALUE);	
		
		System.out.println("Boolean 取值范围没有,就true和false");
	}
}

基本类型或者包装类型缺点

单一,只能表达一个值
学生成绩:100,99,60
int yw = 100;
int sx = 99;
int en = 60;
需求:共性它要表现一组值,多少个不定,怎么表达?
数据结构:数组 array

数组

package cn.tedu.datatype;

import java.util.Arrays;

import org.junit.Test;

//数组array,非基本类型都是引用类型,本身对象
public class TestArray {
	@Test
	public void scope() {
		//数组定义有两种方式
		//第一种方式,标准方式,使用new来创建对象实例
		int[] arr = new int[4];	//声明:创建int数组,数组有3个元素
		
		//给数组元素进行初始化,赋值。怎么访问数组某个元素?
		//通过下标(索引,序号)来访问数组,从0开始
		arr[0] = 100;
		arr[1] = 99;
		arr[2] = 60;
		arr[3] = 88;
		
		//访问数组元素
		System.out.println("数组的长度:" + arr.length );
		
		System.out.println("第一元素:" + arr[0] );
		System.out.println("最后一个元素:" + arr[3-1] );  //arr[2]进过编译,编译优化
		System.out.println("最后一个元素:" + arr[ arr.length-1 ]);  //推荐,代码要尽量写活
		
		//数组的第二种写法,简写,把创建和初始化合并一句代码,推荐
		String[] s = {"语文", "数学", "英语", "化学"};
		System.out.println("数组的长度:" + s.length );
		System.out.println("第一个元素:" + s[0] );
		System.out.println("最后一个元素:" + s[ s.length-1 ]);
		
		//数组打印所有内容(工具类Arrays.toString())
		System.out.println( s ); 	//不会打印数组的值,会打印数组对象在内存中地址
		System.out.println( Arrays.toString( s ));
		
		//数组排序(升序)(工具类Arrrays.sort(arr))
		System.out.println( "排序前:"+Arrays.toString(arr) );
		Arrays.sort( arr );	//特点,先排序,覆盖原有数组(原有值被改变),升序
		System.out.println( "排序后:"+Arrays.toString(arr) );
	}
}



数组的缺点

数组可以表现一组值,但是它的每个的元素类型都一致,不能存储不同的数据类型。
需求:表现一组成绩
语文100,数学99,英语60,化学88
既有字符串类型,又有整数类型

java中就提供最强大功能,在java万物皆对象Object。
java一个面对对象的语言。

单个对象

需求:人 person
对象的属性习惯使用包装类型
对象的属性(字段、成员变量)
1)身份证号码 cardNo(18),String
2)姓名 name,String
3)年龄 age,Integer
4)性别 sex,Boolean,true男,false女
4)地址 address,String

创建对象步骤:
1)创建类Person
2)创建成员变量(属性、字段)public String cardNo; 一般不设置初始化
3)创建对象实例 Person p = new Person();
4)给属性进行初始化 p.cardNo = “610113”; (对象是通过实例名.属性名)
5)打印对象的某个属性值 syso(p.cardNo)

package cn.tedu.datatype;

//实体:1、创建人这个类(类首字母大写)
public class Person { // 大驼峰规则
	// 2、成员变量(属性)习惯包装类型
	public String cardNo; // 身份证号,小驼峰规则
	public String name; // 姓名
	public Integer age; // 年龄
	public Boolean sex; // 性别
	public String address; // 地址
}

package cn.tedu.datatype;

import org.junit.Test;

//单元测试类
public class TestPerson {
	@Test
	public void person() {
		//调用Person类
		//3、创建对象实例,实例名p
		Person p = new Person();
		//访问属性值,引用类型默认值null 
		System.out.println( p.cardNo );
		
		//4、属性初始化
		p.cardNo = "610113";
		p.name = "詹姆士邦德";
		p.age = 50;
		p.sex = true;	//男
		p.address = "伦敦军情六处";
		
		//5、打印每个属性
		System.out.println(p.cardNo);
		System.out.println(p.name);
		System.out.println(p.age);
		System.out.println(p.sex);
		System.out.println(p.address);
	}
}

以上是关于202105小白训练营-day03 数据结构的主要内容,如果未能解决你的问题,请参考以下文章

202105小白训练营-day05 异常+String

202105小白训练营-day01 开发环境配置

202105班小白训练营 小白学java

202105小白训练营-day02 java基础

202106小白训练营day03-java数据结构

java小白训练营day03-数据结构:jUnit+基本类型+包装类型+数组+对象