一、java对内存的划分:
1. 寄存器:
主要是*处理器内的组成部分,是一个容量很小的且高速的存贮部件,用来暂存指令、数据和地址。
2. 本地方法区:
3. 方法区:
对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区,方法区中存储有一下信息:
(1).类的全限定名;
(2).类的超类的全限定名;
(3).这个类是类类型还是接口类型;
(4).类的访问修饰符;
(5).超接口的权限定名的有序类表;
(6).该类的常量池,该类所有常量的一个有序集合,包括直接类型和其他类的字段和方法的符号引用;
(7).字段信息,字段名,字段类型,字段的修饰符;
(8).方法信息,方法名,返回值类型,方法的修饰符,如果一个方法不是抽象的和本地的还将保存方法的字节码,操作数栈和方法的栈帧中的局部变量的大小,异常表;
(9).除了常量意外的所有类变量,类变量是所有类实例共享的,但是没有类实例也可以访问,只与类有关,编译时常量;
(10).一个到classLoader(类的加载器)的应用;
(11).一个到class的引用;
(12).方法表(为了尽可能的土改访问效率,大部分虚拟机对每个装载的非抽象类,都申城了方发表,把他们当做类型信息放在方法区了),方法区同样是可以被回收的。
4. 桟内存:
存储的都是局部变量
而且变量所属的作用域一旦结束,该变量就会自动的释放。
5. 堆内存:
存储的是数组和对象(其实数组就是对象)凡是new建立在堆中。
特点:
(1). 每一个实体都有首地址值。
(2). 堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean类型的是使false char默认是 '\u0000'
(3). 垃圾回收机制。
1. 寄存器:
主要是*处理器内的组成部分,是一个容量很小的且高速的存贮部件,用来暂存指令、数据和地址。
2. 本地方法区:
3. 方法区:
对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区,方法区中存储有一下信息:
(1).类的全限定名;
(2).类的超类的全限定名;
(3).这个类是类类型还是接口类型;
(4).类的访问修饰符;
(5).超接口的权限定名的有序类表;
(6).该类的常量池,该类所有常量的一个有序集合,包括直接类型和其他类的字段和方法的符号引用;
(7).字段信息,字段名,字段类型,字段的修饰符;
(8).方法信息,方法名,返回值类型,方法的修饰符,如果一个方法不是抽象的和本地的还将保存方法的字节码,操作数栈和方法的栈帧中的局部变量的大小,异常表;
(9).除了常量意外的所有类变量,类变量是所有类实例共享的,但是没有类实例也可以访问,只与类有关,编译时常量;
(10).一个到classLoader(类的加载器)的应用;
(11).一个到class的引用;
(12).方法表(为了尽可能的土改访问效率,大部分虚拟机对每个装载的非抽象类,都申城了方发表,把他们当做类型信息放在方法区了),方法区同样是可以被回收的。
4. 桟内存:
存储的都是局部变量
而且变量所属的作用域一旦结束,该变量就会自动的释放。
5. 堆内存:
存储的是数组和对象(其实数组就是对象)凡是new建立在堆中。
特点:
(1). 每一个实体都有首地址值。
(2). 堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean类型的是使false char默认是 '\u0000'
(3). 垃圾回收机制。
二、java中的运算符:
1. 比较运算:比较运算符运算的结果必须是boolean型,必须是true或者false.
System.out.println(3>2);
2. 逻辑运算符,运算完成的结果是boolean型
&:与
|:或
&运算的特点:
true & true = true
true & false= false
false& true = false
false&false = false
&运算规律:两边都是true的时候结果才是true,两边之中要是有一个是false那么结果必须是false
int x = 3;
System.out.println(x>2 & x<5);
|运算符的特点:
true | true = true
true |false = true
false| true = true
false|false = false
|运算规律:两边之中要是有一个是true,则运算之后的结果是true,要是两个同时为true(false),运算结果是true(false)。
int x = 3;
System.out.println(x>2 | x<5);
^:运算的特点:
true ^ true = false
true ^false = true
false^ true = true
false^false = false
^运算的规律:两边要是相同的话,结果是false,两边不相同的时候就是true。
int x = 8;
System.out.println(x<1 ^ x>78); false
System.out.println(x<1 ^ x<78); true
3. &和&&的区别和联系:
(1). 这两者的左右两边都是boolean类型。
(2). &的左边为false时,还要对右边进行判断。而&&的左边为false时,右边的不用进行判断。
(3). &用于位运算。
4. |和||的区别和联系:
(1). |和||的左右两边都要使用boolean类型。
(2). |的左边为true时,还要对右边进行判断。而||的左边为true时,右边的表达式将不再进行运算。
(3). |用于位运算。
!:取事物的反面。
三、java数组中的常用方法:
1. 数组中最大值的获取:
方式一:记住数组中的一个元素的值,然后在此值的基础上和其他的元素进行比较得出数组中的最大值
public static int getMax(int[] arr){ int max = arr[0]; for(int x=1; x<arr.length; x++){ if(arr[x]>max) max = arr[x]; } return max; }方式二:也是使用数组中的一个元素,这次是记录住这个元素的角标值的索引
public static int getMax2(int[] arr) { int maxIndex = 0; for(int x=1; x<arr.length; x++){ if(arr[x]>arr[maxIndex]) maxIndex = x; } return arr[maxIndex]; }
2.
数组的一些排序方法:
选择排序:选择排序的思想是使用第一个元素和其他后边的元素进行比较,如果比较的结果是前边的元素大于后边的元素
则进行交换,以此比较交换到最后一个元素,这样的结果就得到了第一个元素是最小的元素了。然后在进行第二个元素的
同样方法比较,直到最后的一个元素为止。
int[] arr = new int[]{23, 45, 165, 98, 20,12, 78}; //也可以使用后边的方式进行定义: int[] arr = {23, 45, 165, 98, 20,12, 78};
int arr[] = {23, 45, 165, 98, 20,12, 78}; 这种方式和C中的数组定义方式是相同的。
常用方法一:选择排序
public static void selectSort(int[] arr){
for(int x=0; x<arr.length-1; x++){
for(int y=x+1; y<arr.length; y++){
if(arr[x]>arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
优化以上选择排序方法:(超级选择排序法,效率比上边的那个要高)
public static void selectSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
int value = arr[x];
int index = x;
for(int y=x+1; y<arr.length; y++)
{
if(value>arr[y])
{
value = arr[y];
index = y;
}
}
if(index!=x)
{
int temp = arr[x];
arr[x] = arr[index];
arr[index] = temp;
}
}
}
常用方法二:冒泡排序
思想:交换相邻两个元素,逐次的排出数组的最大值,次大值......最后是最小值。
算法的基本过程:第一趟,比较相邻的两个元素,如果前边的大于后边的元素的话,进行交换,总共比较的次数是总元素的次数减一;
第二趟,和第一趟中的方法相同,比较相邻两个元素的大小,若符合条件,然后进行调换位置,总共比较的次数比上次次数减少一次;
.....
public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++)
{
if(arr[y] > arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
数组中元素的查找方法:
普通的查找方法,效率比较低,查找的数组不需要是有序的。使用的范围较广。
思想:遍历数组,在便利数组的过程中查找相同的元素。
public static int search(int[] arr, int key){
for(int x=0; x<arr.length; x++){
if(arr[x] == key)
return x;
}
return -1;
}
二分法查找(折半查找法)
注意:二分法查找元素的时候数组一定要是有序元素,否则查找失败!
public static int halfSearch(int[] arr, int key){
int max,min,mid;
max = arr.length-1;
min = 0;
mid = (min+max)/2;
while(arr[mid]!=key){
if(key>arr[mid])
min = mid+1;
else if(key<arr[mid])
max = mid-1;
if(max<min)
return -1;
mid = (max+min)/2;
}
return mid;
}
折半查找方式二:
public static int halfSearch2(int[] arr, int key)
{
int max,min,mid;
max = arr.length-1;
min = 0;
while(max>min)
{
mid = (max+min)>>2; //使用位运算效率很高。
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
进制转换的相关的知识以及所要知道的一些知识重点:以下讲解是以十六进制为例,当我们将一个整数转换成十六进制的首先要对整数进行处理,
十六进制就是使用四个二进制位表示一个十六进制数,比如60的二进制表现形式如下:
00000000 00000000 00000000 00111100 -->60
& 00000000 00000000 00000000 00001111 -->15 下一步
----------------------------------------------------- ======> 将60右移4位(使用无符号>>>比较好)
00000000 00000000 00000000 00001100 -->12
00000000 00000000 00000000 00000011 -->3
& 00000000 00000000 00000000 00001111 -->15
----------------------------------------------------- ======> 对结果进行查表得出大于数字9以后的字母表现形式。
00000000 00000000 00000000 00000011 -->3
经过以上的分析过程可以知道,当我们从十进制转十六进制的时候,先对这个数 & 15,然后再右移4位,直到这个数为0为止。
那么转八进制也是同样的道理,当我们从十进制转成八进制的时候,先对这个数 & 7 ,然后再右移3位,直到这个数为0为止。
那么转二进制也是同样的道理,当我们从十进制转成二进制的时候,先对这个数 & 1 ,然后再右移1位,直到这个数为0为止。
将得到的结果存储到一个临时的容器中,然后变成一个字符串输出。
3. 进制转换:
/** * 进制转换:将一个整数转换成其他进制的表现形式 * 参数1:要转换的参数 * 参数2:要进行&运算的模值 * 参数3:要移动的位置 */ public static String int2Other(int num, int model, int offset) { if(num==0){ return "0"; } char[] arr = {'0','1','2','3', '4','5','6','7', '8','9','A','B', 'C','D','E','F'}; char[] chs = new char[8]; int pos = chs.length; while(num!=0){ int temp = num & model; chs[--pos] = arr[temp]; num = num>>>offset; } // 使用字符串形式进行返回 String str = new String(chs, pos, chs.length-pos); return str; } /* * 方法:十进制转成二进制 */ public static String toBinaryString(int i) { return int2Other(i, 1, 1); } /* * 方法:十进制转换成八进制 */ public static String toOctalString(int i) { return int2Other(i, 7, 3); } /* * 方法:十进制转换成十六进制数 */ public static String toHexString(int i) { return int2Other(i, 15, 4); }
-------
Windows Phone 7手机开发、
.Net培训、期待与您交流! -------