你必须知道的261个Java语言问题笔记- Java编程基础2

来源:互联网 发布:淘宝 手机 描述 模板 编辑:程序博客网 时间:2024/06/09 08:46
在实现x和y相加时,x+=y和x=x+y两种实现方式有区别吗
在一般情况下两种语句是可以通用的,但是有些情况却不可通用。
short s = 3;s+=1;//编译通过s=s+1;//编译发生错误。
s+1表达式的计算结果为int类型,而左边变量类型为short类型,违反了自动转换规则,需要类型
强制转换。而+=在运算时会自动根据接收变量的类型进行类型的强制转换。

在执行与预算时,运算符&和&&有什么区别
&&被称为短路与,与操作的特点是只要参与运算的操作数有一个是false,最后整个表达式的结果就是
false,因此&&运算表达式从左往右计算时,如果发现一个false值,就放弃继续运算,直接返回false.
&被称为逻辑与,该运算符在计算表达式结果时,表达式的每个操作数都要参与计算,然后才得出整个
表达式的计算结果。
注:|和||运算符的区别与&和&&的情况相似,||遇到true就放弃后续运算,直接返回true.
建议采用&&,因为该运算符从执行效率上讲要优于&。

在实现x递增加1操作时,x++和++x有什么区别
如果x++和++x作为一条独立语句时,没有什么区别。
如果x++和++x作为某表达式的一部分使用,就会存在差别。
++x表示先将变量x的值加1,然后x在参与表达式运算;
x++则表示先用x值参与表达式运算,然后再将变量x的值加1.

x?y:z格式的语句表示什么意思
被称为三目运算符。
x是一个布尔表达式,当x为true,返回y表达式的值,否则返回z表达式值。
三目运算与if..else的执行效率,if..else会略高一点,并没有十分明显的效率差别。

"+"操作符在Java内部是如何实现字符串连接的
Java不支持运算符重载,但在Java内部提供了一些特殊运算符,它们具有重载的特征。
"+"在实现字符串连接过程中,实际上是借助了StringBuilder类以及append()方法。

==和equals()都可用于比较两个操作数是否相等,它们有什么区别
==是一个关系运算符,用于判断两个简单变量的值是否相等,或两个引用变量的引用地址是否相等。
equals()是一个方法,用于判断引用变量引用地址指向的存储内容是否相等。
equals()是Object类中定义的一个方法,由于其他引用类型默认继承Object,因此该方法在其他引用
类型中都可以使用。
注意:Object类中定义的equals()方法是直接使用==操作实现的。在自定义类型时建议重写equals()
方法。
在比较两个字符串是否相等时,建议使用equals()方法实现。

创建String对象时,使用String s = new String("abc")和String s = "abc"语句有什么区别
Java为加强程序的运行速度,因此设计了两种不同的方法来生成字符串对象,一种是调用String类的
构造方法,另一种是使用双引号""。这两种方法生成的字符串对象,在内存中存取机制是不同的。
Java为String类型提供了缓冲池机制。当使用双引号定义对象时,Java环境首先去字符串缓冲池中
寻找相同内容的字符串,如果存在就直接拿出来应用,如果不存在则创建一个新的字符串放在缓冲池中。
在使用String构造方法定义对象时,Java环境会和创建其他类型的对象一样,每次调用时,都会创建
一个新的对象。
一般情况下,建议使用String s = "abc"方式,因为该方式采用字符串缓冲池机制,效率高。

break和continue语句有什么区别
break的作用是可以结束其所在的switch语句或者循环语句的执行。
continue的作用是终止本次循环,进入下一次循环。

数组如何定义和初始化
数组可以用于存储一组相同类型的数据,数组的元素可以是简单类型也可以是引用类型。
1.数组定义
数组可分为一维数组、二维数组和多维数组。一维数组的定义有以下两种方式:
type[] arr_name;
type arr_name[];
二维数组的定义方式如下:
type[][] arr_name;
type arr_name[][];
在定义数组时,[]可以放在类型后面,也可以放在变量名后后面。
int[] arr1;
String[] arr2;
float arr3[];
String[][] arr4;
注意:在数组定义中不能指定数组的长度,在数组的创建阶段需要指定大小,用于分配存储空间。
2数组初始化
数组初始化有以下两种方式:
静态初始化
静态初始化是指在定义时同时指定数组元素内容。
int[] arr1 = {1,2,3,4,5};
String[] arr2 = {"tom","rose","sunny"};
string[][] arr3 = {{"tom","American"},{"jack","England"},{"张三","china"}}
在静态初始化时,不需要指定数组的大小,系统会根据指定的内容的数量自动分配大小。
动态初始化
动态初始化是指在定义时首先通过new关键字开辟指定大小的存储空间,然后再为存储单元指定内容。
//初始化一维数组
int[] arr1 = new int[3];
arr1[0] = 10;
//初始化二维数组
String[][] arr2 = newString[3][2];
arr2[0][0] = "tom";
在通过new关键字创建多维数组时,不必指定每一维的大小,而只需要指定最左边的维的大小即可。
如果指定了某一维的大小,那么处于这一维大小都需要指定,否则将编译出错。
注:使用new关键字创建数组对象时,在分配存储空间后,系统会为每一个存储单元默认初始化,其规则遵循
成员变量默认初始化规则。

如何实现一维和二维数组的遍历
可使用for语句遍历数组元素,下面提供两种实现方式,一种是原有for循环,另一种是从JDK5.0开始
提供的新式for循环。
原有for循环
String[] arr = {"tom","rose","sunny"};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
新式for循环
String[] arr = {"tom","rose","sunny"};
for(String s:arr){
System.out.println(s);
}
注意:数组元素的访问索引是从0开始的,如此如果数组大小为n,其访问索引应该为0~n-1.

如何实现数组的复制
将一个数组变量复制到另一个数组变量,可以通过多种方式实现,例如采用for循环遍历赋值等。

数组的排序算法有哪些?如何实现?
冒泡排序法,选择排序法、插入排序法以及快速排序法。
选择排序法:
选择排序法的基本思路:将要排序的数组分成两部分,一部分是从小到大已经排好序的,
一部分是无序的,从无序的部分取出最小的数值,放到已经排好序的部分的最后。
//选择排序法
public int[] xuanze(int[] arr){
int t;
for(int i = 0;i<arr.length;i++){
int m = i;
for(int j=i;j<arr.length;j++){
//如果j元素比m元素小,将j赋值给m
if(arr[j]<arr[m]k){
m=j;
}
}
//交换m和i两个元素的位置
if(i!=m){
t=arr[i];
arr[i] = arr[m];
arr[m] = t;
}
}
return arr;
}
冒泡排序法
冒泡排序法的基本思路是:从数组开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,
将数组大的元素后移。每经过一趟排序后,数值最大的元素将移到末尾,此时记下该元素的位置,
下一趟排序只需要比较到此位置为止,直到所有元素都已有序排序。
//冒泡排序法
public int[] maopao(int[] arr){
int t;
for(int i=0;i<arr.length;i++){
//循环比较相邻两个元素大小
for(int j=0;j<arr.length-i-1;j++){
//比较相邻元素大小,小的前移,大的后移
if(arr[j]>arr[j+1]){
t = arr[j];
arr[j] = arr[j+1];
arr[j+1} = t;
}
}
}
return arr;
}
插入排序法
插入排序法的基本思路是:将要排序的数组分成两部分,每次从后面的数组部分中取出索引最小的
数组元素,插入到前面数组部分的适当位置中。通常在开始排序时,将数组的第一个元素作为一组,
后面的所有元素被当成另一组。
//插入排序
public static int[] cahru(int[] arr){
//把第一个元素看做一部分,第二个元素看做另一部分
//从第二部分中依次取元素插入到第一部分中
for(int i = 1;i<arr.length;i++){
int tmp = arr[i];
int j = i-1;
//依次和i前面元素比较,寻找合适插入位置
while(tmp<arr[j]){
arr[j+1]=arr[j];
j--;
if(j==-1){
break;
}
}
//将插入元素插入到合适位置
arr[j+1] = tmp;
}
return arr;
}
快速排序法
快速排序法是当今被认为最好的排序算法之一,它的基本思路是:将一个大的数组的排序问题,分解
成2个小的数组的排序,而每个小的数组的排序又可以继续分解成更小的2个数组,这样一直递归分解
下去,直到数组的大小最大为2.
//快速排序法
public static int[]kuaisu(int[] arr){
return quicksort(arr,0,arr.length-1);
}
//递归分组排序
public static int[]quicksort(int[] arr,int left,int right){
int t;
if(left<right){
int s = arr[left];
int i = left;
int j= right+1;
while(true){
//向右找大于s的数的索引
while(i+1<arr.length&&arr[++i]<s);
//向左找小于s的数的索引
while(j-1>-1&&arr[--j]>s);
//如果i>=j,退出循环
if(i>=1){
break;
}else{
//交换i和j位置的元素
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
arr[left]=arr[j];
arr[j]=s;
//对左边进行递归
quicksort(arr,left,j-1);
//对右边进行递归
quicksort(arr,j+1,right);
}
return arr;
}

如何解决ArrayIndexOutOfBoundsException异常
ArrayIndexOutOfBoundsException意思是数组索引越界异常,是在提取数组元素时使用索引不当引起的
阅读全文
0 0
原创粉丝点击