世界上的任何一种算法的代码实现都需要三种结构,就是顺序,分支和循环,Java语言作为高级语言,也没能突破这个逻辑,所以也提供了这三种结构的语法支持。顺序就是执行代码的先后顺序,分支就是选择性的执行代码,循环就是重复执行代码。此外数组也是一种非常符合程序猿逻辑的数据结构,Java也提供了支持。
分支
主要是if和switch这两种。
if主要有三种语法:if……,if……else……,if……else if……else……。
/**
* 这段代码是对swicth语句的语法进行熟悉的练习代码
* @author 郭聪聪
*
*/
public class SwicthDemo {
/*
* 程序的主方法,功能是输出指定季节的成语
*/
public static void main(String [] args){
//声明变量season
String season="夏天";
//执行swicth语句
switch (season){
case "春天":{
System.out.println("春暖花开");
break;
}
case"夏天":{
System.out.println("夏日炎炎");
break;
}
case"秋天":{
System.out.println("秋高气爽");
break;
}
case"冬天":{
System.out.println("冬雪皑皑");
break;
}
default:{
System.out.println("季节输入错误");
}
}
}
}
循环
Java提供了while,do……while……,for……,三种循环。
while循环:当循环条件成立的时候执行循环体和迭代语句。
do……while循环无论如何先执行一遍循环体,在进行条件语句的判断。
for 循环:循环条件为true,执行循环体,再执行循环迭代语句。
当把一个循环放到另一个循环里,就形成了一个嵌套循环,任何形式的循环都可以作为内层循环,也可以作为外层循环。
控制循环结构:使用break结束循环,使用continue忽略本次循环剩下的语句,此外return可以结束整个方法,当然也就结束了整个循环。
* break
/*
*联系使用break终止循环语句,所以这个类没有数据,只有一个没什么意义的方法
*/
public class BreakDemo{
public static void main(String [] args){
//一个简单的for循环
for(int i=0;i<10;i++){
System.out.println("i的值是:"+i);
if(i==3){
break;
}
}
}
}
break还可以直接结束外层循环
/*
本类是为了联系break出外层循环的用法,因此没有属性,主方法也没什么意义
*/
public class BreakDemo2{
public static void main(String [] args){
//一个外层循环,添加一个标签
outcircle:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println("i:"+i+" j:"+j);
if(j==2){
break outcircle;
}
}
}
}
}
数组
目前为止,8种基本的数据类型中没有数组,三种代码结构中也没有数组,所以数组是什么呢?数组可以说是一种数据结构,它的出现是为了方便的处理大量的相同类型的数据,从C语言开始,之后的所有的高级语言都支持这种结构,但是每种语言的数组特性有不太一样,在java中,所有的数组元素具有相同的类型,一旦一个数组初始化完成,它的内存空间也就确定了,所以从这个角度来讲,数组也是一个数据类型,实际上是一个引用类型,所有初始化的时候要用new关键字。Java数组可以储存任意类型的数据,包括引用类型。所以定义数组的方法和定义其他基本类型和引用类型一样,只要在数据类型的后边加上一个【】即可。
实际上数组有两种初始化方式,一种是静态初始化,一种是动态初始化。静态初始化的语法格式如下
type[] arrayName=new type[]{ , , ,);
但是数组的静态初始化也支持直接赋值type[] arrayName={,,,};
动态初始化只指定数组的长度,数组的初始值由系统指定。系统指定数组元素时,整数类型为0,浮点为0.0,boolean为false,字符型为“/u0000”,数组元素为null。
访问数组元素的时候使用【索引值】即可。所有的数组提供了一个lengh属性,可以通过arrayName.lengh来索引数组元素的长度。
自从Java 5之后,java提供了foreach循环来遍历数组元素和集合,语法如下
for(数组元素类型 形参名:数组名){}
foreach循环中的形参只能临时保存数组元素的值,不能改变数组元素的值,使用要谨慎。
堆内存与栈内存
其实数组的特性是一种引用数据类型,所以要想深入理解,就要谈一谈“堆内存”和“栈内存”。其实数组变量被存放在一个栈内存里,而实际的数组对象被存放在堆内存里,程序中通过p[x]的方式由数组变量找到实际的数组对象,也就是说数组的引用变量是访问推内存数组的根本方式。
当一个方法执行时,每个方法都会建立自己的栈内存,用来存放临时的变量,而方法执行结束以后,栈内存自动销毁,而程序中的对象被存放在堆内存中。
数组相互赋值的过程其实就是指向相互赋值的过程,b=a,这句话成立的前提是数组a和数组b的类型一致,这时,b就会舍弃原来的指向,转而指向a指向的堆内存空间。
所以定义数组,也就是int[]=iArr;这个过程只是开辟了栈内存,初始化数组的过程才是开辟堆内存并且明确指向的过程。
没有多维数组
多维数组实际上就是每一个数组元素也是一个引用,也就是每一个数组元素都是一个一维数组,但是因为Java是强类型语言,所以只能扩展到二维为止。也就是二维数组的元素是一维数组,三维数组的元素是二维数组。
/*
*本类是一个数组的应用举例,目的是把浮点数转换成人民币读法的字符串
*/
public class Num2Rmb{
public static void main(String [] args){
Num2Rmb nr=new Num2Rmb();
System.out.println(nr.tohanStr("6108"));
}
private String [] hanArr={"零","壹","贰","叁","四","伍","陆","柒","捌","玖"};
private String [] unitArr={"十","百","千"};
/*
divide方法:把一个浮点数分解成整数部分和小数部分的字符串
@parameter num
@return 分解出来的整数部分和小数部分的字符串
*/
private String [] divide(double num){
String[] result=new String[2];
//得到整数部分,强制转化为long型
long zheng=(long)num;
//浮点数减去整数部分得到小数部分,乘以100再取整得到两位小数
long xiao=Math.round((num-zheng)*100);
result[0]=String.valueOf(zheng);
result[1]=String.valueOf(xiao);
return result;
}
/*
tohanStr方法:把一个四位的数字字符串转化为汉字字符串
@para:numString
@return:hanString
*/
public String tohanStr(String numString){
String result=" ";
for (int i=0;i<numString.length();i++){
//把char类型的数据转化为int类型的数据,利用ASCII码差48
int num=numString.charAt(i)-48;
//如果num不是最后一位也不是零加单位
if(i!=numString.length()-1&&num!=0){
result+=hanArr[num]+unitArr[numString.length()-2-i];
}
//如果num是最后一位或者是零,不加单位
else{
result+=hanArr[num];
}
}
return result;
}
}