Java知识点不断更新、完善,如有错误请留言
1. Java的特点:面向对象,跨平台,健壮,安全
2. Java的三个体系:Java SE(Java Platform,Standard Edition)标准版,定位在桌面应用程序(客户端程序),是其余两个平台的基础;Java ME(Java Micro Edition )微缩版,定位在移动设备电子产品的开发;Java EE(Java Enterprise Edition)企业版,定位在大中型的企业级应用。
3. JDK是Java语言开发包,可以将.java文件编译为可执行的Java程序。JRE即Java运行环境。JVM (Java Virtual Machine)。JVM是在一台计算机上由软件或硬件模拟的计算机。读取并处理经编译过的平台无关的字节码class文件 。JDK包含JRE,JRE包含JVM。
4. Java中的八种基本类型:byte(1字节=8位),short(2字节=16位),int(4字节=32位),long(8字节=64位),float(4字节=32位),double(8字节=64位),char(2字节=16位),boolean。
5. 基本数据类型之间的转换规则:(1)高精度的数值赋值给低精度的变量需要强制类型转换;(2)浮点数的数值赋值给整数的变量需要强制类型转换(取整!!!);(3)不同类型的数值参与计算,首先低精度自动往高精度转换,类型一致后再进行计算
6. Java中的运算符:算术操作符(+,-,*,/,%(取余));赋值运算符(=,+=,-=,*=,/=,%=);比较运算符(>,<,>=,<=,==,!=);逻辑运算符(&&(逻辑与),||(逻辑或),!(逻辑非));自增(++)和自减(--)运算符;三目操作符:结果值=(条件)?值1:值2
7. switch分支语句中类型必须是byte,short,int,char
8. While语句和do while语句的区别:While语句是先判断再执行,do while语句是先执行再判断。当条件判断为false的时候,While语句不会被执行。而do while至少执行一次。
9. 算法之冒泡排序:两两比较,大的排后边。大的排后边以后就不用管了,进入下一轮比较。
10.算法之直接插入排序:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部排序完为止。
11.算法之递归:方法调用自身就是递归。
12.怎样设计递归算法:确定递归公式;确定边界(终了)条件。
13.递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法的运行效率较低。所以一般不提倡用递归算法设计程序。
14.基本数据类型数组没有赋值的时候,整型的数组默认是0;浮点类型数组是0.0;布尔类型的数组是false;字符类型的数组默认是'\u0000';类类型的数组没有赋值的时候,默认是null
15.局部变量和成员变量的区别: 1。作用域不同 2。初期值不一样,局部变量必须在使用前进行初期化,成员变量系统会默认初期化;3。内存里布局不一样,局部变量是放在栈内存里面,成员变量是放在堆内存里面。
16.构造函数的特点:1.构造函数名和类名相同;2.没有返回值,也不用加void关键字;3.在创建实例时被调用。
17.构造函数的作用:1。创建对象;2。初始化成员变量
18.构造方法的注意点:如果创建类的时候没有构造函数,系统会默认给你指定一个构造函数,并且是无参数的,没有任何语句。如果有自定义的构造函数,java就不提供默认的构造方法.如果想用默认的构造函数,自己添加一下。
19.构造方法的分类:默认构造方法和自定义构造方法
20.引用和实例的关系:一个引用可以指向0个或1个实例;一个实例可以由多个引用指向它
21.关键字static:static可以修饰变量,方法和静态块。被static修饰的成员变量属于类,称为类的静态变量,也被称为类变量。可以通过“类名.成员变量名”的方式调用。所有对象共享类的静态变量,这时也可以通过“对象.成员变量名”的方式调用。但是任何对象对类变量的修改都会反映到其他对象的应用上。类的静态变量,在类加载内存时,没有创建对象的时候就已经分配了空间。
22.声明为static的方法有以下几条限制:1。它们仅能调用其他的static 方法;2。它们只能访问static属性;3。它们不能以任何方式引用this 或super。
23.静态块:有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块。 静态代码块是主动执行,并且只执行一次。静态方法是被动执行。每次创建对象的时候,都会加载非静态代码块.
24.关键字(final):(1)被final修饰的变量是常量,赋值以后就不能修改;(2)被final修饰的方法不能被重写;(3)被final修饰的类不能被继承,例如String类。
25.为什么static和final通常连用? 回答:static和final的意义是不一样的。static修饰的变量是静态的, final修饰的变量只能赋值一次。它们连用的时候是因为定义的变量既要是静态的,又需要它的值不能修改。这样定义成static final以后,内存就不用重复的申请和释放空间。interface里的变量就是默认用public static final修饰的。
26.StringBuffer和StringBuilder的区别:StringBuffer支持并发操作,保证线程安全,适合多线程。StringBuilder不支持并发操作,不能保证线程安全,适合单线程。单线程适用前提下StringBuilder比StringBuffer速度快。
27.String类的常用方法:length();charAt(i);toLowerCase();toUpperCase();trim();substring(int beginIndex);startsWith(String str);endsWith(String str);equals();equalsIgnoreCase();indexOf();split();compareTo();valueOf()
28.方法重载:一个类里面,方法的名字一样,但参数不一样(1。参数的个数不一样 2。参数的类型不一样)。注意:不比较方法的返回值和形参的变量名
29.成员变量隐藏:子类声明的成员变量名字和父类继承来的成员变量名字相同,子类就会隐藏所继承的成员变量。
30.方法重写(override):在子类中可以根据需要对父类中继承的方法进行重写。重写方法必须和被重写的方法具有相同的方法名字,形参列表和返回类型。重写方法不能使用比被重写的方法更严格的访问权限。
31.有继承关系的类的初始化顺序:1。父类静态成员和静态初始化块,按在代码中出现的顺序依次执行;2。子类静态成员和静态初始化块,按在代码中出现的顺序依次执行;3。父类非静态代码块,按在代码中出现的顺序依次执行;4。父类的构造方法;5。子类非静态代码块,按在代码中出现的顺序依次执行;6。子类的构造方法
32.继承中的构造方法:1.子类对象构造的过程中必须调用父类的构造方法;2.子类可以在自己的构造方法中使用super(形参列表)调用父类的构造方法(2.1 使用this(形参列表)调用本类的另外的构造方法,2.2如果使用super,必须写在子类构造方法的第一行);3。如果子类没有显示的调用父类的构造方法,则系统默认调用父类无参的构造方法;4。如果子类既没有显示的调用父类的构造方法,而父类总又没有无参的构造方法,则编译出错。
33.面向对象:面向对象是一种编程思想. 在java中,万事万物皆对象。
34. 面向对象编程: 编程过程中,所有操作都是对对象的属性和方法的操作
35.类:是现实世界一个抽象的概念,可以看成描述一类对象的模板
36.对象:类的具体实例
37.实例:程序使用类创建对象时,生成的对象叫做类的实例(instance)
38.==: 对基本类型的数据而言,==比较的是两边的值,即==号两边的值是否相等;而对引用来说,==比较的是两边的地址,即比较==号左右两边的引用是否都指向同一个堆中的实例
39.java的值传递问题:基本数据类型传递的是实实在在的值;类类型传递的是地址(引用).
40.this:表示当前使用的这个对象.this可以出现在构造方法和实例方法中,但不可以出现在类方法(静态)中。
41.super:java利用关键字super来引用父类的成员变量和方法
42.什么是封装?(1)Java将相关的变量和方法封装到类中。(2)Java通过可见性来实现封装。对外提供方法供外界主动调用,对内隐藏数据以防止不合理的破坏性修改。
43.可见性(访问限制修饰符):private,protected,public 可见性和继承完全没有关系!!!
44.对象转型(casting):上转型就是一个父类的引用指向子类的对象。如果子类重写了父类的方法,则上转型对象调用的是子类重写的方法!!!!如果子类重写了父类的静态方法,则上转型对象调用的是父类的静态方法!!!!
45.动态绑定:是指执行期间(而非编译期)判断引用对象的实际类型, 根据实际的类型去调用相应的方法。是实现多态的技术.
46.多态的分类:继承多态(方法重写)和类内部多态(方法重载)
47.继承多态存在的三个条件:1。要有继承 2。要有方法重写 3。父类引用指向子类对象。
48.关键字:abstract:用abstract修饰的类称为抽象类。用abstract修饰的方法称为抽象方法。含有抽象方法的类必须声明为抽象类,抽象类必须被继承,抽象方法必须被重写。抽象方法只需要声明,而不需要实现。抽象类中可以由抽象方法,也可以有实例方法。抽象类不能被实例化。抽象类中有构造方法。抽象类的作用:用来设计,用来被继承。
49.接口:使用interface来定义一个接口。接口中没有构造方法,不能创建对象。接口体里包含常量和抽象方法两个部分。接口里的成员变量只能是public static final类型的常量。接口里的方法必须都是抽象方法,默认被public abstract 修饰。在类中实现接口可以用关键字implements.一个类可以实现多个接口。
50.接口的回调:接口变量可以指向实现了该接口的类创建的对象。通过接口变量就可以调用被类实现的接口的方法。例如:集合的运用。
51. 基本数据类型的包装类:char Characte;int Integer 作用:在堆中封装成一个一个对象,并提供操作方法,能简化代码.
52. 自动打包(装箱),自动解包(拆箱)(jdk1.5以后):自动打包:把基本数据类型转换为对象自动解包:把对象转换为基本数据类型
53. 为什么要用集合?因为数组有以下缺点:每次创建都要指定长度;效率比较低,且操作比较麻烦。
54. java的集合体系:6个接口和一个工具类,位于java.util包下。6个接口:Collection,List,Set,SortedSet,Map,SortMap一个工具类:Collections 可以对集合进行排序。
55. Collection:是集合的一个顶级接口,定义了存取一组对象的方法,其子接口Set和List分别定义了对对象的存储方式。
56. Set:继承于Collection,数据没有顺序并且不可以重复 实现类:HashSet SortedSet的实现类是TreeSet
57. List:继承于Collection,数据有顺序并且可以重复。实现类:ArrayList和LinkedList
58. Map:是一组成对的键(key)-值(value)对象。实现类:HashMap SortedMap的实现类是TreeMap
59. 泛型:可以指定集合中存储的数据类型,在编译器检查时候,强烈建议使用泛型。泛型在JDK1.5以后才可以用
60. 异常的体系结构:Throwable类是异常的顶级父类。在java抛出的是异常的对象。地下是Error(错误类):是程序本身无法处理的错误。Exception(异常类):是程序本身可以处理的异常。
61. 异常类和错误类的区别:异常能被程序本身可以处理,错误是无法处理。
62. finally块不会被执行:(1)在finally语句块中发生了异常。(2)在前面的代码中用了System.exit()退出程序。(3)程序所在的线程死亡。(4)关闭CPU
63. Java的异常处理的5个关键词:try、catch、throw、throws和finally
64. 自定义异常的步骤:(1)创建自定义异常必须继承Exception异常类;(2) 在方法中通过throw关键字抛出异常对象;(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。;(4)在出现异常方法的调用者中捕获并处理异常。
65. java常见异常:1.ArrayIndexOutOfBoundException:数组下标越界异常,常发生在数组下标小于零或大于数组长度时。;2.NullPointerException:空指针异常。引用指向的对象为空时发生。;3.ClassCastException:类转化异常。常发生在类型转化错误时。4.IllegalArgumentException:非法参数异常。通常在函数参数非法时由程序主动抛出;5.NumberFormatException:数字转化异常,如用Integer.parseInt方法转化非法字符串为数字时。;6.ArithmeticException:算术异常,如除零时。
66. File类:用于描述文件系统中的一个文件或目录。常用方法:getName()获取文件或目录的名字;length()获取文件的大小 以字节为单位;lastModified()获取文件的最后修改时间 毫秒值;getPath()获取当前文件或目录的路径,以字符串形式返回;exists()判断当前File对象描述的文件或目录是否存在;delete()删除文件或目录;isFile();isDirectory();File[] listFiles()获取当前目录下的所有子项,返回file对象的数组;String[] list()返回当前目录下子项的名字,以字符串数组形式返回;createNewFile()
67. Java的I/O体系:字节流(输入流:java.io.InputStream;输出流:java.io.OutputStream);字符流(输入流java.io.Reader,输出流java.io.Writer)
68. 字符流常用的类:FileReader,FileWriter ,BufferedReader,BufferedWriter字节流常用的类:FileInputStream,FileOutputStream,BufferedInputStream,BufferedBuffered
69. append和write方法的区别:1.append可以添加null的字符串,输出为"null“;2.而write不可以添加null的字符串
70. 进程和线程:进程:是程序的一次动态执行过程;线程:操作系统能够进行运算调度的最小单位,是进程的执行单位.
71. 线程的创建和启动:1。继承与Thread类,重写run()方法;2。实现Runnable接口.线程启动需要创建一个Thread的对象,并且调用start()方法。
72. 线程安全:多个线程去访问一个资源的时候,需要保证数据的同步。单线程一定是安全的。
73. 非线程安全:多个线程去访问一个资源的时候,不能够保证数据的同步
74. 如何保证多线程安全:给方法或代码块加上同步,用关键字 synchronized 1。方法锁(同步方法);2代码块锁(同步代码块)
75. 造成死锁的两种原因:1。synchronized修饰run函数,run()函数中有一个无限循环,一个线程进入后会在其中往复操作,这使它永远不会放弃对this的锁定,结果导致其它线程无法调用;2.两个线程都要获得两个对象的锁定才能执行实质性操作,但运行起来却发现其它线程持有了自己需要的另一个锁定,于是停在Wait Set中等待对方释放这个锁定,结果造成了死锁。
76. 解决死锁的办法:1.某线程持续不退出同步函数会造成死锁.解决方法是去掉或更换不正确的同步锁;2.两个线程都等待对方释放自己需要的资源也会造成死锁.这种情况的解决方法是确保同步锁对象的持有顺序。
77. 为什么要使用内部类:1。内部类方法可以访问该类定义所在的作用域中的数据,包括私有变量。 2。内部类可以对同一个包中的其它类进行隐藏。
78. 内部类的分类:1。静态内部类(开发中用的非常少); 2。非静态内部类(成员内部类,方法内部类,匿名类(继承式匿名内部类,接口式匿名内部类,参数式匿名内部类))
79. 构造器Constructor是否可被override: 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载.
80. 是否可以继承String类: String类是final类故不可以继承
81. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后 答:会执行,在return前执行
82. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 答:1,对String类来说,重写了equals,hashCode两个方法,因此字符串内容相等的话,就会有相同的哈希码。这句话是不对的。2。但是对于其他类来说,如果没有重写equals,hashCode两个方法的话,Object类的equals方法比较的是引用,这样的话x和y应该有相同的哈希码。
83. Object类的equals方法比较的地址,即两个引用是否指向同一个实例。但是String类重写了equals方法,比较的是字符串的内容。
84. Sleep()和wait()的区别:1。Sleep()不释放同步锁,wait()释放同步锁;2。Sleep()自动醒来,时间不到可以用interreput来强行打断,wait()可以用notify()直接唤醒;3。Sleep()来源于类Thread,wait()来自原Object;4.wait,notify和notifyAll只能在同步方法或者同步块里面用,而sleep可以在任何地方使用;5。Sleep必须捕获异常,而.wait,notify和notifyAll不需要捕获异常。
85. 设计模式:是一套被反复使用,多数人知晓的,代码设计经验的总结。
86. 为什么要使用设计模式:是为了代码复用,让代码更容易让他人理解,保证代码的可靠性。
87. 单例模式:保证系统中一个类只有一个实例,可以有效节约CPU资源.
88. 单例模式的好处:1。某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销; 2。省去了new操作符,降低了系统内存的使用频率,减轻GC压力;3。安全性
89. 工厂模式的实现:1。工厂方法的具体做法是让子类实现一个统一的接口;2。工厂类根据输入的参数生成具体子类的实例,返回类型用接口变量来接
90. 工厂模式的分类:1。普通工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建;2。多个工厂方法模式:对普通工厂模式的改进,在普通工厂模式中,如果传递的字符串出错,则不能正确地创建对象。;3.静态工厂方法模式:将上面的多个工厂模式里的方法变成静态的,不需要创建工厂的实例,直接调用即可。
91. 工厂模式的问题:类的对象的创建依赖于工厂类,如果想要拓展程序,必须对工厂类进行修改。
92. 抽象工厂模式:抽象工厂类:创建多个工厂类,一旦需要增加新的功能,直接增加工厂类就可以了,不需要修改之前的代码。
93. 继承的概念: 新定义的类从已有的类中获取属性和方法,这个已有的类叫父类(超类,基类),从这个父类获取属性和方法的类叫子类. 通过继承有以下的优点: 1.代码具有可重用性; 2.程序设计变得更加简洁和灵活
94. 多态的概念: 同一事件发生在不同对象上会产生不同的结果