java面试题

做一下笔记,面试题来源与网络,主要来源于牛客网,侵权删除

4.11
有这样一段程序

复制代码 隐藏代码

public class Test{
    public static void main(String [] args){
        List list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("a");
        Set set=new HashSet();
        set.add("a");
        set.add("b");
        set.add("a");
        System.out.println(list.size()+","+set.size());
    }
}

请问运行主要的程序会打印出的是什么()(刮一刮出答案)

3,2

解析:

list有序可重复,set无序不可重复,list可以插入多个null元素,而set只允许插入一个null元素

4.12
指出接下来程序运行的结果

复制代码 隐藏代码

 public class Example{
       String str = new String("good");
    char[] ch ={'a','b','c'};
       public static void main(String args[]){
           Example ex=new Example();
           ex.change(ex.str,ex.ch);
           System.out.print(ex.str+" and ");
           System.out.print(ex.ch);
       }
       public void change(String str,char ch[]){
           str = "test ok";
           ch[0] = 'g';
       }
   }

good and gbc

个人理解,欢迎纠错补充

实参和形参的问题。

String类型的str是值传递,在调用change() 方法时,改变的指是change() 方法中的形参,并未真正修改实参str

而方法中ch[0]是引用传递,也称传地址,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

涉及知识点

java中传递参数的两种方式
值传递:传递值的数据类型,八种基本数据类型和String(事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以改变值,但只是改变其内容。不能改变外部变量所指向的内存地址)。
引用传递:传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
java中形参,实参,成员变量,局部变量,构造方法的作用和区别
形参:用来接受实参中传过来的值,对与基本数据类型和string,形参的改变不影响实际参数,对引用类型,形参的改变直接影响实际参数
实参:实际参数
局部变量:
也称内部变量,是指在一个方法内部、方法声明上或复合语句内部定义的变量(方法和函数只是叫法不同)
没有默认的初始化值,必须先定义,赋值,才能使用
内存位置:栈内存
生命周期:随着方法的调用而存在,随着方法的调用完毕而消失。
全局变量:既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。
成员变量:
位置:类中方法外
内存位置:堆内存
生命周期:随着对象的存在而存在,随着对象的消失而消失
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值
基本类型
整数型:byte、short、int、long
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1
浮动型:float、double
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加
字符型:char 存储Unicode码,用单引号赋值
布尔型:boolean 只有true和false两个取值
4.13
A 是抽象父类或接口, B , C 派生自 A ,或实现 A ,现在 Java 源代码中有如下声明:

A a0=new A();

A a1 =new B();

A a2=new C();

​ 问以下哪个说法是正确的?( )

A.第1行不能通过编译

B.第1、2行能通过编译,但第3行编译出错

C.第1、2、3行能通过编译,但第2、3行运行时出错

D.第1行、第2行和第3行的声明都是正确的

​ 答案:A

​ 解析:抽象类和接口不能实例化!

4.14
以下JAVA程序代码的输出是

复制代码 隐藏代码
public static void main(String args[]) {
System.out.println(17^5);
}
A.12 B.22 C.20 D.1419857

​ 解析:(主要来自于牛客网 -XUYINGJIE-)

​ 按位异或(^)运算是一个二进制运算:两者相同为0,两者不同为1

复制代码 隐藏代码
17^5: 分别将17、5转为二进制,然后从后向前比较 ,相同为0,不同为1

         17 = 10001

​ 5 = 101

​ 17^5 = 10100

复制代码 隐藏代码
10100 转为10进制为:20
​ 知识点

异或运算的一些性质

. a^0=a

a^a=0
在数学中的运算符未⊕
满足交换律和结婚律 a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
使用异或运算交换2个数值

复制代码 隐藏代码
a=11, b=9.
a = a^b = 1011^1001 = 0010;
b = b^a = 1001^0010 = 1011;
a = a^b = 0010^1011 = 1001;
//经运算后,此时:a = 9,b = 11;
位运算
按位与(&) 同时为1,则为1 否则为0 例:a = 2; b = 3; a & b => 10 & 11 => 10
按位或(|) 有一个为1,则为1,否则为0 例:a = 2; b = 3; a | b => 10 | 11 => 11
按位异或(^) 不同为1,相同为0 例:a = 2; b = 3; a ^ b => 10 ^ 11 => 01
按位取反(~) 二进制数在内存中是以补码的形式存在的,我们要得到补码然后取按位取反
原码->反码->补码 列:a = 2;二进制原码 => 10 反码 => 010 ,前面补零(多1位符号位)其中最左面的是符号位,0为正,1为负。正数原反补一样,负数是原码(符号位不变 取反) -> 反码(反码+1) -> 补码。010是正数,补码为 010 , 对补码按位取反 101,把按位取反后的二进制数101转为补码,101是负数,101 => 110 => 111 = > -0b11 => -3 公式 ~x = -(x+1)
按位左移 (<<) 按位左移,左移n位相当于乘以2的n次方 例:a = 2; a << 3 => 16
按位右移 (>>) 按位右移,左移n位相当于除以2的n次方 例:a = 2; a >> 3 => 0
4.15
1、A,B,C,D 中哪些是 setvar的重载?(多选)
复制代码 隐藏代码
public class methodover
{
public void setVar(int a, int b, float c) {}
}
A.private void setVar(int a, float c, int b){}

B.protected void setVar(int a, int b, float c){}

C.public int setVar(int a, float c, int b){return a;}

D.public int setVar(int a, float c){return a;}

答案:ACD

解析:

重载是在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同,顺序不同),与方法的返回值无关,与权限修饰符无关,B中的参数列表和题目的方法完全一样了。

2、下列关于while循环、do-while循环和for循环说法错误的是(多选)
A.while循环先执行条件判断,do-while循环执行循环体
B.do-while循环结束的条件是关键字while后的条件表达式成立
C.for循环结构中的3个表达式缺一不可
D.while循环能够实现的操作,for循环也能实现

答案:BC

解析:

A while只有在满足条件时执行,而do-while会先执行一次 再看条件是否满足 满足再次循环 不满足跳出

B 说的是do-while的循环结束的条件,自然是条件不成立才结束,所以B错误

C for循环中的"单次表达式"、"条件表达式"和"循环体语句"都是选择项, 即可以缺省成只剩下;的空语句,;不能 缺省的原因是编译格式如此,缺省了编译器不认识而会报错。

省略了用来初始化的单次表达式时, 表示不对循环控制变量赋初值。

省略了条件表达式, 若不做其它处理则成为死循环。

省略了所有循环体, 则for语句不被其它形式处理时不产生任何作用。

D while与for是可以实现的,do-while就不对了

4.16下列方法中哪个是执行线程的方法? ()
run()
start()
sleep()
suspend()

答案:run()

解析:

run()方法用来执行线程体中具体的内容

start()方法用来启动线程对象,使其进入就绪状态

sleep()方法用来使线程进入睡眠状态

suspend()方法用来使线程挂起,要通过resume()方法使其重新启动

4.17 jvm中垃圾回收分为scanvenge gc和full GC,其中full GC触发的条件可能有哪些
A.栈空间满
B.年轻代空间满
C.老年代满
D.持久代满
E.ystem.gc()

答案:CDE

解析:

垃圾收集机制:新生代、老年代、持久代

img

1,新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。

2,老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。

3,持久代:持久代如果满了,将触发Full GC。

System.gc是有可能触发full gc的。这个方法的调用是建议jvm进行full gc,虽然只是建议而非一定,但很多情况下会触发full gc,从而增加了full gc的频率,但弊端是增加了间歇性停顿的次数,不建议使用。

4.19
以下类定义中的错误是什么?()
复制代码 隐藏代码
abstract class xy
{
abstract sum (int x, int y) { }
}
A.没有错误
B.类标题未正确定义
C.方法没有正确定义
D.没有定义构造函数

答案:C.方法没有正确定义

解析

1、抽象方法不能有方法体,只能声明

2、该方法缺少返回值,只有构造没有返回值

ArrayList list = new ArrayList(20);中的list扩充几次
A.0
B.1
C.2
D.3

答案 A

解析

Arraylist默认数组大小是10,扩容后的大小是扩容前的1.5倍,最大值小于Integer 的最大值减8,如果新创建的集合有带初始值,默认就是传入的大小,也就不会扩容

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Axing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值