常见面试题

命名规则:

工程名:一般小写

Package名字:小写

类名:每个单词的首字母大写

属性和方法名:小驼峰 首个单词首字母小写,其余单词首字母大写

static final修饰的认为是常量:常量属性全大写

基本数据类型

数值型:

整型(整数 byte short int long)

浮点型(小数float double(默认))

字符型:char(单个字符,2字节)

布尔型:Boolean(true/false 经常用作开关)

引用数据类型(类、接口、数组)

char 型变量中能不能存贮一个中文汉字?#

可以,char占两个字节

运算符

逻辑与或与按位与或的区别:

逻辑与  false&&true    false    (有短路操作, 只能参与逻辑运算,不可以参与位运算)

按位与  false&true    false  (无短路操作, 可以参与位运算)

++i 先加后赋值

i++  先赋值后加

+=    x+=y;-----  x=x+y;

逻辑运算符:

&&    and

||      or

!        not

位运算符:

&    and

|    或

^    异或

<<  左移    左移一位*2  左移2位 *22  左移n位 *2n

右移    右移一位/2  右移2位 /22  右移n位 /2n

用最有效率的方法算出 2 乘以 8 等於几?

2 << 3

因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,

而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3。

三元运算符

表达式1?表达式2:表达式3

boolean b=(1>2)?true:false;System.out.println(b);------>falseinti=(2>3)?1:0;System.out.println(i);------>0

分支

if/switch

switch

每个分支判断条件类型相同 switch支持的表达式类型为int、byte、char、short,String(JDK17+)

switch 语句能否作用在 byte 上----->能

能否作用在 long 上,        ----->不能

能否作用在 String 上        ----->jdk1.7后能

假设switch –a分支没有break,那么他会继续向下执行,直到遇到break;

@Test

public void test2() {

char c='b';

switch (c) {

//a或者b进行相同的处理

case 'a':

//如果选择了a,那么执行什么

case 'b':

//如果选择了a,那么执行什么

System.out.println("您选择了a或者b");

break;

default://如果上述情况都不满足,就默认

break;

}

while与 dowhile区别

while直接判断是否成立  ---->有可能一次都没执行

do----while 先执行一次,然后再判断条件是否成立  ---->至少执行一次

for/foreach

for(inti=0;i<=100;i+=2){}for(循环到的对象类型  引用名称:循环谁){    引用名称。。。。。。。 }

死循环

while(true){

}

for(;;)

循环中断:

两种:

中断整个循环:break;

中断当次循环,进行到下一次循环(跳过本次循环,进行下一次)continue;

break语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出整个循环。

“break;”语句:可以出现在while、do…while、for、switch语句体中。

“break label”语句 :可以出现在任何语句体中。

循环的中断

continue语句用在循环语句体中,用于终止某次循环过程,跳过本次循环,开始下一次循环过程

“continue;” 语句:只能出现在循环语句while、do…while、for中,不能用在switch语句中

Break label:为每层循环定义个别名,break可以指定跳出哪一外名字的循环。

练习题

1.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

@Testpublicvoidtest18(){/**

      * 1.一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下

      * 求它在第10次落地时,共经过多少米?第10次反弹多高?

      */doubleh=100.00;//从第2次开始算,跳的高度 100+50+25+12.5+...//h/1+h/2+h/4+h/8doublesum=100.00;for(inti=1;i<=9;i++){System.out.println("h="+h);sum+=h/2*2;h=h/2;}System.out.println("最终h="+h/2);System.out.println("sum="+sum);}

2.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各个位数字立方和等于该数本身。

个位数字的立方+十位数字的立方+百位数字的立方的和= 它本身

@Testpublicvoidtest1(){for(inti=100;i<=999;i++){intbai=i/100;intshi=i/10%10;intge=i%10;if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i){System.out.println(i);}}}153370371407

3、int total = 0;

for ( int i = 0; i < 4; i++ ){

if ( i == 1) continue;

if ( i == 2) break;

total += i;

}

则执行完该程序段后total的值为:(  )。

A、0        B、1        C、3        D、6

数组

第一种通过下标放值//数组定义inta[]=newint[5];//数组第一个元素为1a[0]=1;//数组第2个元素为1a[1]=456;//数组第3个元素为1a[2]=123;a[3]=567;a[4]=2;System.out.println(a[1]);第二种 通过new+{}组合方式//数组初始化 方括号不写数字,根据初始化个数自动确定数组长度数组类型  数组名[]=new数据类型[]{元素1,元素2,…}inta[]=newint[]{1,456,123,567,2};第三种 直接初始化数组类型  数组名[]={元素1,元素2,…}inta[]={1,456,123,567,2};@Testpublicvoidtest3(){//先建立一个一维数组,长度为100,存放1-100之间的数//存放完之后再写一段程序,把数组的每个元素打印出来inta[]=newint[100];inti=0;for(i=0;i<100;i++){//a[0]=1;a[1]=2  a[i]=i+1;}for(i=0;i<100;i++){System.out.println(a[i]);}}多维数组:定义数组类型  数组名[][]数组类型[][]数组名数组类型[]数组名[]inta[][];int[][]b;int[]c[];多维数组的创建数组名=new数据元素类型[行数][列数]数组名=new数据元素类型[行数][];a=newint[3][4];a=newint[3][];a=newint[][4];//非法int[][]array={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};

方法定义与调用

[访问权限控制符][修饰符]返回值类型 方法名(参数类型 形参,参数类型 形参,…){方法体//方法做什么业务}

3、重载(编译时)和重写(运行时)##

运行时多态的三个必要条件:

1、必须有继承或实现(子类继承父类  实现类实现接口)

2、必须有重写  (子类重写父类的方法, 实现类覆盖接口的方法)

3、父类的引用指向子类的对象  也就是要有向上转型

重写:方法的定义完全相同,只是方法方法体不同

相同的方法名、相同的参数列表(参数类型,参数顺序)、相同的返回值类型

一定发生在子类当中,与父类同名,同参,同返回值类型的方法,子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限

重载:同一个类中相同的方法名参数必须不同(参数类型不同或参数个数不同)、返回值可以相同也可以不同

请说出作用域 public ,private ,protected ,以及不写时的区别

作用域        当前类  同一package  子孙类      其他 package

public            √                  √            √                    √

protected      √                  √            √                  ×

default          √                  √              ×                  ×

private          √

继承和多态

类单继承

接口可以多继承

同一个类可以实现多个接口

构造方法

构造方法名与类名相同,无返回值类型,也不需要用void补位

如果你没有写有参构造,系统为你生成无参构造

如果你写了有参构造,不会再为你自动生成无参构造,这时候如果想用无参构造,需要重写

如何给新实例的对象赋值

1、属性的set方法赋值

2、通过有参构造方法赋值

变量类型

局部变量

方法级别的变量

局部变量只能在该方法里的有效

实例变量

成员变量 类级别

如果是公有的,其他类也能访问到

如果是私的的,当前类的所有方法都可以访问他

静态变量

第三种静态变量

用static修饰的变量 static修饰的变量是可以共享的变量

书写格式:访问权限 访问修饰  变量类型 变量名

java 中实现多态的机制是什么?

父类的引用指向子类的实例(接口与实现类之间  父类与子类之间)

抽象类与接口的区别

抽象类和接口都不能实例化

1)接口里的方法都是抽象的,而抽象类可以有非抽象方法。

2)类是单继承,多实现

3)接口和接口之间可以多继承(接口可以合并)

4)抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法全是抽象方法,是一套纯粹的规范。

接口里的属性必须是static final的,但抽象类无限制

*接口里不能有构造方法,抽象类可以有构造方法

static与final

用static修饰的内容系统启动时就会加载进来,适合做一些初始化工作

Static 修饰的元素主要用来实现各个类之间共享,特别是属性

修饰:属性:方法      代码块需要注意的问题  只能修饰类成员,不能修饰局部变量(不能修饰方法体里的变量)。 •  用static修饰变量(属性)  所有对象共享•  也称为类变量  用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在(参考java虚拟机视频)  两种方式访问:•  直接访问:类名.属性;•  实例化后访问:对象名.属性•  用static修饰方法  不需要实例化,可以直接访问•  也称为类方法  两种方式访问:•  直接访问:类名.方法名()•  实例化后访问:对象名.方法名()•  注意事项  静态方法里只能直接访问静态成员,而不能直接访问类中的非静态成员  静态方法中不能使用this、super关键字  静态方法不能被非静态方法覆盖,静态方法不能修饰构造器•  静态代码块  一个类中由static关键字修饰的,不包含在任何方法体中的代码块  当类被载入时,静态代码块被执行,且只被执行一次  静态块经常用来进行类属性的初始化

Final(终极的不可修改的)

可以修饰的内容:类 变量(属性) 方法  类:不能被继承(没有下一代),可被实例化  变量:常量,不能被重新赋值      方法:不能被重写。

单例

•  单例模式实现:–  拥有一个私有构造方法 –  提供一个自身静态私有的成员变量–  提供一个公有的静态的方法(返回实例化后的对象)publicclassSingleton{/*• 单例模式实现:

    –  拥有一个私有构造方法

    –  提供一个类型为自身的  静态的私有的成员变量(属性)

    –  提供一个公有的静态的方法(返回实例化后的对象)*///step 2 提供一个类型为自身的  静态的私有的成员变量privatestaticfinalSingletoninstance=newSingleton();//step 1拥有一个私有构造方法 privateSingleton(){}//step 3提供一个公有的静态的方法publicstaticSingletongetSingleton(){returninstance;}publicstaticvoidmain(String[]args){Singletons1=Singleton.getSingleton();Singletons2=Singleton.getSingleton();System.out.println(s1);System.out.println(s2);}}

final, finally, finalize 的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally 是异常处理语句结构的一部分,表示总是执行。

finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,

可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方

法总被调用

String StringBuffer StringBuilder区别

String是不可变字符串常量,对它的改动都创建了新的对象;

StringBuffer与StringBuilder代表一组可以改变的字符串

StringBuffer是线程安全的

StringBuilder是线程不安全的,效率高于StringBuffer,单线程操作可以使用StringBuilder

String与 Math是否可被继承,为什么

不可以,因为被final修饰

计算子串在父串中出现的次数

publicvoidtest3(){System.out.println("请输入字符串1");Strings1=newScanner(System.in).next();System.out.println("请输入字符串2");Strings2=newScanner(System.in).next();//引进计数器用于记录次数intcount=0;while(s1.indexOf(s2)!=-1){System.out.println("存在");count++;s1=s1.substring(s1.indexOf(s2)+s2.length());System.out.println(s1);}System.out.println(count);//indexOf求子串在整串的次数//键盘输入//首先判断是否存在子串abc在父串中存在,如果存再计算次数}

List Set map

数组是定长的    可以存放基本类型和引用类型 访问较快 java.lang包中

集合是可变长的  集合只能存放引用类型              java.util包内

Set与list map

Set - 无序的集合;不允许重复(可用于去重)

List有序的集合;允许重复

Map key-value key-唯一标识 value实际存放的数据 适合根据指定唯一标识来查找

set的类型

•  Set接口的实现类

HashSet — HashSet的特性在于其内部对象的散列存取,即采用哈希技术

TreeSet — TreeSet存入的顺序跟存储的顺序不同,但是存储是按照排序存储的

ArrayList与linkedlist区别

ArrayList--内部基于数组实现,随机查询速度快,插入删除速度慢;

(建议用普通for循环读取)

LinkedList--内部基于链表实现,随机查询速度慢,插入删除速度快

(用迭代器读取会比较快)

Map接口有两个实现:

HashMap:按hashcode排序 基于数组的

TreeMap:按自然顺序  基于红黑二叉树的

LinkedHashMap;按存入的顺序  基于链表的

冒泡算法(略)

扑克牌

packagecom.neuedu.test;publicinterfaceCard{// 匹配情况String[]cases={"花色点数都相同","花色相同","点数相同","不相同"};// 花色String[]suits={"红桃","黑桃","梅花","方块"};// 牌面值String[]faces={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};// 判断两张牌的牌型StringshowPokerHands(Cardcard);publicStringgetSuit();publicStringgetFace();}packagecom.neuedu.test;publicclassSuitExceptionextendsException{publicSuitException(Stringmessage){super(message);}}packagecom.neuedu.test;publicclassFaceExceptionextendsException{publicFaceException(Stringmessage){super(message);}}packagecom.neuedu.test;publicclassCardImplimplementsCard{privateStringface;privateStringsuit;publicCardImpl(Stringface,Stringsuit)throwsSuitException,FaceException{// 判断花色是否在suits范围内。如果花色不对抛SuitExceptionbooleansuitFlag=false;// 不在花色范围内for(Stringmysuit:suits){if(mysuit.equals(suit)){suitFlag=true;// 花色合法}}if(suitFlag==false){thrownewSuitException("花色不合法");}booleanfaceFlag=false;// 不在花色范围内for(Stringmyface:faces){if(myface.equals(face)){faceFlag=true;// 花色合法}}if(faceFlag==false){thrownewFaceException("花色不合法");}// 判断花色是否在faces范围内。如果牌面不对抛FaceExceptionthis.face=face;this.suit=suit;}@OverridepublicStringshowPokerHands(Cardcard){// 判断花色和点数都相同if(face.equals(card.getFace())&&suit.equals(card.getSuit())){returncases[0];}elseif(face.equals(card.getFace())){returncases[2];}elseif(suit.equals(card.getSuit())){returncases[1];}else{returncases[3];}}@OverridepublicStringgetSuit(){// TODO Auto-generated method stubreturnnull;}@OverridepublicStringgetFace(){// TODO Auto-generated method stubreturnnull;}publicstaticvoidmain(String[]args)throwsSuitException,FaceException{// 创建一张红桃3,一张黑桃6,调用方法判断两张牌的牌型。CardImplcard1=newCardImpl("3","红桃");CardImplcard2=newCardImpl("6","黑桃");Stringresult=card1.showPokerHands(card2);System.out.println(result);}}

转至:↓↓↓

链接:https://www.jianshu.com/p/ff7dc46dcfe9

来源:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(常见面试题)