黑马程序员_java面试总结

---------------------- android培训java培训、期待与您交流! --------------------

 


 

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

2.Java有没有goto?

java中的保留字,现在没有在java中使用。

3、说说&和&&的区别。

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

 

备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。

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

2 << 3,因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

5."=="和equals方法究竟有什么区别? 

(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

String a=new String("foo");

String b=new String("foo");

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。

如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

boolean equals(Object o){

return this==o;

}

这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

6.BS与CS的联系与区别。

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。

B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、InFORMix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

C/S 与 B/S 区别:

1.硬件环境不同:

  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.

  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行

2.对安全要求不同

  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.

  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3.对程序架构不同

  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

4.软件重用不同

  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

5.系统维护不同  

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

7.用户接口不同

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

8.信息流不同

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

 

 

7.

Integer与int的区别

int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

8.

作用域public,private,protected,以及不写时的区别。

作用域

 当前类

同一package

子孙类

其他package

public

private

protected

不写(默认)

  注:具有访问权限的写“是”,不具有访问权限的写“否”。

9.

 

Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

 

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

 

10.TCP和UDP的区别。
TCP:传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据之前,必须现在双方之间建立一个TCP链接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP是用户数据协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。用于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快,UDP与TCP的主要区别在于UDP不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误的到达目的地。UDP在许多方面非常有效。当某个程序的目标是尽快的传输尽可能多的信息是(其中任意给定数据的重要性相对较低),可使用UDP.ICQ短消息使用UDP协议发送消息。许多程序将使用单独的TCP链接和单独的UDP链接。重要的状态信息随可靠的TCP链接发送,而主要数据通过UDP发送。

1、环境变量path和classpath的作用是什么?(5分)

 

答:.PATH变量用于列出可执行文件的搜索路径.因为要通过命令行的命令启JAVA,JAVAC等编译工具和解释工具,系统必须要知道他们所在位置,而PATH则指明了其位置.
CLASSPATH变量用于JAVA加载类的路径.只有在classpath设置的路径中的类才能被加载.

 

2、编写程序计算1+2+3+....+100的和。(10分)

 

答:Num.java
public class Num{
public static void main(String[] args){
    int sum = 0;
    for(int i=1;i <=100;i++){  
        sum+=i;    
     }  
System.out.println("1到100的累加之和为:"+sum);
  }
}

3、已知一个int数组, 编程从数组中获取最大数。(10分)

答:Sum.java
public class Sum {  
    public static void main(String[] args) {  
    int[] a= {15,10,7,-4,35};    
       int max=a[0];    
       for(int b=0;b<a.length;b++){    
       if(max<a[b])
   max=a[b]; 
  }   
System.out.println("数组中最大数是:" + max);  
}
}

4、编写程序获取已知文件的扩展名. 注意: abc.txt的扩展名是txt, abc.java.txt的扩展名也是txt。(10分)

 

答:import java.io.File;
import java.io.IOException;
 
public class TestFileName {
    public static void main(String args[]){
    File file = new File("abc.txt");
     if(!file.exists()){
       try {
          file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
String fname = file.getName();
                                               System.out.println(fname+":扩展名是:" +fname.substring(fname.lastIndexOf(".")+1,fname.length()));
}
}

5、定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性. 属性需要私有并提供get, set方法, 可以通过构造函数进行初始化。(10分)

 

答:public class Student {
    //姓名, 年龄, 考试成绩
    public Student(String _name,int _old,int _source)
    {
        String name=_name;
        int old=_old;
        int source=_source;
    }
    private String name;
   
    public void setName(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
   
    private int old;
    public void setOld(int old) {
        this.old = old;
    }
 
    public int getOld() {
        return old;
    }
   
    public void setSource(int source) {
        Source = source;
    }
 
    public int getSource() {
        return Source;
    }
 
    private int Source;
   
}
编写HTML注册表单, 需要字段: 用户名, 密码, 确认密码, 性别(单选), 城市(下拉列表), 兴趣爱好(多选), 个人简介(文本域)。(20分)
 
答:<html>
<head>
<title>HTML注册表单</title>
</head>
<body>
<form action="" method="post" οnsubmit="return sub()" name=form>
用户名:<input type="text" name="username" value="" /><br>
密码  <input type="password" name="password" value="" /><br>
确认密码:<input type="password" name="repassword" value="" /><br>
性别:<input type="radio" name="sex" value="0" checked=”default” />男
<input type="radio" name="sex" value="1" />女<br>
城市: <select name="city">
<option value="0">郑州</option>
<option value="1">上海</option>
<option value="2">天津</option>
<option value="3">深圳</option>
</select><br>
兴趣爱好:<input type="checkbox" name="read" value="0" />阅读
        <input type="checkbox" name="travel" value="1" />旅游
        <input type="checkbox" name="Internet" value="2" />上网
个人简介: <textarea rows="5" cols="30" name="readme"></textarea> <br>     
<input type="submit" value="提交"/>      
</form>
</body>
</html>

使用JavaScript验证第9题的HTML表单. 用户名: 必须是字母数字或下划线, 不能以数字开头. 密码: 6-16位字母数字下划线. 确认密码: 和密码一致. 其他项为必填。(选做题 20分)

 

答:<script type="text/javascript">

function sub (){  

 if(!(/^[a-zA-Z_]{1}[a-zA-Z_0-9]*$/.test(form.username.value))){  

  alert("用户名必须是字母数字或下划线, 不能以数字开头!");  

  return false;  

 }else if(!(/[a-zA-Z_0-9]{6,16}/.test(form.password.value))){  

 alert("密码 6-16位字母数字下划线!");  

  return false;  

 }else if(form.repassword.value != form.password.value){  

 alert("两次输入密码应一致!");  

 return false;  

}else if(form.sex[0].checked==false && form.sex[1].checked==false){  

  alert("性别不能为空!"); 

  return false;   

 }else if(form.city. checked == false){  

  alert("城市不能为空!");  

  return false;  

 }  

else if(form.read.checked == false && form.travel.checked == false && form.Internet.checked == false){  

  alert("兴趣爱好不能为空!");  

  return false;  

 }  

 else if(form. readme. checked == false){  

  alert("个人简介不能为空!");    

  return false;  

 }   

 else{   

  return true;    

 }  

}    

</script>  

 

 

.阐述一下你对MVC的理解。 M:model 也就是模型 V:  view 也就是视图 C:control 也就是控制

在JAVA中如何跳出当前的多重嵌套循环?

可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,

ok:

for(int i=0;i<10;i++)

{

           for(int j=0;j<10;j++)

           {

                    System.out.println(“i=” + i + “,j=” + j);

                    if(j == 5) break ok;

           }

}

也可以让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] = {{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i<arr.length && !found;i++)

{

           for(int j=0;j<arr[i].length;j++)

           {

                    System.out.println(“i=” + i + “,j=” + j);

                    if(arr[i][j]  == 5)

                    {

                             found = true;

                             break;

                    }

           }

}

 

 


 

 

------------------------ android培训java培训、期待与您交流! ----------------------

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值