java程序员的从0到1:统计某字符串在有文件被起的次数(面试题)

目录:

一,谈谈final, finally, finalize的区别。

  1. 编程题目

  2. 方法一

  3. 方法二

  4. 方法三

  5. 方法四

  6. 总结

final—修饰符(关键字)
修饰类,则该类不能够叫延续;修饰方法,不克让再度写;修饰成员变量,不能够为二潮赋值(所以说要吃定初始值);不克和abstract同时使;

正文:

finally—专门用于在try-catch块之后,一般用来关闭某些流之类的。

1. 编程题目

finalize—方法名。专门为此在渣回收机制的时节;每一个靶还生一个finalize()方法;

  形容一个主意,输入一个文本称以及一个字符串,统计是字符串在这文件被冒出的次数。

当回收对象的时节,在进展可达性分析后发觉无与GC
Roots相连接的引用链,会为第一不好标记且进行相同不良罗,筛
选的尺度就是是否有必要履行该办法,当目标没盖该法还是就给调用了,就非会见再履行该方式了;该方法是针对
象逃脱死亡之绝无仅有办法

2. 方法一

亚,Anonymous Inner Class (匿名内部类)
是否好extends(继承)其它类,是否可implements(实现)interface(接 口)?

  废话少说,先来看望方法一致底代码:

匿名的内类是没有名字的内类。不能extends(继承)
其它类,但一个里边类可以当一个接口,由外一个里面类实现。

public  static int getStringNumberMethod1(String fileName, String str) throws Exception {
        int num = 0;

        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        StringBuffer stringBuffer = new StringBuffer();
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }
        for(int i = 0; i < stringBuffer.length(); i++){
            if(stringBuffer.indexOf(str, i) != -1){
                i = stringBuffer.indexOf(str, i);
                num++;
            }
        }
        return num;
    }

其三,Static Nested Class 和 Inner
Class的异,说得越多越好(面试题有的不得了暧昧)。

  首先应用输入流将文件被之字符串都存储到一个StringBuffer中,然后再次去这StringBuffer中统计是字符串出现的次数,这里要注意的凡每次找到相应之字符串时,在属下要摸索的此字符串会发生变化。

Nested Class (一般是C++的说法),Inner Class
(一般是JAVA的传教)。Java内部类与C++嵌套类最深之例外便在于是否
有指向外部的援上。

3. 方法二

静态内部类(Inner
Class)意味着创建一个static内项目的对象,不待一个外部类对象;不可知由一个static内项目的一个对准
象访问一个标类对象

  来探第二栽方式:

Hashtable继承自Dictionary类,而HashMap是Java1.2推荐的Map
interface的一个兑现

public static int getStringNumberMethod2(String fileName, String str) throws Exception {
        int num = 0;

        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        StringBuffer stringBuffer = new StringBuffer();
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }
        int start = 0;
        while( (start = stringBuffer.indexOf(str, start)) != -1){
            stringBuffer = stringBuffer.delete(start, start + str.length());
            num ++;
        }

        return num;
    }

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

  第二种方式应该比较第一栽方法更好掌握,就是于找到呼应的字符串时,下一致不善找的字符串变成了本来的字符串删掉出现字符串位置之前的字符,第二种办法用到了StringBuffer的delete方法,因此在性质达到会于第一种方法不同一点。

还有即使是,HashMap把Hashtable的contains方法去丢了,改成为containsvalue和containsKey。因为contains方法易受
人引起误解。最老的差是,Hashtable的章程是Synchronize的,而HashMap不是,在
多独线程访问Hashtable时,不待自己也它们的计实现并,而HashMap
就必也底资外合办。

4. 方法三

四,&和&&的区别。

  老三种方式:

&是各项运算符;不管前面对和错,后面还与运算。

public static int getStringNumberMethod3(String fileName, String str) throws Exception {
        int num ;

        StringBuffer stringBuffer = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }

        num = stringBuffer.toString().split(str).length -1;

        return num;
    }

&&是布尔逻辑运算符;只要前面第一只呢true,则后面的即使无进行演算。

  第三栽办法在物色对许字符串时,是先将StringBuffer转换成了String,然后使用split,将要查找的字符串当做是一律种植标准进行私分,得出的数值减一虽是若摸字符串的数额。这种方法是匪是挺抢眼,但是她的特性如何也,一会我们揭示答案。

五,HashMap和Hashtable的区别。

5. 方法四

1、HashMap和Hashtable都是Map接口的兑现类似

  季种植艺术:

2、Hashtable是线程安全之,而HashMap是线程不安全之;

public static int getStringNumberMethod4(String file, String find) throws Exception
    {
        int count = 0;
        Reader in = new FileReader(file);
        int c;
        while ((c = in.read()) != -1) {
            while (c == find.charAt(0)) {
                for (int i = 1; i < find.length(); i++) {
                    c = in.read();
                    if (c != find.charAt(i)){
                        break;
                    }
                    if (i == (find.length() - 1)) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

3、HashMap允许key-value作为null值,但是Hashtable不允许

  第四栽方式是一方面从文本被采用流动读取数据,一边做判定,这种啊足以实现者职能,但是可想而知效率肯定不是高的。

4、HashMap是采用的高效安全黄机制来展开走访的

6. 总结

六,Collection 和 Collections的区别。

  在押罢了上述四栽方式,不晓大家看过瘾没,但是及时四种办法既然都能达标这个目的,谁的频率又是高也?我特别做了一个测试,在一个文本中起50几近万独字符,然后采用就四种植方式从这文件中找对应的字符串,结果如下:

都是java.util包下的

  第一次测试结果(ms) 第二次测试结果(ms) 第三次测试结果(ms)
方法一 19 25 20
方法二 63 70 66
方法三 25 22 22
方法四 62 56 62

— Collections是相近,它涵盖有各种关于集合操作的静态方法。

 

— Collection是接口,它是各种集合的父接口.

  通过之表相信大家呢能一目了然。希望大家会模拟到部分事物,最后送大家一致句共勉之口舌:假如认为累,那一定是为当走及坡路,谢谢。

七,什么时用assert。

预言是一个包含布尔表达式的口舌,在尽这讲话时要该表达式为
true。如果表达式计算也 false,那么系统会报告一个
AssertionError。它用于调试目的:

assert(a > 0); // throws an AssertionError if a <= 0

预言可以起零星种样式:

assert Expression1 ;

assert Expression1 : Expression2 ;

Expression1 应当总是发生一个布尔值。

Expression2
足是近水楼台先得月一个值的即兴表达式。这个价值用于转移显示更多调试信息的 String
消息。

预言在默认情况下是禁用的。要在编译时启用断言,需要用 source 1.4 标记:

javac -source 1.4 Test.java

如果当运行时启用断言,可采取 -enableassertions 或者 -ea 标记。

设若于运转时精选禁用断言,可利用 -da 或者 -disableassertions 标记。

假设系统类中启用断言,可使 -esa 或者 -dsa
标记。还可当保之底蕴及启用或剥夺断言。

可以在预测正常情况下不会见到达的其它岗位上停断言。断言可以用来证明传递给个体方法的参数。不过,断言不应有用于证明传递给国有方法的参数,因为不管是不是启用了断言,公有方法都得检查其参数。不过,既可于国有方法中,也可以当非国有方法吃使用断言测试后置条件。另外,断言不该为其他方式改变程序的状态。

八,GC是啊? 为什么要出GC?

GC是垃圾堆收集器。Java
程序员不需操心内存管理,因为废品收集器会自动进行管制。要要垃圾收集,可以调用下面的方
法之一:

System.gc()

Runtime.getRuntime().gc()

九,String s = new String(“xyz”);创建了几乎独String Object?

简单单对象,一个是“xyx”;一个凡是靠于“xyx”的援对象s。

十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11

十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=
1;有什么错?

short s1 = 1; s1 = s1 +
1;有错,s1是short型,s1+1是int型,不可知显式转化为short型。可改也s1
=(short)(s1 + 1) 。 short s1 = 1; s1 += 1正确。

十二,sleep() 和 wait() 有啊分别?

wait();不肯定用指定等待时;释放执行权的当儿释放锁

sleep():必须指定等待时;释放执行权,但是不会见放出锁;从运行状态变为临时阻塞状态

十三,Java有没有goto?

有,作为java的保留字存在

十四,数组有无发length()这个方式? String有没发生length()这个方法?

数组没有length()这个办法,有length的特性。

String有length()这个主意。

十五,Overload(重载、过载)和Override(重写、覆盖)的区别。Overloaded的主意是否可以变更返回值的色?

重写是父类与子类之间多态性的一模一样栽表现,重载是暨一个类吃多态性的如出一辙种表现。

override(重写)是挂了一个方以对那个重写,以要达到不同之来意。

overload(重载)它是指我们得定义有称一致之点子,通过定义不同的输入参数来分别这些点子,然后重新调用时,JVM就见面依据不同之参数样式,来抉择适当的法执行。

Overload(重载)的道是可以改变返回值的类别。

十六,Set里之因素是休能够重新的,那么因此什么方式来分重复与否呢?
是因此==还是equals()? 它们有哪区别?

Set里之素是休克重新的,用iterator()方法来分别重复与否。equals()是判读两个Set是否当。

equals()和==方法决定引用值是否对准同一对象equals()在看似吃被盖,为的是当半只分别之靶子的情跟类型相配的说话,返回真值。

十七,给我一个公最好常看到的runtime exception。

ArithmeticException,ArrayStoreException,BufferOverflowException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,IllegalStateException,
ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,ProfileDataException,ProviderException,RasterFormatException,SecurityException,SystemException,UndeclaredThrowableException,UnmodifiableSetException,
UnsupportedOperationException

十八,error和exception有啊分别?

error 代表都错误或低层资源的错误,总是不可为操纵的。比如说内存溢出。

exception 代表一致种设计还是落实问题。 程序员导致的不当,比如算数异常等。

十九,List, Set, Map是否持续自Collection接口?

List,Set是

Map不是

二十,abstract class和interface有什么区别?

接口中持有的道包含的还是空虚的。而空虚类则好又富含抽象和未抽象的艺术。
类可以实现广大单接口,但是只能连续一个抽象类,类设只要实现一个接口,它必须使兑现接口声明的持有方。但是,类可以免落实抽象类声明的有着办法,当然,在这种状况下,类为须得声明成是空虚的。抽象类可于匪提供接口方法实现的情况下促成接口。

Java 接口中宣称的变量默认都是 final 的。抽象类可分包非 final 的变量。

Java 接口中之积极分子函数默认是 public 的。抽象类的成员函数可以是
private,protected 或者是
public。接口是纯属抽象的,不得以叫实例化。抽象类为不可以让实例化,但是,如果她涵盖
main 方法的语句是可于调用的。

二十一,abstract的method是否可又是static,是否只是同时是native,是否可又是synchronized?

都不能

二十二,接口是否可继承接口? 抽象类是否只是实现(implements)接口?
抽象类是否只是继续实体类(concrete class)?

接口可以连续接口。抽象类可兑现(implements)接口,抽象类是否只是继续实体类,但前提是实业类必须产生举世瞩目的构造函数。

二十三,启动一个线程是因此run()还是start()?

启动线程使用start()方法。当用start()开始一个线程后,线程就进来就绪状态,使线程所代表的虚拟处理机处于可运行状态,这代表它们可由JVM调度并尽。这并无表示线程就会见应声运行。当cpu分配受它们时常,才开执行run()方法(如果有话)。START()是办法,它调用RUN()方法.而RUN()方法是公要另行写的.
run()方法中带有的是线程的本位

二十四,构造器Constructor是否只是为override(重写)?

重写是产生在父类与子类之间的政工,然而构造器Constructor不能够被持续,因此不克重写,但足让重载

二十五,是否好延续String类?

String类是final类故不可以持续。

publicfinalclassStringextendsObjectimplementsSerializable,Comparable,CharSequence

二十六,当一个线程进入一个目标的一个synchronized方法后,其它线程是否只是登这个目标的任何措施?

勿可知,一个靶的一个synchronized方法就会由一个线程访问。

二十七,try {}里生一个return语句,那么紧跟以这try后的finally
{}里之code会不会见于实施,什么时候吃实施,在return 前还是后?

会执行,在return前执行。

二十八,编程书: 用最有效率的办法算有2乘机以8相当於几?

2 << 3

二十九,两只对象值相同(x.equals(y) == true),但可可起差的hash
code,这句话对怪?

怪,有同等的hashcode。

三十,当一个目标为看成参数传递到一个主意后,此方而转这个目标的性能,并可归变化后底结果,那么这里究竟是价值传递还是引用传递?

是价值传递。Java
编程语言才出价传递参数。当一个对象实例作为一个参数为传送至艺术中时,参数的价值就是本着拖欠对象的援。对象的情节可于叫调用的方法吃改变,但目标的援是永恒不见面转移的。

三十一,swtich是否能图在byte上,是否会图在long上,是否能够图在String上?

switch(expr1)中,expr1凡是一个平头表达式。因此传递让 switch 和 case
语句子之参数应该是 int、 short、 char 或者 byte。long,string
都无克图为swtich。

三十二,编程题: 写一个Singleton出来。

//恶汉式

class singeleton{

//1.私有化构造器,让于这个类似的外表类不克调用这个构造器

private singeleton(){

}

//2、创建是仿佛的目标,因为构造器被私有化,外部类是匪可知更
对这看似创建对象,所以只能本类自己创建对象

//因为此目标是位于属性之职位,所以可以拓展私有化,提供对外的措施,让外部类经过艺术来调用这个目标

private static singeleton instence=new singeleton();

//3.私有化此instance对象,通过国有的方法来调用

//4.此共用的办法,只能通过类似来调用,因为安装也static的,同时类似的之实例也亟须也static

public static singeleton
getSingeleton(){//返回路是singeleton***********调用对象的只能是道要类,因为这仿佛中

//的靶子吃私有化,只能
是经类似来开展走访,那么即便如对准是类似进行静态化static修饰

//这个方法的意图就是是回到对象instence

return instence;

}

}

***************************************

//懒汉式

class singeleton2{

private singeleton2(){

}

private static singeleton2 instence2=null;

public static singeleton2 getSingeleton(){

if(instence2!=null){

instence2=new singeleton2();

}

return instence2;

}

}

只要向这java程序员发展或真心有趣味之。可以找寻我若有java的习视频Java学习交流群:450936584,这个是免费的,希望同学找我要是之时光绝不生理所应当的神态,毕竟都是自身之血汗,希望您是真正的起同一发想要学好java的心迹,我吧会见尽所能之失帮您变成同叫作优秀的程序员。

图片 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图