`
1028826685
  • 浏览: 942988 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

java面试总结(第六天)

阅读更多

  下面对昨天没有总结完的java面试题继续总结:

第一:GC是什么? 为什么要有GC?

答:GC 即垃圾回收(Gabage Collection) 在C++ 、C中内存的管理是最为繁琐的事情不回收内存和错误的回收内存造成系统崩溃和内存泄露 GC会自动监测对象的作用域来判断这个对象是否超过作用域如果超过则自动的回收内存 java中没有提供显示的对已经分配内存进行回收的方法

第二:垃圾回收的优点和原理。并考虑2种回收机制。

答:GC对分配的对象进行自动的监测记录对象的作用域是否可以达到 在java中对象就不存在‘作用域’ 而是引用的这个对象的变量具有’作用域‘ ,垃圾回收器通常作为一个低级的线程在不可预知的情况下对堆中已经死亡的和长时间没有使用的对象进行清除和回收这样可以有效的防治内存泄露 提高内存的可使用率 垃圾回收可分为:分代复制垃圾回收、标记垃圾回收、增量垃圾回收

第三:垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

答: 当创建许多对象 GC就会对对象的地址、大小、使用情况进行记录 GC采用有向图的方式记录和管理堆中的对象 通过这种方式记录对象是否可达到 当对象不可达到的时候GC就会负责去回收不可达到对象的内存 。我们可以主动的通知GC去进行垃圾回收 
System.gc()但是jvm不保证会执行 


第四:java中会存在内存泄漏吗,请简单描述。

答:
  <1首先简述什么是内存泄露:

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤立的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的

 <2内存泄露情况:

  1>:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
  2>:如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
  3>:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。


第五:(参考)能不能自己写个类,也叫java.lang.String?

答:可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。

虽然java提供了endorsed技术,可以覆盖jdk中的某些类,具体做法是….。但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。

第六:下面是参考的一些出错代码题及解答:

1.
abstract class Name {
   private String name;
   public abstract boolean isStupidName(String name) {}
}
大侠们,这有何错误?
答案: 错。abstract method必须以分号结尾,且不带花括号。
2.
public class Something {
   void doSomething () {
       private String s = "";
       int l = s.length();
   }
}
有错吗?
答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。
3.
abstract class Something {
   private abstract String doSomething ();
}
这好像没什么错吧?
答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract
method封锁起来呢? (同理,abstract method前不能加final)。
4.
public class Something {
   public int addOne(final int x) {
       return ++x;
   }
}
这个比较明显。
答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。
5.
public class Something {
   public static void main(String[] args) {
       Other o = new Other();
       new Something().addOne(o);
   }
   public void addOne(final Other o) {
       o.i++;
   }
}
class Other {
   public int i;
}
和上面的很相似,都是关于final的问题,这有错吗?
答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference
(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable
(成员变量),而o的reference并没有改变。
6.
class Something {
    int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}
有什么错呢? 看不出来啊。
答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。
7.
class Something {
    final int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}
和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?
答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。
8.
public class Something {
     public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}
看上去很完美。
答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。
9.
此处,Something类的文件名叫OtherThing.java
class Something {
    private static void main(String[] something_to_do) {       
        System.out.println("Do something ...");
    }
}
这个好像很明显。
答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。
10.
interface  A{
   int x = 0;
}
class B{
   int x =1;
}
class C extends B implements A {
   public void pX(){
      System.out.println(x);
   }
   public static void main(String[] args) {
      new C().pX();
   }
}
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。
11.
interface Playable {
    void play();
}
interface Bounceable {
    void play();
}
interface Rollable extends Playable, Bounceable {
    Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {
    private String name;
    public String getName() {
        return name;
    }
    public Ball(String name) {
        this.name = name;       
    }
   public void play() {
        ball = new Ball("Football");
        System.out.println(ball.getName());
    }
}
这个错误不容易发现。
答案: 错。"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。



第七:(参考). 算法与编程

1.判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日。
答:我们可以用正则表达式来定义复杂的字符串格式,(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])可以用来判断是否为合法的15位或18位身份证号码。
因为15位和18位的身份证号码都是从7位到第12位为身份证为日期类型。这样我们可以设计出更精确的正则模式,使身份证号的日期合法,这样我们的正则模式可以进一步将日期部分的正则修改为[12][0-9]{3}[01][0-9][123][0-9],当然可以更精确的设置日期。
在jdk的java.util.Regex包中有实现正则的类,Pattern和Matcher。以下是实现代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

/**
* @param args
*/
public static void main(String[] args) {

// 测试是否为合法的身份证号码
String[] strs = { "130681198712092019", "13068119871209201x",
"13068119871209201", "123456789012345", "12345678901234x",
"1234567890123" };
Pattern p1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])");
for (int i = 0; i < strs.length; i++) {
Matcher matcher = p1.matcher(strs[i]);
System.out.println(strs[i] + ":" + matcher.matches());
}

Pattern p2 = Pattern.compile("\\d{6}(\\d{8}).*"); // 用于提取出生日字符串
Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日
for (int i = 0; i < strs.length; i++) {
Matcher matcher = p2.matcher(strs[i]);
boolean b = matcher.find();
if (b) {
String s = matcher.group(1);
Matcher matcher2 = p3.matcher(s);
if (matcher2.find()) {
System.out
.println("生日为" + matcher2.group(1) + "年"
+ matcher2.group(2) + "月"
+ matcher2.group(3) + "日");
}
}

}

}

}

1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
答:
package cn.itcast;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class MainClass{
public static void main(String[] args) throws Exception{
FileManager a = new FileManager("a.txt",new char[]{'\n'});
FileManager b = new FileManager("b.txt",new char[]{'\n',' '});
FileWriter c = new FileWriter("c.txt");
String aWord = null;
String bWord = null;
while((aWord = a.nextWord()) !=null ){
c.write(aWord + "\n");
bWord = b.nextWord();
if(bWord != null)
c.write(bWord + "\n");
}

while((bWord = b.nextWord()) != null){
c.write(bWord + "\n");
}
c.close();
}

}


class FileManager{

String[] words = null;
int pos = 0;
public FileManager(String filename,char[] seperators) throws Exception{
File f = new File(filename);
FileReader reader = new FileReader(f);
char[] buf = new char[(int)f.length()];
int len = reader.read(buf);
String results = new String(buf,0,len);
String regex = null;
if(seperators.length >1 ){
regex = "" + seperators[0] + "|" + seperators[1];
}else{
regex = "" + seperators[0];
}
words = results.split(regex);
}

public String nextWord(){
if(pos == words.length)
return null;
return words[pos++];
}

}

1、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。
(大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!)
答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Jad2Java {

public static void main(String[] args) throws Exception {
File srcDir = new File("java");
if(!(srcDir.exists() && srcDir.isDirectory()))
throw new Exception("目录不存在");
File[] files = srcDir.listFiles(
new FilenameFilter(){

public boolean accept(File dir, String name) {
return name.endsWith(".java");
}

}
);

System.out.println(files.length);
File destDir = new File("jad");
if(!destDir.exists()) destDir.mkdir();
for(File f :files){
FileInputStream  fis = new FileInputStream(f);
String destFileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));
copy(fis,fos);
fis.close();
fos.close();
}
}

private static void copy(InputStream ips,OutputStream ops) throws Exception{
int len = 0;
byte[] buf = new byte[1024];
while((len = ips.read(buf)) != -1){
ops.write(buf,0,len);
}

}
}

由本题总结的思想及策略模式的解析:
1.
class jad2java{
1. 得到某个目录下的所有的java文件集合
1.1 得到目录 File srcDir = new File("d:\\java");
1.2 得到目录下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter());
1.3 只想得到.java的文件: class MyFileFilter implememyts FileFilter{
public boolean accept(File pathname){
return pathname.getName().endsWith(".java")
}
}

2.将每个文件复制到另外一个目录,并改扩展名
2.1 得到目标目录,如果目标目录不存在,则创建之
2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
2.3 根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
//要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
//方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}

分析listFiles方法内部的策略模式实现原理
File[] listFiles(FileFilter filter){
File[] files = listFiles();
//Arraylist acceptedFilesList = new ArrayList();
File[] acceptedFiles = new File[files.length];
int pos = 0;
for(File file: files){
boolean accepted = filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++] = file;
}
}

Arrays.copyOf(acceptedFiles,pos);
//return (File[])accpetedFilesList.toArray();

}
1、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
答:
首先要了解中文字符有多种编码及各种编码的特征。
    假设n为要截取的字节数。
public static void main(String[] args) throws Exception{
String str = "我a爱中华abc我爱传智def';
String str = "我ABC汉";
int num = trimGBK(str.getBytes("GBK"),5);
System.out.println(str.substring(0,num) );
}

public static int  trimGBK(byte[] buf,int n){
int num = 0;
boolean bChineseFirstHalf = false;
for(int i=0;i<n;i++)
{
if(buf[i]<0 && !bChineseFirstHalf){
bChineseFirstHalf = true;
}else{
num++;
bChineseFirstHalf = false;
}
}
return num;
}
1、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。
答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。
String content = “中国aadf的111萨bbb菲的zz萨菲”;
HashMap map = new HashMap();
for(int i=0;i<content.length;i++)
{
char c = content.charAt(i);
Integer num = map.get(c);
if(num == null)
num = 1;
else
num = num + 1;
map.put(c,num);
}
for(Map.EntrySet entry : map)
{
system.out.println(entry.getkey() + “:” + entry.getValue());
}
估计是当初面试的那个学员表述不清楚,问题很可能是:
如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
int engishCount;
int chineseCount;
int digitCount;
for(int i=0;i<str.length;i++)
{
char ch = str.charAt(i);
if(ch>=’0’ && ch<=’9’)
{
digitCount++
}
else if((ch>=’a’ && ch<=’z’) || (ch>=’A’ && ch<=’Z’))
{
engishCount++;
}
else
{
chineseCount++;
}
}
System.out.println(……………);






                                                                   ---作者:李勇
分享到:
评论

相关推荐

    java面试题总结

    ### Java面试题总结 #### 一、面向对象的特征有哪些方面? 面向对象编程(OOP)是一种编程范式,它强调将程序结构组织成一组对象,每个对象都可以接收其他对象发送的消息、处理数据、以及执行动作。Java作为一种典型...

    Java面试宝典2018版

    《Java面试宝典2018版》是一本专门针对Java面试的知识点整理,涵盖了Java基础、面向对象...以上知识点是根据《Java面试宝典2018版》部分内容进行的总结,为准备Java面试的开发者提供了一个清晰的知识框架和复习重点。

    2018 Java 工程师面试总结

    3. **数据库设计与优化**:面试中常问到如何在内外网之间交换数据,使用第三方组件处理数据库交换,以及数据库性能优化的方法,如SQL语句的优化、使用何种工具进行优化等。 4. **Web服务**:面试者应熟悉Web服务的...

    java面试视频.part15.rar

    包含代码 视频总共压缩了19包,需要全部下载完才能解压 适合java求职找工作的小伙伴 第1章 课程导学 第2章 计算机网络面试核心 第3章 数据库 第4章 Redis第5章 Linux 第6章 Java底层知识:JVM 第7章 Java底层知识:...

    java面试总结.pdf

    【Java面试总结】 Java面试中,常常涉及到的技术和框架包括Tapestry、Struts、SpringMVC、Spring、Hibernate和MyBatis。以下是对这些框架的详细解释: 1. **Tapestry** - Tapestry是一个前端MVC框架,它采用模板...

    java面试视频.part02.rar

    包含代码 视频总共压缩了19包,需要全部下载完才能解压 适合java求职找工作的小伙伴 第1章 课程导学 第2章 计算机网络面试核心 第3章 数据库 第4章 Redis第5章 Linux 第6章 Java底层知识:JVM 第7章 Java底层知识:...

    java面试视频.part12.rar

    包含代码 视频总共压缩了19包,需要全部下载完才能解压 适合java求职找工作的小伙伴 第1章 课程导学 第2章 计算机网络面试核心 第3章 数据库 第4章 Redis第5章 Linux 第6章 Java底层知识:JVM 第7章 Java底层知识:...

    java面试宝典-高手总结

    【Java面试宝典-高手总结】是一篇针对Java初学者和面试准备者的指南,涵盖了JavaEE和WEB开发的基础知识。以下是对这些知识点的详细解析: 1. Java是强类型语言,这意味着在Java中,变量必须在使用前进行声明并初始...

    java面试总结.docx

    【Java面试总结】 在Java面试中,面试官通常会关注候选人的技术背景和对关键框架的理解。以下是一些常被问及的知识点: 1. **Tapestry框架**: - Tapestry是一个前端MVC+模板技术的框架,旨在分离视图逻辑和业务...

    java面试视频.part10.rar

    包含代码 视频总共压缩了19包,需要全部下载完才能解压 适合java求职找工作的小伙伴 第1章 课程导学 第2章 计算机网络面试核心 第3章 数据库 第4章 Redis第5章 Linux 第6章 Java底层知识:JVM 第7章 Java底层知识:...

    java面试常见问题总结word版

    以上只是Java面试中常见的部分知识点,实际面试可能还会涵盖更多主题,如多线程、IO流、设计模式、JVM内存模型、异常处理、Spring框架等。深入理解和掌握这些概念对于成为一位优秀的Java开发者至关重要。

    应聘java考试面试题总结

    ### 应聘Java考试面试题总结 #### 一、作用域关键字详解 在Java中,作用域关键字(如`public`、`private`、`protected`等)用于控制类、方法、变量等成员的访问权限。以下是这些关键字的详细介绍: 1. **public**...

    java工程师面试题总结

    Java工程师面试题总结涉及到Java基础的多个方面,包括语法、类、内部类、继承、异常处理、线程、集合、IO操作以及Java虚拟机的相关知识点。下面将对上述提及的知识点进行详细解释。 首先,Java基础部分包括: - ...

    java面试题

    ### JavaSE面试题知识点梳理 #### 一、Java 跨平台原理 Java 语言的核心优势之一在于其跨平台性,...通过以上总结,我们可以了解到 Java 语言的基本特性和关键概念,这对于准备 Java 面试的求职者来说是非常重要的。

    Java 面试题 Java 面试题

    根据给定的文件内容,我们可以总结出一系列与Java面试相关的知识点。下面将详细解析每一道题目涉及的关键概念。 ### 第一部分:基础知识 #### 1. final, finally, finalize的区别 - **final**: 用于声明变量、方法...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java面试宝典pdf

    本资源总结了 Java 面试中的一些常见问题和知识点,涵盖了 Java 基础知识、面向对象编程、异常处理、多线程等方面的知识。 1. &和&&的区别 在 Java 中,&和&&都是逻辑运算符,但是它们有着不同的执行机制。当第一...

    java面试突击让你的笔试轻松过关!

    Java面试突击让你的笔试轻松过关! Java面试突击是指通过学习和掌握Java相关的知识点,提高自己的学习能力和学习方法,从而轻松通过笔试,拿到高薪工作。本文总结了程序员的两种结局:默默退休或以程序员为起点,...

    java面试问题集锦

    ### Java面试问题集锦 #### 一、运行程序之前: ##### Path与classpath图解 - **Path**:指的是操作系统环境变量中的PATH,它定义了系统查找可执行文件的路径列表。当用户在命令行中输入一个命令时,系统会在PATH...

Global site tag (gtag.js) - Google Analytics