1.Java 中都有哪些基本数据类型, 各占几个字节?
2.String 是基本数据类型吗?
String 不是基本数据类型, String 的底层是用数组实现的.
3.String 常用方法有哪些?
length(): 求字符串的长度
indexOf(): 求某个字符在字符串中的位置
charAt(): 求一个字符串中某个位置的值
equals(): 比较两个字符串是否相同
replace(): 将字符串中的某些字符用别的字符替换掉. 形如 replace("abc","ddd"); 字符串中的 abc 将会被 ddd 替换掉.
split(): 根据给定正则表达式的匹配拆分此字符串. 形如 String s = "The time is going quickly!"; str1=s.split(" ");
substring(): 输出一个新的字符串, 它是此字符串中的子串, 形如 substring(3,7); 它将字符串中的第四个第五个第六个输出.
trim(): 将字符串开头的空白 (空格) 和尾部的空白去掉.
format(): 使用指定的语言环境, 格式字符串和参数返回一个格式化字符串.
toLowerCase(): 将字符串中所有的大写改变成小写
toUpperCase(): 将字符串中所有的小写改变为大写
4.String,StringBuffer,StringBuilder 的区别?
1. 可变不可变
String: 字符串常量, 在修改时不会改变自身, 若修改, 等于重新生成新的字符串对象
StringBuffer: 在修改时会改变自身对象, 每次操作都是对 StringBuffer 对象本身进行修改, 不是生成新的对象, 使用场景: 在对字符串经常改变的情况下; 主要方法: append(),insert()等
StringBuilder: 是在 Java5 中引入的, 和 StringBuffer 的方法完全相同, 字符串对象直接对本身进行修改
2. 线程是否安全
String: 对象定义后不可变, 线程安全
StringBuffer: 线程安全, 对调用方法加入同步锁, 执行效率较慢, 适用于多线程下操作字符串缓冲区大量数据
StringBuilder: 线程不安全, 适用于单线程下操作字符串缓冲区大量数据
3. 共同点
StringBuilder 和 StringBuffer 有公共父类 AbstractStringBuilder, 该类是一个抽象类, StringBuilder 和 StringBuffer 的方法都会调用 AbstracStringBuilder 中的公共方法, 如 super.append(), 只是 StringBuffer 会在方法上加 synchronized 关键字, 进行同步.
如果程序不是多线程的, 那么使用 StringBuilder 效率高于 StringBuffer.
5. 字符串如何转基础数据类型? 基础数据类型如何转字符串?
5.1 字符串转基础数据类型:
调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueof(String)
例: String s = "16";
- int a = Integer.parseInt(s);
- int b = Integer.valueof(s);
5.2 基本数据类型转字符串
1. 调用 String 类中的 valueof()方法
例: 将 char 类型的'b'转为字符串
String.valueof('b');
2. 调用基本数据类型的静态方法 toString()
例: 将 Int 类型的 20 转为字符串
String s = Int.toString(20);
3. 将基本数据类型与空字符串连接,+""
例: int i = 200;
String s = i+"";
6. 面向对象都有哪些特性以及你对这些特性的理解?
1)继承: 继承是从已有类得到继承信息创建新类的过程. 提供继承信息的类被称为父类(超类, 基类); 得到继承信息的类被称为子类(派生类). 继承让变化中的软件系统有了一定的延续性, 同时继承也是封装程序中可变因素的重要手段.
2)封装: 通常认为封装是把数据和操作数据的方法绑定起来, 对数据的访问只能通过已定义的接口. 面向对象的本质就是将现实世界描绘成一系列完全自治, 封闭的对象. 我们在类中编写的方法就是对实现细节的一种封装; 我们编写一个类就是对数据和数据操作的封装. 可以说, 封装就是隐藏一切可隐藏的东西, 只向外界提供最简单的编程接口.
3)多态性: 多态性是指允许不同子类型的对象对同一消息作出不同的响应. 简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情. 多态性分为编译时的多态性和运行时的多态性. 如果将对象的方法视为对象向外界提供的服务, 那么运行时的多态性可以解释为: 当 A 系统访问 B 系统提供的服务时, B 系统有多种提供服务的方式, 但一切对 A 系统来说都是透明的. 方法重 (overload) 实现的是编译时的多态性 (也称为前绑定), 而方法重写(override) 实现的是运行时的多态性(也称为后绑定). 运行时的多态是面向对象最精髓的东西, 要实现多态需要做两件事: 1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型(用父类型引用引用子类型对象, 这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为).
4)抽象: 抽象是将一类对象的共同特征总结出来构造类的过程, 包括数据抽象和行为抽象两方面. 抽象只关注对象有哪些属性和行为, 并不关注这些行为的细节是什么.
注意 : 默认情况下面向对象有 3 大特性, 封装, 继承, 多态, 如果面试官问让说出 4 大特性, 那么我们就把抽象加上去.
7. 访问权限修饰符 public,private,protected, 以及不写 (默认) 时的区别?
修饰符 当前类 同 包 子 类 其他包
public √ √ √ √
protected √ √ √ *
default √ √ * *
private √ * * *
8. 抽象类 (abstract class) 和接口 (interface) 有什么异同?
不同点:
抽象类(abstract class):
1. 抽象类可以定义构造器, 成员变量
2. 抽象类中可以有抽象方法, 具体方法, 静态方法
3. 有抽象方法的类必须被声明为抽象类, 而抽象类中不一定要有抽象方法
4. 一个类只能继承一个抽象类
5. 抽象类中的成员可以是 private, 默认的, protected,public
接口(interface):
1. 接口中不能定义构造器, 静态方法
2. 接口中的方法全部都是抽象方法
3. 接口中定义的成员变量实际上都是常量
4. 一个类可以实现多个接口
5. 接口中的成员全都是 public 的
相同点:
1. 都不能被实例化
2. 可以将抽象类和接口类型作为引用类型
3. 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现, 否则该类仍需要被声明为抽象类
9. 重载 (overload) 和重写 (override) 的区别?
方法的重载和重写都是实现多态的方式, 区别在于前者实现的是编译时的多态性, 而后者实现的是运行时的多态性. 重载发生在一个类中, 同名的方法如果有不同的参数列表 (参数类型不同, 参数个数不同或者二者都不同) 则视为重载; 重写发生在子类与父类之间, 重写要求子类被重写方法与父类被重写方法有相同的返回类型, 比父类被重写方法更好访问, 不能比父类被重写方法声明更多的异常(里氏代换原则). 重载对返回类型没有特殊的要求.
方法重载的规则:
1. 方法名一致, 参数列表中参数的顺序, 类型, 个数不同.
2. 重载与方法的返回值无关, 存在于父类和子类, 同类中.
3. 可以抛出不同的异常, 可以有不同修饰符.
方法重写的规则:
1. 参数列表必须完全与被重写方法的一致, 返回类型必须完全与被重写方法的返回类型一致.
2. 构造方法不能被重写, 声明为 final 的方法不能被重写, 声明为 static 的方法不能被重写, 但是能够被再次声明.
3. 访问权限不能比父类中被重写的方法的访问权限更低.
4. 重写的方法能够抛出任何非强制异常(UncheckedException, 也叫非运行时异常), 无论被重写的方法是否抛出异常. 但是, 重写的方法不能抛出新的强制性异常, 或者比被重写方法声明的更广泛的强制性异常, 反之则可以.
10.break 和 continue 的区别?
break 和 continue 都是用来控制循环的语句.
break 用于完全结束一个循环, 跳出循环体执行循环后面的语句.
continue 用于跳过本次循环, 执行下次循环.
Java 基础面试题(1)
来源: http://www.bubuko.com/infodetail-2957556.html