目录
-
Java基础
-
-
Java的特点
-
基本数据类型和引用类型
-
-
自动装箱与拆箱
-
数据类型之间的转换
-
String类常用方法
-
是否可以继承String类?
-
String 是基本数据类型吗?
-
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
-
Integer 与 int 的区别
-
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
-
String 是最基本的数据类型吗?
-
String s = new String(“xyz”);创建了几个 String Object? 二者之间有什么区别?
-
数组有没有 length()这个方法? String 有没有 length()这个方法?
-
下面这条语句一共创建了多少个对象:String s=”a”+”b”+”c”+”d”;
-
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
-
char 型变量中能不能存贮一个中文汉字?为什么?
-
String,StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?
-
字符型常量和字符串常量的区别
-
用最有效率的方法算出 2 乘以 8 等於几?
-
-
==和equals的区别
-
一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
-
循环结构
-
继承与多态
-
修饰符
-
保留字、关键字、修饰符
-
重写与重载
-
抽象类与接口
-
“==”和 equals 方法究竟有什么区别?
-
静态与实例
-
Java的反射机制
-
构造对象
-
如何理解clone对象
-
Java中的异常处理
-
Java中的IO流
-
-
Java集合
-
-
List,Set,Map的区别?
-
ArrayList和LinkedList的区别
-
关于RandomAccess接口
-
ArrayList与Vector的区别,为什么要用ArrayList取代Vector呢
-
HashMap和HashTable区别
-
HashMap和HashSet区别
-
HashSet如何检查重复
-
HashMap多线程操作导致死循环问题
-
ConcurrentHashMap于HashTable的区别
-
Comparable和Comparator的区别
-
Collection 框架中实现比较要实现什么接口
-
List, Set, Map 是否继承自 Collection 接口?
-
Collection 和 Collections 的区别。
-
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它
-
两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?
-
-
多线程
-
-
简述线程,程序,进程的基本概念以及关系
-
线程有哪些基本状态?
-
并发和并行的区别
-
为什么使用多线程
-
什么是上下文切换?
-
什么是线程死锁?如何避免死锁?
-
说说sleep()和wait()方法的区别和共同点?
-
为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
-
synchronized关键字
-
volatile关键字
-
synchronized和volatile的区别
-
多线程实现的四种方式
-
同步和异步有何异同,在什么情况下分别使用他们?举例说明。
-
多线程有几种实现方法?同步有几种实现方法?
-
启动一个线程是用 run()还是 start()? .
-
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?
-
简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
-
-
JVM
Java基础
Java的特点
面向对象和面向过程的区别
-
面向过程:
面向过程是一种以过程为中心的编程思想。面向过程的性能比面向对象高,因为类的调用需要实例化,开销大,比如单片机,嵌入式开发等一般都采用面向过程开发。 -
面向对象:
因为对象具有封装,继承,多态的特性,所以面向对象易维护,易复用,易扩展,可以设计出低耦合,更灵活和更易维护的系统。
面向对象的特性以及你对这些特性的理解
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
-
多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调
用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西。 - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
注意:默认情况下面向对象有 3 大特性,封装、继承、多态,如果面试官问让说出 4 大特性,那么我们就把抽象加上去
Java语言的特点
- 面向对象(封装,继承,多态);
- 平台无关性(Java虚拟机实现平台无关性);
- 支持多线程(与C++相比,Java语言提供了多线程支持);
- 支持网络编程;
- 编译与解释并存;
- 可靠性;
- 安全性;
Java和C++的区别
- 都是面向对象的语言,都支持封装,继承和多态;
- Java不提供指针来直接访问内存,程序内存更安全;
- Java的类是单继承,而C++支持多继承;虽然Java的类不可以多继承,但接口可以多继承;
- Java有自动内存管理机制,不需要程序员手动释放无用内存;
- 在C语言中,字符串或者字符数组的最后都会有一个‘\0’来表示结束。但在Java语言中没有结束符这一概念。
什么是Java程序的主类,应用程序和小程序的主类有什么不同?
一个程序中可以有多个类,但只能有一个类是主类。主类是Java程序执行的入口点。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承来自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。
应用程序是从主线程启动的(即main()方法),而applet小程序中没有main()方法,主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。
import java和javax的区别
JavaAPI所必需的包是java开头的包,javax当时只是扩展API包来使用。随着时间推移,javax逐渐地扩展为Java API的组成部分。但是将javax包移动到java包会消耗大量时间和会破坏一堆现有的代码。最终决定javax包将成为API的一部分。
获取用键盘输入常用的两种方法?
- 方法一:通过Scanner
Scanner input = new Scanner(System.in);
String str=input.nextLine();
input.close();
- 方法二:通过BufferedReader
BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
String str=input.readLine();//readLine()需要throws IOException
input.close();
基本数据类型和引用类型
自动装箱与拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型
装箱和拆箱操作发生在引用类型与值类型之间转换。
数据类型之间的转换
(1)字符串如何转基本数据类型?
调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型。
(2)基本数据类型如何转字符串?
一种方法是将基本数据类型与空字符串(“”)连接(+)即可获得其所对应的字符串;另一种方法是调用 String
类中的 valueOf()方法返回相应字符串。
String类常用方法
是否可以继承String类?
String类是final类,不可以被继承。
String 是基本数据类型吗?
String 是引用类型,底层用 char 数组实现的。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 语言的方法调用只支持参数的值传递。
Integer 与 int 的区别
int 是 java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装类,Integer 是 java为 int 提供的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况。
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是地板,该方法就表示向下取整,Math.floor (11.6)的结果为 11,Math.floor (-11.6)的结果是-12;最难掌握的是 round 方法,它表示“四
舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)
的结果为 12,Math.round(-11.5)的结果为-11。
String 是最基本的数据类型吗?
基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。
java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类
String s = new String(“xyz”);创建了几个 String Object? 二者之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String 每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新 String 对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
数组有没有 length()这个方法? String 有没有 length()这个方法?
数组没有 length()这个方法,有 length 的属性。String 有 length()这个方法。
下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;
答:对于如下代码:
String s1 = “a”;
String s2 = s1 + “b”;
String s3 = “a” + “b”;
System.out.println(s2 = = “ab”);
System.out.println(s3 = = “ab”);
第一条语句打印的结果为 false,第二条语句打印的结果为 true,这说明 javac 编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,
上面的代码应该只创建了一个 String 对象。
String s = “a” + “b” + “c” + “d”;
System.out.println(s == “abcd”);
最终打印的结果应该为 true。
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,
再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处
理,因此可以正确编译。
char 型变量中能不能存贮一个中文汉字?为什么?
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字节,所以,char 类型的变量也是占用两个字节。