笔试题二(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 成绩: 指导教师:娄嘉 ...
随机推荐
- 2018C语言第二次作业
一.学习内容总结 1.指针是一种数据类型,同样占有空间,其存储的是内存地址: 2.定义指针变量要在变量名之前加“*”字符表示: 3.“&”是取地址运算符,“*”是间接运算符: (注:声名和使用 ...
- 【技术开放日】msup携手HPE揭秘全球测试中心背后的12条技术实践
保证软件产品质量是软件测试永恒的目标. 以控制为出发点的传统IT时代正在快速的向以激活生产力为目的的移动互联时代转变.这不仅是技术的升级,更是思想意识的巨大变革,也对软件技术的发展带来的更高的要求和更 ...
- HDU 4734 - F(x) - [数位DP][memset优化]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...
- Kettle 4.2源码分析第四讲--KettleJob机制与Database插件简介(含讲解PPT)
1. Job机制 一个job项代表ETL控制流中的一项逻辑任务.Job项将会顺序执行,每个job项会产生一个结果,能作为别的分支上job项的条件. 图 1 job项示例 1.1. Job类图简介 图 ...
- CCCC L2-017. 人以群分 贪心
https://www.patest.cn/contests/gplt/L2-017 题解:贪心,一点小数学 坑:XJB改下标改错了 #include <iostream> #includ ...
- SAPI
https://en.wikipedia.org/wiki/Server_Application_Programming_Interface In computing, Server Applicat ...
- AppFog使用
cd ‘你的应用目录’ af login(之后输入你的邮箱和密码) af update ‘你的应用名’ 相关文档:https://docs.appfog.com/getting-started/af- ...
- git快速入门 push/clone/reset/merge/切换分支全都有
本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...
- linux上mysql安装详细教程
所有平台的MySQL下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. MySQL - MySQL服务器.你需要该选项,除非你只想连接运行 ...
- 008-插件方式启动web服务tomcat,jetty
一.pom引入 1.tomcat7 <!-- tomcat7 --> <plugin> <groupId>org.apache.tomcat.maven</g ...