Java程序员笔试面试之Java基础

1.++i与i++的用法,i+++i++,i+++++i,i+++i+++i++


记得java运算符的优先级++的优先级是比+的优先级高,然后++i是先自增在运算,i++是先运算在自增

比如int i=1;计算i+++i++其实是(i++)+(i++)第一个括号i=1,(1)+(2)=3;此时i=3

接着上面的I=3计算i+++++i=(i++)+(++i)=(3)+(5)=8;此时i=5,其他都一样


2.String类型的创建和存储机制是什么,String str1=“abc”   String  str2=new String(“abc”),String,StringBuffer,StringBuilder的区别


①以上2个表达式是字符串的2种初始化方式


②最重要的一点String是不可以变的一旦创建就不可以修改,注意这里指的不可以改变是值,而引用可以被修改的,可以指向不同的String对象,但是一旦创建他的value是肯定不能变的。


③其实在JVM中存在这一个字符串池,其中包含了很多的字符串对象,并且可以被共享使用。


④String  str1=“abc”首先会在字符串池中查找abc对象如果没有则会创建abc使str2指向abc,若有不创建直接将str1指向abc


⑤比如  String  str1=“abc”     此句在常量区创建了一个“abc”字符串对象

              String  str2=“abc”     str2引用常量区的“abc”而不会创建新的对象

              String  str3=new String(“abc”)  new一下就会有新的对象,所以在堆中创建新的对象

              String  str4=new String(“abc”)  new一下就会有新的对象,所以在堆中又创建了一个新的对象

其实String  str4=new String(“abc”)我们可以分解为2个步骤一个是new 第二个是赋值的过程


⑥问题:new  String (“abc”)创建了几个对象?

1个或者2个,若字符串常连池中没有“abc”则创建一个,若有则创建2个对象


⑦问题:String  s  ,s=null和s=“”是否相同?

不相同。s代表的是一个字符串类型的引用,s=null代表的是他不指向任何一个一个字符串。

                                                                               s=“”代表的是指向了一个字符串,只不过这个字符串为空。


⑧关于String ,StringBuffer,和StringBuilder的区别

String是不可变类,String对象一旦被创建其值就不能改变,而StringBuffer是可以改变类,也就是说当对象被创建以后也可以对其值进行修改,因此在需要被共享的场合一般使用String而经常需要修改的我们就是用StringBuffer。


另一个区别在于初始化的问题String我们可以用String  s=“abc“或者String s=new  String(”abc“)来进行初始化,而StringBuffer只能用StringBuffer s=new StringBuffer(”abc“)的方式来初始化。


StringBuilder跟StringBuffer类似是字符串缓冲区,但是StringBuilder不是线程安全的,如果只在单线程中使用字符串缓冲那么使用StringBuilder效率会更高,当多个线程访问时,最好使用线程安全的StringBuffer。


3.运算符的优先级

序列号

符号

名称

结合性(与操作数)

目数

说明

1

.

从左到右

双目

 

( )

圆括号

从左到右

 

 

[ ]

方括号

从左到右

 

 

2

+

正号

从右到左

单目

 

-

负号

从右到左

单目

 

++

自增

从右到左

单目

前缀增,后缀增

- -

自减

从右到左

前缀减,后缀减

~

按位非/取补运算

从右到左

单目

 

逻辑非

从右到左

单目

!”不可以与“=”联用

3

*

从左到右

双目

 

/

从左到右

双目

整数除法:取商的整数部分,小数部分去掉,不四舍五入

%

取余

从左到右

双目

 

4

+

从左到右

双目

 

-

从左到右

双目

 

5

<< 

左移位运算符

从左到右

双目

 

>> 

带符号右移位运算符

从左到右

双目

 

>>> 

无符号右移

从左到右

双目

 

6

小于

从左到右

双目

关系运算符“大于”说明

<=

小于或等于

从左到右

双目

 

大于

从左到右

双目

 

>=

大于或等于

从左到右

双目

 

instanceof

确定某对象是否属于指定的类

从左到右

双目

 

7

==

等于

从左到右

双目

关系运算符“==”说明

!=

不等于

从左到右

双目

 

8

&

按位与

从左到右

双目

 

9

|

按位或

从左到右

双目

 

10

^

按位异或

从左到右

双目

 

11

&&

短路与

从左到右

双目

 

12

||

短路或

从左到右

双目

 

13

? :

条件运算符

从右到左

三目

 

14

=

赋值运算符

从右到左

双目

 

+=

混合赋值运算符

 

-=

 

*=

 

/=

 

%=

 

&=

 

|=

 

^=

 

<<=

 

>>=

 

>>>=

 

说明:

1、算数运算符

    + :加法

    - :减法

    * :乘法

    / :除法

    % :取余运算

2、关系运算符

    < :只能比较基本类型数据之间的关系,不能比较对象之间的关系。

    > : (同关系运算符“<”)

    <=: (同关系运算符“<”)

    >=: (同关系运算符“<”)

    == :若使用该运算符比较两个对象的引用(变量),则实质上是比较两个变量是否引用了相同的对象。所谓相同的对象是指,是否是在堆栈(Heap)中开辟的同一块儿内存单元中存放的对象。

  若比较两个对象的引用(变量)所引用的对象的内容是否相同,则应该使用equals()方法,该方法的返回值类型是布尔值。需要注意的是:若用类库中的类创建对象,则对象的引用调用equals()方法比较的是对象的内容;若用自定义的类来创建对象,则对象的引用调用equals()方法比较的是两个引用是否引用了同一个对象,因为第二种情况equals()方法默认的是比较引用。

    != :(同关系运算符“==”)

3、逻辑运算符 (操作符只能是布尔类型的

    &&

    ||

    !

 4、位运算符

    &

    |

    ^

    ! :不可以与=联用,因为!是一元操作符;不可以对布尔类型的数据进行按位非运算

 5、移位运算符(只能处理整数运算符)

  Char、byte、short类型,在进行移位之前,都将被转换成int类型,移位后的结果也是int类型;移位符号右边的操作数只截取其二进制的后5位(目的是防止因为移位操作而超出int类型的表示范围:2的5次方是32,int类型的最大范围是32位);对long类型进行移位,结果仍然是long类型,  移位符号右边的操作符只截取其二进制的后6位。

  << :

  >> :若符号位为正,则在最高位插入0;若符号位为负,则在最高位插入1

  >>> :无论正负,都在最高位插入0

4.selectSort与insertSort与BubbleSort

首先是选择排序算法:

public class SelectSort {
    
	 public static void selectSort(int [] a){
		 int min;
		 int temp;
		 
		 if(a==null || a.length<=0){
			 return;
		 }
		 
		 for(int i=0;i<a.length;i++){//外循环控制比较的次数,每一次找出一个最小值并交换
			 min=i;//将当前下标定义为最小值下标
			 for(int j=i+1;j<a.length;j++){//内循环控制当前这一趟数据之间的比较找到最小值
				 if(a[j]<a[min]){//如果这一趟中有一个数据小于我们定义的最小值则将这个数据的下标赋给min,其实min就是一个flag
					 min=j;
				 }
				 
			 }
		   if(min!=i){//若这一趟中的min发生了改变则说明这一趟中有数据比我们定义的min要小所以将这个数据跟我们定义的a[min]交换
				 temp=a[min];
				 a[min]=a[i];
				 a[i]=temp;
				
		  }
		}
	  }
    }





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值