黑马程序员java培训就业班笔记day05总结.docx
《黑马程序员java培训就业班笔记day05总结.docx》由会员分享,可在线阅读,更多相关《黑马程序员java培训就业班笔记day05总结.docx(12页珍藏版)》请在冰豆网上搜索。
黑马程序员java培训就业班笔记day05总结
Day05
上午:
1、数组静态初始化
各种定义格式:
Int[]arr=newint[]//原则格式,可以明确数组数据类型,和数组名,但是不懂得数组长度
Intarr[]=newint[]
Int[]arr=newint[]{2,1,3,4,5,}//通过大括号可以标示出数组中内容,此处最佳别写长度,由于容易出错,由于即初始化实体,又初始化实体中元素。
Int[]arr={2,1,3,4,5};//可以明确数组数据类型,和数组名,也可以懂得数组中内容。
2、arr.length:
以便获取数组中元素个数方式。
3、操作数组最基本思想以及核心思想:
a)最基本思想:
就是遍历。
什么是遍历。
Eg:
int[]arr=newint[3];
int[]arr={4,8,9,2,6,9};//明确了数组类型和长度,并明确了数组中元素内容。
//int[]arr1=newint[]{4,8,9};
//以便获取数组中元素个数方式,可以使用数组实体一种属性。
length
System.out.println("len:
"+arr.length);
for(intx=0;x{
if(x%2==1)
System.out.println("arr["+x+"]="+arr[x]);//arr[0]=4;
}
这就是遍历思想,获取数组中元素,普通会用到遍历。
b)核心思想:
就是操作数组中元素角标,角标即索引,由于存数据最后目就是取出数据使用,就是操作角标,操作动作:
1、给数组角标上元素赋值,2、获取角标上元素值,存储都得用角标
4、数组中常用操作:
a)获取最值:
思路:
1、一方面咱们要定义一种功能完毕获取数组中最大值动作;
2、定义个函数来实现这一功能;明确成果,整数数组中最大值,int,明确与否有未知内容参加运算,参数列表中有一种参数,数组类型int[],一定要注意这里是数组类型,不是int型;
3、如何实现功能细节呢?
1、对数组中元素进行比较,将比较后比较大值进行记录,并参加下一次比较,当数组中元素都比较完毕后,最大值就已经被记录下来了。
2、每次比较较大值不拟定,定义一种变量进行记录,该变量如何初始化呢?
只要初始化为数组中人一种元素即可。
3、应当让数组中元素自动和该变量记录元素进行比较,因此可以使用遍历,获取数组中每一种元素。
4、当遍历到元素比较变量中记录元素大,用该变量记录住更大元素。
5、遍历结束后,变量存储就是数组中最大值。
实当代码:
eg:
PublicstaticintgetMax(intarr)
{
/.定变量记录较大值;
Intmax=arr[0];//初始化数组中任意个元素;
//对数组进行遍历比较
For(intx=1;x{
If(arr[x]>max)
Max=arr[x];
}
Returnmax;
}
同样有此外一种方式获取最大值
PublicstaticintgetMax(int[]arr)
{
IntmaxIndex=0;//初始化为数组中一种元素角标
For(intx=1;x{
If(arr[x]>arr[maxIndex])
maxIndex=x;
}
Returnarr[maxIndex];
}
b)排序:
1、选取排序:
一方面通过数组中元素比较方式来分析:
用数组中第一种角标元素与数组中第二个角标元素进行比较,发现9比6大,进行位置置换,此处应当定义一种三方变量,用来记录住置换过程元素值,然后再用第一种角标元素与下一种角标元素进行比较,按照全面原则进行置换位置,如果前者不大于后者,则不置换位置,一次比较,当第一轮结束之后第一种角标出能取该数组中最小元素值,然后再用第一种角标元素开始和下一种角标元素进行比较,同理,当第二轮结束后,第二个角标处获取了该数组中第二小值。
因此咱们发现当依次这样比较下去,就可以对数组中元素进行排序,当比较到arr.length-1元素时,发现只剩余这一种元素,没有其她元素和它进行比较了。
思路:
1、一方面定义一种功能函数对数组进行排序,
2、明确成果,没有返回值,由于它只是对数组进行排序一种动作,明确与否有未知内容参加运算,有,数组类型int[]arr
实当代码:
PublicstaticvoidselectSort(int[]arr)
{
For(intx=0;x{
For(inty=x+1;y{
if(arr[x]>arr[y])
{
Inttemp=arr[x];
Arr[x]=arr[y];
Arr[y]=temp;
}
}
}
}
优化后选取排序:
从上面排序图中咱们可以懂得,对数组中元素进行置换位置次数过多,也就是对堆内存操作频繁,减少了性能,下面咱们可以通过这种方式对性能优化。
思路:
在栈内存中咱们定义两个变量,分别用来记录较小元素值和较小元素角标,然后对其进行初始化,至于初始化值只要是数组中任意元素即可,然后拿数组中元素与它进行比较,如果发现拿去比较元素比变量中记录数值要小,那么就进行位置置换,并记录下较小元素角标,依次把数组中元素遍历完,就可以获取数组中最小元素值和角标,然后咱们拿初始化值和获取最小元素进行位置置换,这样以来当咱们获取了数组中元素最小时候,堆内存中只用操作一次位置即可,这样就提高性能。
实当代码:
PublicstaticvoidselectSort_2(int[]arr)
{
For(intx=0;x{
Intnum=arr[x];
Intindex=x;
For(inty=x+1;y{
If(num>arr[y])
Num=arr[y];
Index=y;
}
If(index!
=x)
{
inttemp=arr[x];
arr[x]=arr[index];
arr[index]=temp;
}
}
}
注意:
复习时候添加注释
2、冒泡排序:
一方面通过排序方式来分析其环节:
通过排序方式,可以懂得是用数组中元素挨个比较,如果前面元素值比它下一种角标元素大,则进行位置置换,然后再用第二个角标元素与下一种角标元素进行比较,同样如果下一种角标元素比它小,则进行位置置换,这样当比较到arr.length-1个元素时已经没有和它进行比较元素了,当第一轮比较结束后,咱们可以懂得最后一种角标元素为该数组中最大值,按照同样原理进行下一次比较,依次获取了比较大元素值。
实当代码:
PublicstaticvoidbubbleSort(int[]arr)
{
For(intx=0;x{
For(inty=0;y{
If(arr[y]>arr[y+1])
{
//位置置换
}
}
}
}
c)折半查找:
一方面分析数组元素查找方式:
一方面要明确数组时有序。
一方面定义三个变量min、mid、max分来用来记录最小角标、中间角标、最大角标,中间角标获取为(min+max)/2;获取中间角标之后,就可以获取中间角标相应元素arr[mid];用咱们所需要查找key与中间角标运算进行比较,如果key>arr[mid];那么此时min位置就是mid下一种角标,min=mid+1;然后再次获取中间角标元素,mid=(min+max)/2,同步也获取了中间角标相应数组元素,arr[mid],然后同理,拿key与中间角标元素进行比较.同样原则,依次比较,直到key==arr[mid]时候获取key.如果当浮现了min>max或者时候则阐明咱们要查找key在该数组中布存在,return-1;
实当代码:
PublicstaticvoidbinarySearch(int[]arrintkey)
{
Intmin,mid,max;
Min=0;
Max=arr.length-1;
Mid=(min+max)>>1//相称于/2,右移效率比它要高
While(arr[mid]!
=key)
{
If(key>arr[mid])
Min=mid+1;
Elseif(keyMin=mid-1;
If(maxReturn-1;
Mid=(max+min)>>1;
}
Returnmid;
}
注意:
复习添加代码注释
总结:
折半查找也称二分查找,这种查找可以提高效率,但是被查找数组额元素必要是有序。
不能对无序数组进行排序后再用折半查找,由于这时候数组中元素角标已经发生变化了。
5、查表法思想:
a)什么时候使用查表法?
当元素诸多,并且这些元素与数组有相应关系,并且这些数字均有角标规律时候。
扩展:
什么时候使用数组?
当同一类型元素较多时,就使用数组这个容器对数据进行存储。
b)查表法思想代码体现:
0123456789101112131415
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
咱们发现十六进制中一共有16个元素,并且每通过&15获取数字都再15之内,均有相应十六进制元素,并且元素相应数字正好有规律,并且符合了数组这种容器特点角标,那么可以将十六进制元素都存储到数组中,将每次&15成果作为角标去查这个数组,就可以获取到十六进制相应元素。
这就是查表思想。
代码体现:
PublicstaticvoidsearchList(intnum)
{//定义一种十六进制元素表
Char[]arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//定义一种char类型元素数组,用于存储每次获取到十六进制值。
Char[]chs=newchar[8];
Intpos=chs.length;
While(num!
=0)
{
Inttemp=num&15;
Chs[--pos]=arr[temp];
Num=num>>>4;
}
For(intx=pos;x{
//打印数组;
}
}
注意:
复习时添加代码注释;
通过上面咱们可以懂得那么与否可以定义这样一种功能函数呢?
用来对十进制、二进制、八进制、十六进制进行转换?
思路:
1、明确成果,没有返回值,只是对给定数据转换功能。
2、明确与否有未知内容参加运算,有,是什么?
求数值num,十六进制是&15,八进制是&7,二进制是&1,那么&这个是不拟定,咱们定义为变量base,当这个数值通过&上这些数据后,要取出背面数值,咱们通过右移来实现,但是各个进制不同样右移位置数也是不同样,十六进制是无条件右移四位,八进制是无条件右移三位,二进制是无条件右移1位,因此这个数也是不拟定,定义变量offset
实当代码:
//十进制--二进制
publicstaticvoidtoBin(intnum)
{
trans(num,1,1);
}
//十进制--八进制
publicstaticvoidtoOctal(intnum)
{
trans(num,7,3);
}
//十进制--十六进制
publicstaticvoidtoHex(intnum)
{
trans(num,15,4);
}
Publicstaticvoidtrans(intnum,intbase,intoffset)
{
If(num==0)
{
Sop(0);;
Return;
}
//定义一种十六进制元素表
Char[]arr={0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
Char[]chs=newchar[32];
Intpos=chs.length;
While(num!
=0)
{
Inttemp=num&base;
Chs[--pos]=arr[temp];
Num=num>>>offset;
}
For(ingtx=pos;x{
System.outr.println(chs[x]);
}
}
注意:
复习添加代码注释。
这一章节自己还不是很熟悉,能理解,但是不能独立写出代码,在后来几天内要每天都要一遍,并自己独立写出代码,做到思想理解透彻。
先要产生一天宏观思想。
复习办法:
一方面总结当天学习办法。
遇到不会先放到一边。
每天晚上睡着觉之前要回忆一遍。