笔试题二(java面向对象、多线程、集合)
1.final关键字的特点
final修饰变量时,在堆内存中的地址是不变的,但对象的内容是可变的。//思考,找例子
2.静态变量的特点
实例变量是用对象引用,要先实例化对象,而静态变量属于类,只要类加载了,就可通过类名
直接调用。
3.静态方法(一块内存,且内存共享)是否可以调用非静态方法?
不可以,会报错,而非static方法是可以访问静态方法的。
//写个例子,一个main方法一个普通方法一个静态方法
4.equals与==的区别
equals是判断两对象内容相等,==是判断值是否相等,
如果判断引用类型(比如String或其它引用类型)则判断内存地址是否相同。
//看以往的笔记或找例子
/*字符串比较*/
public class StringCompareTest {
public static void main(String[] args) {
String s1 = "abc中文";
String s2 = "abc中文";
String s3 = new String("abc中文");
System.out.println(s1 == s2);//true,在常量池中有同一块空间,因为内容相等,所以不会再申请
System.out.println(s1.equals(s2));//true
System.out.println("----------");
System.out.println(s1 == s3);//false
System.out.println(s1.equals(s3));//true
}
}
5.equals与hashCode的区别与关系。
比如为什么它们之间存在着充分不必要关系?另外,…
6.int和Integer的区别?
Integer是引用类型,默认值是null,而int是值类型,默认值为0,Integer是
int的包装类型。
7.private变量是否可以被继承?父类的private方法是否可以被子类调用?
//写个例子
public class Father {
private String name;//私有属性
private char sex;
public void tell(){
System.out.println(name+sex);
}
private void speak(){
System.out.println(name+"is speaking!");
}
public class Child extends Father {
}
/**
* 定义测试类
* @author CBS
*/
public class Test {
public static void main(String[] args) {
Child c=new Child();
c.tell();//tell方法是可以用的
//c.speak();//报错,父类的私有方法不可见
}
}
//子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的,父类的私有方法不可以直接被使用。
9.private/public/default/protected的区别?
private的权限最小,可以理解为当前类权限。‘4’
public的权限最大,跨类甚至跨包访问。‘1’
protected不可以跨包访问,所以也近似包权限,但可以访问不同的子孙‘2’
default(有的也用friendly表示),可以理解为包权限。‘3’
10.重写和重载的区别?
重载是同一个类中,方法名相同,但参数类型或个数不同,与返回值无关。
重写是多个类中,产生继承的关系,父类与子类的方法相同,一般情况下
子类的访问权限大于等于父类的权限。
//以前书上看过重载是编译时多态,重写是运行时多态.正确.
11.接口和抽象类的区别?
区别:定义接口的关键字是interface 定义抽象类的关键字是abstract
接口中的成员不能私有,抽象类可以。
接口中定义的成员,是final public static类型,抽象类没有。
接口中不能有普通方法,抽象类可以有。
抽象类不可以修饰属性和构造方法。
public abstract class Person{
private String name;
private int age;
private char gender;//不能用abstract来修饰属性
public Person(){//不能用abstract来修饰它
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public void print(){
System.out.print(...);
}
public abstract void learn();//无方法体,不能有大括号
}
public interface USB{
void init();
}//写一个接口
public class Udisc implements USB{
//重写init方法,用implements来实现接口的方法体
@override
public void init(){
System.out.print("U盘初始化");
}
}
public class Test{
public static void main(String[] args) {
Udisc a=new Udisc();
a.init();
}
}
相同:
两个都不new但接口与抽象是面向对象的必备知识,设计模式、重构
代码有必然作用。
final, finally, finalize的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,
类不可继承,内部类要访问局部变量,局部变量必须定义成fianl类型。
finally是异常处理的一部分,总是执行。
finalize是Object类中的一个方法,在垃圾回收器执行的时候回调用被
回收对象的此方法,可以覆盖此方法提供垃圾的其他资源回收,例如
关闭文件等。JVM不保证此方法总被调用。
String、StringBuffer与StringBuilder区别
1.String字符串常量,速度最慢
2.StringBuffer字符串变量(线程安全),速度次之
3.StringBuilder字符串变量(非线程安全),速度最快
所有的类都继承与object类的直接子类有哪些?object类常用的方法
有哪些?
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用
该方法,否则抛出CloneNotSupportedException异常。
2.getClass方法(复习一下几种获得Class的方法)
final方法,获得运行时类型。
1)调用Object中的getClass()
Class c1=x.getClass();
2)用Class类的forName()静态方法获得与字符串对应的Class对象。
Class c2=Class.forName(“java.lang.String”);
3)用“类型名.class”获取该类型的Class对象。例如:
Class c1=Manage.class;
Class c2=int.class;
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放内存资源,因为无法确定该方法什么时候被调用,很少
使用。
5.equals、hashCode方法
6.toString方法
7.notify、notifyAll、wait方法
8.数组有没有length()方法?String有没有length()方法?
数组无length()方法,有length属性,String有length()方法
String[] aaa=new String[]{“sa”};
aaa.length;
String str=“aaaa”;
str.length();
7.hashCode方法
该方法用于hash查找,重写equals方法和hashCode方法,该方法具有
哈希功能的Collection中用到,一般必须满足obj1.equals(obj2)=true;
可以推出obj1.hash()-Code()=obj2.hashCode(),但是hashCode相等
不要满足equals。不过为了提高效率,应该尽量使上面两个条件接近
等价。
8.
1.if(usename. equals(“zxx”)){ }
//如果usename=null时,则会报空指针错误,可以改为zxx.usename??
2.int x=1;
return x==1? true:false;
9.String是类,不是基本数据类型,算是引用数据类型
10.运行时异常和一般异常的区别
运行时异常是运行时出现异常,而一般异常是编译的时候出现异常
11.请你写出5个runtime Exception。
空指针、数组越界、ClassCastException(找不到类)
//查一下
12.什么是多线程?
在一个应用程序中,同时,有多个不同的执行路径(像树的结构)。
13.说一下多线程的好处?
提供程序效率;并发执行,可以给人更真实的感受,比如一个网页既有图片又有
文字,如何同步呢?如果用到线程给人的感官就更真实了。
14.线程和进程有什么区别?
线程是进程的一条执行路径,而进程是线程的集合,另外,程序是静态的可触发的进程。
15.什么是线程同步、异步?
线程同步表示,当前线程执行完后下一个线程接着执行。
线程异步表示,在一个应用程序中,同时,有多个不同的执行。
16.线程之间如何同步?
线程之间同步使用synchronized、wait、notify。
//多做题,多自己动手写代码练习,学习过程一定要有个输入输出的过程。
//找个例子
public class Bank {
private double[] accounts;
private int amounts;
public synchronized void transfer(int from, int to, int amount) throws InterruptedException{
while (accounts[from]<amounts){
wait();
accounts[from]-=amount;
accounts[to]+=amount;
notifyAll();
}
}
public synchronized double getTotalBalance(){
}
}
17.什么是线程不安全?
就是在多个线程共享同一个数据受到其他线程的干扰,出现访问
错误或死锁。如何解决:使用线程同步技术,用上锁(synchronized),
让一个线程执行完了,再让另个线程执行。
18.如何创建一个线程?
方法一:继承Thread,重写run方法,启动一个线程用start();
方法二:实现Runnable接口,重写run方法,启动一个线程用
start();
//找个例子
public class ThreadTest extends Thread {
public void run(){
for (int i=0;i<100;i++){
Thread a=new ThreadTest();
System.out.println("ThreadTest"+i);
}
}
}
public class MyRunner implements Runnable {
public void run(){
for (int i=0;i<100;i++){
System.out.println("MyRunner"+i);
}
}
public static void main(String[] args) {
MyRunner mr=new MyRunner();
Thread thread2=new Thread(mr);
}
}
19.是用Runnable接口好?还是继承Thread更好?
是用Runnable接口更好,因为它可以实现多继承,可以共享变量资源。
20.sleep()和wait()有什么区别?
a、sleep是让当前线程指定休眠时间,然后继续工作,不释放
锁。//(Thread.sleep(1000);)
b、让当前线程wait则是等待,直到有线程通知notify()唤醒
它才会重新工作,释放锁。//this.wait(); this.notify();
21.集合的框架结构图
1)它的框图记住没?里面的一些相似概念的区分呢?
ArrayList是查询较快(底层是通过数组实现的,数组的默认长度为10),增删较慢,而LinkList由于内部是双链表,所以插入删除较快,查询效率低。(找个例子,或者看看书)
22.说一下HashMap底层实现方式?
HashMap是由数组+链表组成
23.ArrayList和Vector的异同?
相同点:这两个类都是实现List接口的(List接口继承了Collection接口),
它们都是有序的,相当于是一个动态数组,易于索引,且数据可以重复。
不同点:Vector相对于ArrayList是相对安全的,因为它是同步的,且
它增加了一个可以返回枚举类型的数据的方法(看蓝白书)。还有数据增长....(看宝典)
24.HashMap和HashTable的区别
HashMap和HashTable都属于Map接口下的,
区别同上,HashMap相比HashTable是不安全的。(看之前的博客)
25.Collection和Collections的区别是什么?
Collection是集合类的上级接口,继承于它的接口主要有Set和List,
Collections是针对集合类的一个帮助类,它提供了一系列的静态方法
实现了集合的排序,搜索和线程的安全等操作。
26.Set里的元素是不能重复的,那么用什么方法区分重复与否?
用==还是用equals()?它们的区别?
元素是否相当用equals(找例子,看书)
27.HashMap的底层实现是用链表加数组实现的,它的put方法是通过
取模长度来得到这个下标的,一旦下标相同就会使用链表。
28.请说下Iterate的作用
迭代器可以实现Collection接口的方法,所以一个一个地获取集合中的
元素,在遍历集合是,可判断是否还有下一元素。(找个例子)
29.HashSet和TreeSet的区别?什么时候用它们?
HashSet中元素不能重复,无顺序,TreeSet中的元素,但有顺序,
遍历集合中的元素排序是,用TreeSet,一般情况下用HashSet因为
不需要排序,速度比TreeSet块。
30.什么是泛型?怎么使用?有什么好处?
答:定义一个集合时,可以特意定义一个类型,可以强制转换。
31.for—each是强循环,一般用来遍历数组和集合。
32.HashMap和HashTable的区别?
HashMap的键值对可以为空
HashTable的键值对不可以为空,线程安全。
33.Collections 的6个方法,并详细解释
34.集合和数组的优缺点
集合可以无限添加,集合什么类型都可以装,数组长度固定,
而且只能装单一类型。
笔试题二(java面向对象、多线程、集合)的更多相关文章
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- 【笔试题】Java笔试题知识点
Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...
- 20155303 实验二 Java面向对象程序设计
20155303 实验二 Java面向对象程序设计 目录 一.单元测试和TDD 任务一:实现百分制成绩转成"优.良.中.及格.不及格"五级制成绩的功能 任务二:以TDD的方式研究学 ...
- 20155234 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20145213《Java程序设计》实验二Java面向对象程序设计实验报告
20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...
- 20145113 实验二 Java面向对象程序设计
20145113 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 1.初 ...
- JAVA课程实验报告 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
随机推荐
- centos 安装laravel
1.下载composer并全局安装 curl -sS https://getcomposer.org/installer | php 2.查看全局命令目录 echo $PATH 移动composer到 ...
- Memcached 简单利用和简单了解(Mac的安装和使用)
Memcached 是一种用于分布式应用的一种缓存机制.应用也比较广泛.这里来学习一下. 首先Memcached 是分布式网站架构都需要用到的缓存机制.缓存就是服务器利用多余的空间上开辟了一个储存空间 ...
- 基于元胞自动机NaSch模型的多车道手动-自动混合驾驶仿真模型的Matlab实现
模型的建立基本来自于:http://www.doc88.com/p-2078634086043.html 花了一天半的时间用新学会的matlab实现了一下. ───────────────────── ...
- Unity事件处理机制与NGUI事件机制
1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个 ...
- CCCC L2-002. 链表去重
https://www.patest.cn/contests/gplt/L2-002 模拟一个链表的去重操作 题解:别模拟了,直接用内置的list和map.关于输出的地址,直接用pair存地址和值,输 ...
- cordova 跨平台APP版本升级
利用cordova+ionic开发好项目,之后就是打包发布,在这之前,还要做一个版本升级的小功能. 首先我们项目根目录里自然少不了配置:config.xml中 如图.version,我们以后每次升级A ...
- Can you answer these queries?---hdu4027
题目链接 有n个数:当操作为1时求L到R的和: 当操作为0时更新L到R为原来的平方根: 不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底 ...
- 常用社交网络(微博等)动态新闻(feed、新鲜事)系统浅析(转)
add by zhj:同时也看看国外牛逼公司是怎么做的吧 Stream-Framework Python实现的feed Twitter 2013 Redis based, database fa ...
- table的td的1%
使用media-obj和media-bd类似的样式,大多数采用的是display: table-cell(即是table中td)来实现.当然设置display是不够,还要根据情况设置width.如下面 ...
- javaScript高级教程(三) javaScript不支持关联数组,只是语法上像关联数组
1.在js中所有要素都是继承自Object对象的,任何对象都能通过obj['name'] = something的形式来添加属性,相当于obj.name=something. 之所以设计中括号这种存取 ...