码迷,mamicode.com
首页 > 编程语言 > 详细

stack overflow的好问题 - java篇

时间:2014-11-25 00:05:46      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   java   

问题 & 答案

1.怎样交换一个字符串中的两个字段?

Q:问题描述:怎样交换 foo 和 bar 的位置?

String word1 = "bar";
String word2 = "foo";
String story = "Once upon a time, there was a foo and a bar."

解决办法:

1). 使用中间变量的方式。

story = story.replace("foo", "lala");
story = story.replace("bar", "foo");
story = story.replace("lala", "bar");

弊端:需要保证作为中间变量的字符串没有出现过;本来只需要进行一次交换,但这个方法进行了三次操作!

2). 使用StringUtils工具类方法

StringUtils.replaceEach(story, new String[]{"foo", "bar"}, new String[]{"bar", "foo"})

 2.一个Java类中,只定义变量,没有赋值,会消耗内存么?

A:会。即使没有赋值,也会有默认值。例如int i;和int i=0;的效果是一样的。

对于定义在方法内部的局部变量,没有给出明确答案。有人给出这样的代码:

public static void main(String[] args) {
    int i;  // ignored
    int j = 5;
    String s = "abc";
    String sNull; // ignored
}

二进制代码:

  LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  args   [Ljava/lang/String;
            2       4     2     j   I
            5       1     3     s   Ljava/lang/String;
   }

jvm忽略了i,sNull,所以有人认为方法内部没有赋值的局部变量不消耗内存;

但是,也有人认为,slot 只列出了0,2,3位置,而没有列出slot 1,而这个位置,正是给i留出来的。所以,他认为消耗内存。

 3.在构造器中调用可覆写方法,有什么错误?

首先明确一点,这种调用方法不一定报错,某些严格要求的IDE会给出warning.

public class ConstructorMethod {
    abstract static class Base{
        Base(){
            info();
            System.out.println("base class constructor running");
        }
        abstract void info();
    }
    static class Son extends Base{
        public void info(){
            System.out.println("Son class method running");
        }
        Son(){
            super();
            System.out.println("son class constructor running");
        }
    }
    public static void main(String[] args) {
        Son s=new Son();
        /*Son class method running
        * base class constructor running
        * son class constructor running
        * Son类的方法在Son对象未创立之前就被调用了*/
    }
}

上面的例子,可以通过编译、运行,但是在一些情况下,构造器里有可覆写的方法,可能引发异常:

public class ConstructorMethod2 {
    abstract static class A{
        private A a;
        A(){
            add(a);//注释掉这一行,可以消除空指针异常
        }
        abstract void add(A a);
    }
    static class B extends A{
        List<A> bList=new ArrayList<A>();
        private B b;
        B(){
        }
        void add(A a){
            bList.add(b);
        }
    }
    public static void main(String[] args) {
        B b=new B();
    }
}

上面的例子,引发了空指针异常:java.lang.NullPointerException。

总之,构造器中尽量不要调用可覆写方法的原因是:我们不知道子类会去怎样实现这些方法!

来自:

1.How can I replace two strings in a way that one does not end up replacing the other?

2.Do unused local variables in a method acquire memory in JVM?

3.What‘s wrong with overridable method calls in constructors?

stack overflow的好问题 - java篇

标签:style   blog   http   io   ar   color   使用   sp   java   

原文地址:http://www.cnblogs.com/obean/p/4104093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!