5、运算符:变量的意义就在于可以进行运算,运算需要用运算符来表示,分为以下几种
class test
{
public static void main(String[] args)
{
//赋值运算符 =(赋值) +=,-=,*=,/=
int a=1234,b; /*算数运算符 +(加) -(减) *(乘) /(除) %(取余) ++(自增) --(自减) +(字符串连接)
*1、除法运算结果自动转换为int型。
*2、取余结果的正负取决于被除数
*3、任何类型变量和 字符串 进行+操作,都是连接操作,结果为字符串类型
*4、++和--如果在变量前先运算再自增(减);在变量后则相反。这里的先后是在有其他运算时,否则效果相同
*/
a=a/-1000*1000;
a=a%333;
b=++a;
System.out.println("a="+a);
/*
*a+=1==>a=a+1,其他赋值运算类似;
*但是有一点需要注意:前者是赋值运算,后者是算术运算+赋值运算
*!!!赋值运算在赋值前会进行类型检测,如果类型内存较高,就会强制类型转换而且进行高位去除
*!!!而算数运算符在有变量进行计算时不能确定类型,就会使用默认类型
*!!!总结:两者区别在于前者自动强制转换
*/ /*
*比较运算符 ==(等于) !=(不等于) >(大于) <(小于) >=(大于等于) <=(小于等于) instanceof(是否是类的对象)
*运算都有结果,比较运算的结果是true或false,即boolean值。
*/
System.out.println(3>2); /*
*逻辑运算符:用于连接两个boolean类型的表达式
* &(与,一假则假) |(或,一真则真) !(非,取反) ^(异或,两边不同则真)
* &&(与,一假则假) ||(或,一真则真)
*!!!单双&|的区别在于
*1、后者有短路效果,即当满足判断条件(&时第一个为假,|时第一个为真)时,后面的表达式不进行计算
*2、&,|还可以用位运算,而&&,||更常用连接boolean表达式
*
*
*/
int c=3;
System.out.println(c>2&c<5);
/*
*!!!异或有一个特点:一个数异或另一个数两次,得到自身值
*有一个例子就是不用第三个变量交换两变量的值
*/
c=c^3^3;
System.out.println("c="+c);
int d=3,e=5;
System.out.println("开始时d="+d+",e="+e);
d=d^e;
e=d^e;
d=d^e;
System.out.println("交换后d="+d+",e="+e); /*
*位运算符:用于对数据按位byte进行运算,详见下图
*/
System.out.println(~6); /*
*三元运算符:(条件表达式)?表达式1:表达式2
*条件表达式结果为真,运算结果为表达式1;否则为表达式2。
*/ }
}
Java运算符
6、语句:所有语言都只包含三种结构的语句,顺序结构、选择结构、循环结构。这三种结构控制着程序的流程
class test
{
public static void main(String[] args)
{
//循环结构就是一条条语句从上到下排列,一条语句以;结束。 /*
*选择结构是将条件表达式的值进行判断,如果为真则执行指定语句,(否则执行另一部分语句)
*有if和switch两种:
*if用于 1、对具体值判断,2、对区间判断,3、对boolean类型表达式判断
*switch用于1、对具体值判断,2、值的个数确定(非区间)3、
*/
int a=3;
if(a>5){
System.out.println("a大于5");
}else if(a>3){
System.out.println("a小于5但大于3");
}else{
System.out.println("a小于3");
}
/*1、switch代码块中的顺序没有关系,但是执行时会先按顺序执行case语句,最后执行default语句
*2、break用于结束case语句和default语句,如果在}之前省略,后面还有代码,即使已经正确,
* 还是会向后执行直到break或者}
*/
switch(a){
default:
System.out.println("a非1,3,5");break;
case 3:
System.out.println("a等于3");
case 1:
System.out.println("a等于1");break;
case 5:
System.out.println("a等于5");break;
} /*
*循环结构:while,do...while,for
*需要控制:1、循环条件,2、循环体。
*格式见下图
*!!!for和while的区别在于:
*for中的初始化表达式中可以进行变量定义,而且这个变量只在循环内部有效
*while中则只能用外部定义的变量,所以循环之后不能销毁,如果只用一次会浪费内存
*/ //上面的语句可以嵌套使用 /*
*Java的代码是保存在代码块中的,即{}之中,最简单是下面这种单独的代码块
*还有就是上面依附在if,switch,while之后的代码块,依附在函数/类之后的代码块
*!!!代码块在遇到和开始的{对应的}时就会将生成的变量空间释放,即销毁变量
*所以代码块内可以访问外部代码块中的变量,但是外部不能访问内部变量。
*!!!并且注意代码块内部同样不能重复前面定义过的变量,但是可以在其后重新使用该变量标识。
*
*由于用后即销毁的特性,可以节省内存,如果当变量只用一次时可以节约空间,因为Jvm内存有限。
*/
{
int i=2;
System.out.println("i="+i);
}
int i=3;
System.out.println("i="+i); }
}
Java流程控制
public class test {
public static void main(String[] args){
int n=0,a=1,b=100;
while(a<b){
if(a%6==0){
n+=1;
}
a++;
}
System.out.println(n); for(int x=1;x<=9;x++){
for(int y=1;y<=x;y++){
//\t是转义字符 制表符,制表符的效果就是 对其显示
System.out.print(y+"*"+x+"="+(x*y)+"\t");
}
System.out.println();
} for(int x=1;x<=5;x++){
for(int y=5;y>=x;y--){
System.out.print(y);
}
System.out.println();
} //倒三角形,可以看做两个三角形的组合,一个由空格组成,就是效果中的-,另一个是*空格构成
for(int x=1;x<=5;x++){
for(int y=1;y<x;y++){
System.out.print('-');
}
for(int z=x;z<=5;z++){
System.out.print("* ");
}
System.out.println();
}
}
}
Java循环测试
7、函数:Java中的函数都是在类内,也就是类的方法。简介如下
public class Function {
//!!!注意Java中不允许嵌套函数。 //main函数没有返回值,用void标示,即空,这是特殊的返回值。可以用return;来结束函数块,也可以直接省略
public static void main(String[] args){
int a=3,b=4,c;
c=add(a,b);
System.out.println(c);
draw(2,2);
} /*!!!需要注意的几点
* 1、这里有一点需要注意:就是由static修饰的函数调用的函数必须也要用static修饰,稍后解释
* !!!2、函数的参数就相当于函数代码块的局部变量,初始化过程在调用时进行,当函数块结束局部变量消失
* !!!而且Java中不允许普通变量的引用传递(即&a的使用方式);只能传值赋值,即将值复制一份赋值
* !!!引用和传值的区别是:只要引用的关系存在,变量就不会消失
* 3、函数封装一定要明确要求,不要过度操作,像下面如果只要和的返回值,就不要输出。
*/
static int add(int a,int b){
return a+b;
} /*
* 同一个类中,变量标识符不能多次使用,但是函数标识符可以,只要满足下面条件即可
* 1、参数个数不同,2、参数类型不同
* !!!注意是判断参数而不是返回值
* 称为函数重载。Java会自动判断应该调用那个函数。
*/
static int add(int a,int b,int c){
return a+b+c;
} static void draw(int a,int b){
if(a<=1||b<=1){
System.out.println("不能构成矩形!");
return;
}
for(int x=1;x<=a;x++){
System.out.print("*");
}
System.out.println();
if(b>2){
for(int z=1;z<=b-2;z++){
System.out.print("*");
for(int y=1;y<=a-2;y++){
System.out.print(" ");
}
System.out.print("*");
System.out.println();
}
}
for(int x=1;x<=a;x++){
System.out.print("*");
}
} }
Java函数
8、数组:下图为简介。注意数组也是对象。
public class array {
public static void main(String[] args){
//main函数的参数就是字符串数组类型的,值是通过Java。exe运行时传入的
//System.out.println(args[0]); /*数组的 定义有三种格式:其中[]为数组标识
* 1、元素类型[] 数组名=new 元素类型[数组单元个数];
* 2、元素类型[] 数组名=new 元素类型[]{值1,,值2,。。。}; 注意不能再][]中标明数组个数
* 3、元素类型[] 数组名={值1,,值2,。。。};
*/
int[] arr={1,2,3}; /*定义数组的主要目的就是 存/取 值
* 存值可以使用上面的2,3两种方式,也可以在定义后,通过 角标 来保存值
* 取值只能通过 角标 来进行,取值的一个常用操作就是遍历,通过循环控制角标来实现,
* 数组的角标是从0开始的
*/
arr[2]=5;
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
数组
public class arrayFunction {
public static void main(String[] args){
/*数组常见操作:
* 1、获取最大/小值
* 2、数组排序
* 3、折半查找(二分查找)
*/
int[] arr={123,2345,31,353,1,35,8111};
int max=getMax(arr);
System.out.println(max);
//Arrays.sort(arr);
bubbleSort4(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
int [] arr1={123,234,345,456,567,678};
int a=getIndex2(arr1,45);
System.out.println(a);
} public static int getMax(int[] arr){
int max=arr[0];
for(int i=1;i<arr.length;i++){
max=max>arr[i]?max:arr[i];
}
return max;
} /*选择排序:就是选择所有数中最小(大)值和最左端值交换;循环执行直到最后一个数
* 和获取最大小值的不同点是需要知道该值的角标来进行交换操作
*/
public static void selectSort(int[] arr){
for(int i=0;i<arr.length;i++){
int min=arr[i],min_index=i;
for(int j=i+1;j<arr.length;j++){
if(min>arr[j]){
min=arr[j];
min_index=j;
}
}
if(min_index!=i){
swap(arr,min_index,i);
}
}
}
//冒泡排序:就是从左到右两两进行比较,大数放左,小数放右。最简单的是循环数组长度次,必然可以完全排序
public static void bubbleSort1(int[] arr){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-1;j++){
if(arr[j]<arr[j+1]){
swap(arr,arr[j],arr[j+1]);
}
}
}
}
//下面是冒泡排序的优化(for和while实现),即用一个标志来记录是否某次循环中进行了换位,如果没有表示完全排序,程序可以结束.
public static void bubbleSort2(int[] arr){
for(int i=0;i<arr.length;i++){
boolean flag=false;
for(int j=0;j<arr.length-1;j++){
if(arr[j]<arr[j+1]){
swap(arr,arr[j],arr[j+1]);
flag=true;
}
}
if(flag==false)
return;
}
}
public static void bubbleSort3(int[] arr){
boolean flag=true;
while(flag){
flag=false;
for(int j=0;j<arr.length-1;j++){
if(arr[j]<arr[j+1]){
swap(arr,arr[j],arr[j+1]);
flag=true;
}
}
}
}
//这是冒泡算法的进一步优化,用flag标记进行转换的最大角标,之后的数已经排好了可以不进行下一轮排序
public static void bubbleSort4(int[] arr){
int k,flag=arr.length;
do{
k=flag;
flag = 0;
for (int j = 0; j<k-1; j++)
if (arr[j] < arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag = j+1;
}
}while(flag>0);
}
//交换数组单元
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
} /*查找操作:
*
*/
public static int getIndex(int[] arr,int value){
for(int i=0;i<arr.length;i++){
if(arr[i]==value){
return i;
}
}
//这里返回-1是因为规定返回值类型为int,如果没有找到该单元,则上面没有返回值,而此处的数必须为负数,因为角标为>=0,常用-1
return -1;
}
//二分法查找:数组单元值必须按顺序排列
public static int getIndex2(int[] arr,int value){
int min_index=0,max_index=arr.length-1,mid_index=(min_index+max_index)/2;
if(value<arr[min_index]||value<arr[max_index]){
return -1;
}
while(arr[mid_index]!=value){
if(arr[mid_index]>value){
max_index=mid_index-1;
}else{
min_index=mid_index+1;
}
if(arr[min_index]<value&arr[max_index]>value){
return -1;
}
mid_index=(min_index+max_index)/2;
}
return mid_index;
}
}
Java数组常用操作
public class ArrayFunction
{
public static void main(String[] args){
int a=60;
toOctal(a);
}
public static void toHex(int num){
char[] arr=new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'},
arr1=new char[8];
int len=arr1.length,newnum=0,i=0;
/*注意下面程序中for和while循环的不同
for(int i=0;i<len;i++){
if(num!=0){
newnum=num&0xf;
arr1[i]=arr[newnum];
num>>>=4;
}
}
*/
while(num!=0){
newnum=num&15;
arr1[i++]=arr[newnum];
num>>>=4;
}
for(int j=len-1;j>=0;j--){
if(arr1[j]=='\u0000')
continue;
System.out.print(arr1[j]);
}
}
//这个函数是从上面总结出来的,因为只需要修改一小部分内容,所有进制转换都可以通过该函数实现,
public static void trans(int num,int base,int offset){
char[] arr=new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'},
arr1=new char[8];
int len=arr1.length,newnum=0,i=0;
while(num!=0){
newnum=num&base;
arr1[i++]=arr[newnum];
num>>>=offset;
}
for(int j=len-1;j>=0;j--){
if(arr1[j]=='\u0000')
continue;
System.out.print(arr1[j]);
}
}
public static void toHex2(int num){
trans(num, 15, 4);
}
public static void toBinary(int num){
trans(num, 1, 1);
}
public static void toOctal(int num){
trans(num, 7, 3);
} }
Java数组实例-进制转换
题外话:Java内存划分(简单版,详细后叙)
1、寄存器区
2、本地方法区
3、方法区
4、栈内存:保存局部变量,特点是一旦作用域结束,局部变量消失,所以栈区刷新很快,很少有垃圾
5、堆内存: