面试题的基础总结------String的应用

                                面试题的基础总结------String的应用

今天去了一家公司面试,问的都是一些字符串的基础问题,由此来总结一下。

1.定义一个String a = “123” , 如何将其化为整型?
答:

            int b = Integer.parseInt(a)     //方法一
            int c = Integer.valueOf(a)      //方法二

通过这道题所引申出来的知识点就是基本类型和字符串的相互转换,上述题是字符串转为基本类型的两种方法。
相反呢?基本类型转化为字符串类型也有三种方法:
①.使用包装类的toString()方法
②.使用String类的valueOf()方法
③.使用空字符 + 基本类型
例: int a = 10 ;

    > String str1 = Integer.toString(a);//方法一 
    > String str2 =String.valueOf(a);//方法二 
    > String str3 = "" + a ;//方法三

2.定义一个String a = “123abc”,如何将a-c提取出来?
答:

            a.substring(3,5)

由此引出来的知识点是字符串常用的方法:

            //返回长度
            str.length()
            //查找ch字符在该字符中第一次出现的位置
            str.indexOf(int ch)
            //同上,查找字符串
            str.indexOf(String str)
            //查找最后一次出现的位置
            str.lastIndexOf(String/int arg)
            //从字符串中取想要的字段
            str.substring(beginIndex,endIndex)
            //去除空格
            str.trim()
            //转化为大写
            str.toUpperCase()
            //转化为小写
            str.toLowerCase()
            //分割字符串
            str.split(String regex,int limit)    //其中的regex的含义是正则表达式

3.String,StringBuffer,StringBuilder的区别

从三点说起:
①.是否可变
②是否多线程安全
③StringBuffer和StringBuilder的共同点

①String类中使用字符数组保存字符串,源码包中这样写道:

private final char value[];  //正因为有final关键字所以才导致了String的不变性,定义了即不可修改.

而StringBuilder与StringBufferd都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

abstract class AbstractStringBuilder implements Appendable, CharSequence{

        char[] value;
}

②String中的对象是不可变的,也就是默认为常量,所以线程安全。
StringBuffer中源码这样写道:

    //方法体上被synchronized这个关键字所限制,也就是意味着这类被调用的方法上被加了同步锁,即使是多线程的情况下也是线程安全的。
    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

那么我们再来看下StringBuilder中:


    //方法体上并没有限制,所以在多线程访问下StringBuilder是非线程安全的
    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

③StringBuilder和StringBuffer两者的共同点
StringBuilder和StringBuffer都是继承自公共的父类AbstactStringBuilder(抽象类)。

如果一个程序不是多线程,那么由此看来StringBuilder的效率要高于StringBuffer,但是若是从线程安全的角度去出发考虑,那么应该选择StringBuffer.

最后再说一下抽象类和接口的区别:

接口:是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法。
一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类(父类),但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

抽象类:程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化。(这里仅仅是看到百度有人说的,我觉得有道理,但正确性不保证),也有人说抽象类不能被实例化是语法约定。

抽象类是对象的抽象,然而接口是一种行为规范。

百度百科—- abstract class 在 Java
语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 在abstract class
中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static
final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。 abstract
class和interface所反映出的设计理念不同。其实abstract
class表示的是”is-a”关系,interface表示的是”like-a”关系。
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。 接口中定义的变量默认是public
static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。 抽象类中的变量默认是 friendly
型,其值可以在子类中重新定义,也可以重新赋值。 接口中的方法默认都是 public,abstract 类型的。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页