以Java从入门到精通为学习纲要,本次主要介绍基础知识也就是前6章的学习过程中自己有疑问的地方做一个汇总
1、每一个文件中只能有一个public类?是的,而且public类名必须和java文件名保持一致,因为这个public中的main方法作为该文件程序的入口,同时保证了其能够与外界交互的条件。
2、静态方法访问本类成员变量时候只能够访问静态成员变量和静态方法,实例方法则是无此限制,之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象(可以直接调用类的静态方法如)。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。参考资料如下:
3、强制类型的转换,高级别的转换为低级别的不加强制符号,编译会报错,例如
int a = 2;
long b = 3;
a = b;//编译不会通过,需要改为a = (int)b;
另外对于下面:
b = b +8;//首先运算的是b+8,因为8为int型,所以结果运算出来的是10,会自动类型提升为int型,而现在把一个int型的10,赋给一个byte类型的变量,这时候如果不强制类型转换,就会报错了,因此编译不能通过。
b+=8;//而b+=8,这和b+8不一样,“+=”在Java里是一种运算符,所以他不需要经过刚刚上面的类型转换,会自己内部运算出来一个byte类型的10,因此不会报错
二者性质是不一样的
4、switch语句中case后的常量表达式可以是整数,但是不能够是实数,因为实数会涉及到位数和存储的一些原因可能会出现不太准的情况。
5、while和switch语句都在大括号中时候,不需要加分号,但是do while语句则需要在最后加上分号.
6、字符串相关
float类型数据最大的是3.402...比较小要注意
在合并字符串的过程中,只要一个操作数是字符串,那么编译器就会把另一个操作数也转化为String应该谨慎操作
想连的字符串不要隔行写,还好eclipse会自动转换为如下:
System.out.println("hello"+
"world");//这是正确的
获取字符串长度的函数length()
String s1=""qsh";
int a=s1.length();//a=3
获取字符串索引的位置(得到的是字符数组的下标)如:
String s2="cangg";
int a=s2.indexOf("g");//a = 3,那么如果有多个同样的字符,返回值是首先发现的那个,如何查找后面的呢??
int b =s2.lastIndexOf("g");//b =4,同样是下标
一定要注意英文的转换,尽量全部用英文,要不然会出现很难发现的小错误
获得指定位置索引的字符
String s = “cang jing kong”;
char mychar=s.charAt(3);//mychar = 'g';
截取字符串的一个函数(进行了运算符重载):
String s1=“cangjingkong”;
String s2=s1.substring(3);//s2="gjingkong";
String s3=s1.substring(4,9)//s2 = "jingk";
去除首、尾空格函数trim()
String s1=" cang jing kong ";
String s2=s1.trim();//s2="cang jing kong"
字符串替换函数replace
String s1=“cangjingkong”;
String s2=s1.replace("g""G");//s2="canGjinGkonG",字符与字符串的区别是什么,单引号与双引号的区别又是什么?
判断字符串的开始与结束函数分别是startsWith()和endsWith()
String s1=“cangjingkong”;
boolean temp;
temp = s1.startsWith("c");//temp = true;
判断字符串是否相等,用函数s1.equals(String s2),为何不能够直接用==符号来表示,因为字符串代表的是一个地址每个字符串的地址肯定不一样,soga。
String s1=“cangjingkong”;
String s2="cangjingkong";
boolean temp;
temp = s1.epuals(s2);//temp = true
equals函数需要判断字符串中大小写,而equalsIgnoeCase()则是会忽略掉大小写
String s1="cangjingkong";
String s2="CANGJINGKONG"
boolean temp;
temp =s1.equalsIgnoeCase(s2);//temp = true
字母大小写的转换,其中数字和字符不受影响
大转小toLowerCase(),小转大toUpperCase()
String s1 = "LiXianFeng";
String s2=s1.toLowCase();
字符串分割函数split
String s1 = “Li,Xian,Feng”;
String[] temp=s1.split(",");//temp[0]="Li";
String temp2=s2.split(",",2);//temp[0]="LI;temp[1]="Xian,Feng";
格式化字符串相关的函数??
7、数组相关
使用new分配数组时候元素整型数组初始化元素都是0,数组的声明有两种方式例如:
int arry[];//等价于int[] arry;
初始化也有两种方法,一个是先声明再用new赋值,一个是在声明的时候赋值
int arry[];
arry = new int[5];//上述等于 int arry[]=new int[]{0,0,0,0,0};
System.out.println(arry[3]);//输出结果是0
另外Systtem.out.println函数会默认有一个换行符输出,System.out.print()不会有换行字符,后者不支持空操作,eclipse会有提示的
关于二维数组的地址的问题,java在极力避免这样的事情?还是基本类型存在内存专门的栈中?
数组的遍历
数组的length属性,如下所示:
int arry[][];
arry = new int[3][4];
System.out.println(arry.length);//结果是3
System.out.println(arry[1].length);//结果是4
填充数组元素的操作fill函数,其实好多操作数组的函数需要用到Arrays的静态方法,参考 Arrays详解
int arry[];
arry = new int[3];
Arrays.fill(arry,4);//把数组中的元素全都初始化为4,同时该操作重载了很多操作,只需要import java.util.Arrays;
排序也是Arrays的sort()函数,同时注意可以对数组进行排序,其中对String类型数据,排序按照字典的顺序,数字在前面,大写字母在小写字母前面。
复制数组的函数同样也是Arrays中的函数有copyOf其中要谨记数组声明后一定要初始化也就是分配内存才能够使用
int arry[];
arry = new int[]{1,3,22,11,22,33,44};
int str[] = Arrays.copyOfRange(arry, 3, 8);
数组查询函数binarySearch(Object a[],Object key);必须先对数组进行排序,要不然结果是不确定的,有多个相同元素的时候不能够保证找到的是哪一个
如:
int arry[];
arry = new int[]{1,3,22,11,22,33,44};
int a = Arrays.binarySearch(arry, 22);//a的值是4,明显第一个22的索引是2才对在本语句之前加上Arrays.sort(arry);后结果是3满足要求,因为这是二分搜索。。。
同时对没有找到元素的情况参考这个和书的112页,参考Arrays.binarySearch()详解
当数组中所有值都小于key值的时候返回值是负的数组长度(同时对于指定范围的binarysearch,要注意范围的大小)
数组排序
冒泡排序分为正排序,冒泡大的值,而反排序则是冒泡小的值正排序和反排序如下所示:
正排序:
/***********************
*
* 冒泡排序可以冒小的数据也可以冒大的数据
*
* **********************/
package BubleSort;
public class BubleSort {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int arry[] = new int[]{88,22,77,33,44,66};
int data;//用来存储交换数据的中间变量
System.out.print("原始数据是");
Printable(arry);//打印数组函数
int length = arry.length;
int flag = 1;//标志位,用来检测是不是还需要比较
int Num = 0;//总的比较次数
for(int j = 1;j<length &&flag ==1;j++){
flag = 0;
for(int temp=0; temp<length-j;temp++){
if(arry[temp]<arry[temp+1]){///改变一下数据交换的条件能够实现正序和倒序
flag = 1;
data = arry[temp];
arry[temp] = arry[temp+1];
arry[temp+1] = data;
Num++;
}
}
if(0 == flag)
break;//此处发现已经不需要比较了,已经是排好的数列了。
System.out.println("hello world");//用来测试
}
System.out.println("排序后的数组是");
Printable(arry);
System.out.println("总的比较次数是");
System.out.println(Num);
}
public static void Printable(int str[]){
for(int i =0;i<str.length;i++)
System.out.println(str[i]);
}
}
直接选择排序,要养成好习惯,不要直接在类的定义中操作要尽量在新的new的对象中操作。。。。
/**************************
*
*
* 选择排序,可以选择把选出来的最大(小)数据放在数组的结尾(开头,开头的话第二层循环的初始值以及条件就要改变)
* 注意一点二层循环第一层是循环的轮数 就是说我们需要多少轮选择排序,第二层是每一轮的比较(此时应该保证,能够比较或者说取到每一轮的所有数据) 下面实例是选择的选出最大数,存储到数组的结尾的方式
*
* ************************/
package SelectSort;
public class SelectSort {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int data[]={44,11,22,33,77,66};
System.out.println("原始数据是");
Printable(data);
int swap,index,i,j;//swap用来交换数据时候存储的中间变量,index是每一次循环的最大值的下标,i,j分别表示内层和外层循环
for(i=1;i <data.length;i++){
index = 0;
for(j =1;j<=data.length-i;j++)//本来index初始值就是1,所以已经能够保证从最开始的元素进行比较,可以令j=1
if (data[j]>data[index])
index = j;
if((j-1)!=index){
swap = data[index];
data[index] = data[j-1];
data[j-1] = swap;//因为本人错误把改行语句写错成data[index] = swap;一直调试不通要注意呀
}
}
System.out.println("排序以后的数据为");
Printable(data);
}
public static void Printable(int str[]){
for(int i =0;i<str.length;i++)
System.out.println(str[i]);
}
}
反转排序,比如数组{1,2,3,4,5},反转以后成为{5,4,3,2,1}
<span style="font-size: 16px;">/************************
*
* 反转排序就是首末数据交换,第2和倒数第2的数据交</span><span style="font-size:12px;">换</span><span style="font-size: 16px;">
*
* *********************/
package ReverseSort;
public class ReverseSort {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int data[] = {44,11,55,77,22,33,66};
int swap,i,length;
length = data.length-1;//最大索引
for(i=0;i<data.length/2;i++){
swap = data[i];
data[i] = data[length];
data[length] = swap;
length--;//i表示从前遍历,j表示从后遍历
}
Printable(data);
}
public static void Printable(int str[]){
for(int i =0;i<str.length;i++)
System.out.println(str[i]);
}
}</span><span style="font-size: 12px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"> </span>
8、第六章习题4,编写java程序,将二维数组中的行列互换显示出来,如:
1 2 3
4 5 6
7 8 9
输出为:
1 4 7
2 5 8
3 6 9
package Test2;
public class Test62 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int arr1[][] = {{1,2,3,11},{4,5,6,44},{7,8,9,77},{100,100,100,100}};
Printable(arr1);
int swap,m,n;
int len1 = arr1[0].length;
for (m=0; m<arr1.length; m++) {
for (n=m; n<len1; n++) {
swap = arr1[m][n];
arr1[m][n] = arr1[n][m];//同时要注意如果不是n*n矩阵的话,语句arr1[m][n] = arr1[n][m];中n、m范围会出错
arr1[n][m] = swap;
}
}//在这里一直提示错误,原来是i,j变量和下面的函数中的变量重复了,
Printable(arr1);
}
public static void Printable(int str[][]){
int len = str[0].length;
for(int i =0;i<str.length;i++){///要注意两层循环的终止条件千万不要弄反了。
for(int j=0;j<len;j++)
System.out.print(str[i][j]+" ");
System.out.print("\n");
}
}
}