JavaSE知识点总结个人整理Word格式文档下载.docx

上传人:b****5 文档编号:18921170 上传时间:2023-01-02 格式:DOCX 页数:19 大小:116.13KB
下载 相关 举报
JavaSE知识点总结个人整理Word格式文档下载.docx_第1页
第1页 / 共19页
JavaSE知识点总结个人整理Word格式文档下载.docx_第2页
第2页 / 共19页
JavaSE知识点总结个人整理Word格式文档下载.docx_第3页
第3页 / 共19页
JavaSE知识点总结个人整理Word格式文档下载.docx_第4页
第4页 / 共19页
JavaSE知识点总结个人整理Word格式文档下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

JavaSE知识点总结个人整理Word格式文档下载.docx

《JavaSE知识点总结个人整理Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JavaSE知识点总结个人整理Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。

JavaSE知识点总结个人整理Word格式文档下载.docx

(2)静态方法只能访问静态,非静态方法既可以访问静态也可访问非静态

(3)静态方法中不可以定义this、super关键字,因为静态优先于对象存在,this和super所代表的对象还不存在。

6.类与类、类与接口、接口与接口的关系

继承(单继承,多层继承,object),实现(多实现),继承(多继承)

7.final、finally、finalize的区别

final:

可以修饰类、方法和变量,被final修饰的类无法被继承,方法无法被重写,变量为常量只能赋值一次

finally:

异常处理,和try、catch结合使用,可以添加也可以不添加,用于执行一些必须执行的代码,如释放资源等

finalize:

Object类中的方法,其中定义了对象要被垃圾收集器回收之前要做的相关的清理工作

8.什么是多态,多态的好处和弊端

多态可以理解为事物存在的多种体现形态。

父类的引用指向了自己的子类对象;

父类的引用也可以接收自己子类的对象。

提高了程序的可维护性和扩展性

弊端:

父类的引用只能访问父类中有的成员而无法调用子类中特有的方法

 

10.wait()和sleep()的区别

(1)所在的类不同:

wait是Object类中的方法,sleep是Thread类中的方法

(2)sleep方法没有释放同步锁,而wait方法释放了同步锁,使得其他线程可以使用。

(3)sleep()必须指定时间,wait()可以指定也可以不指定时间。

(4)wait,notify和notifyAll只能在同步方法或者同步代码块里面使用,而sleep可以在任何地方使用

(5)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

16.对匿名内部类的理解

匿名内部类就是没有名字的内部类,是内部类的简化形式。

一般只使用一次的时候使用匿名内部类,匿名内部类本质上是一个匿名子类对象。

匿名内部类的使用前提:

内部类继承一个类或实现接口。

匿名内部类包括两个步骤:

创建一个类或者接口的子类,即刻创建该子类的对象。

简化书写。

17.IO体系

字节流InputStream/OutputStream|--FileInputStream/FileOutputStream:

文件字节流,用于文件的读写操作|--BufferedInputStream/BufferedOutputStream:

加缓冲区的字节流,用于提高效率字符流Reader/Writer|--FileReader/FileWriter:

文件字符流,用于文本文件的读写操作|--BufferedReader/BufferedWrite:

加缓冲区的字符流,用于提高效率转换流InputStreamReader/OutputStreamWriter:

是字节流和字符流之间的桥梁

18.集合体系

|--Vector:

功能同ArrayList类似,底层也是数组,线程是同步的,所以是安全的,效率较低,数据增长是50%的增长。

|--Set:

元素是无序的,元素不允许重复,底层用到了Map

|--HashSet:

底层hash表,存储的对象最好复写hashCode和equals方法,

|--TreeSet:

底层自平衡的二叉树,存储的对象具备比较性,有两种方法:

自然排序、比较器排序

|--Collection|--List:

元素是有序的,元素允许重复,因为该集合体系都具有索引

|--ArrayList:

底层数据结构是数组,查询速度快,增删操作较慢,线程不同步

|--LinkedList:

底层数据结构是链表,查询效率较低,增删操作快,线程不同步,数据增长是100%的增长。

保证元素不会重复

|--Map:

数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,

|--HashMap:

允许有null键或值,线程不同步,键是唯一的

|--TreeMap:

元素可排序

|--HashTable:

类似HashMap,不允许有null键或值,线程同步,元素不允许重复

21.局部变量和成员变量区别

成员变量

定义位置:

类中,整个类中均可以访问,通常用private修饰。

内存:

成员变量随着对象的建立而建立,存在于对象所在的堆内存中。

默认值:

成员变量有默认值。

回收:

随着对象的回收而回收。

局部变量

定义在局部范围,如方法内,语句内等。

局部变量存在于栈内存中。

没有默认值。

随着作用域结束而回收,通常为语句或方法范围。

22.同步函数与同步代码块的区别

同步代码块使用的锁可以是任意对象。

同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。

在一个类中只有一个同步的话,可以使用同步函数。

如果有多同步,必须使用同步代码块,来确定不同的锁。

所以同步代码块相对灵活一些。

23.数组和集合的区别

容器长度:

集合长度可变,数组长度固定

存储内容类型:

集合存储引用数据类型,数组存储任意类型

是否可存储不同类型数据:

数组只能存储同种数据类型的元素,集合可以存储不同类型(键值)的元素。

有序可重复:

数组是有序可重复的

集合中有些是有序可重复的如list,有些是无序不可重复的如set,map

24.StringBuffer和StringBuilder的区别

StringBuffer是同步的,所以线程安全,但是效率低,StringBuilder是不同步的,所以线程不安全,但是效率高。

StringBuilder要比StringBuffer快。

单线程的程序使用StringBuilder比较好,多线程的情况下可以自己加锁,也可以直接使用StringBuffer。

25.String和StringBuffer区别

String对象一经创建就不会发生变化了,即便是赋新值也不是在原对象的基础上改变,而是创建一个新的字符串对象,将引用指向这个新的对象,会造成空间的浪费,效率较低。

StringBuffer只创建一个对象,是在同一个实例的基础之上追加,效率更高,当需要用到String的时候toString就可以了

第二部分知识点

26.说明Java中Stringstr=null与Stringstr="

"

的区别?

Stringstr=null表示声明了一个String对象的引用str,但是没有为其分配内存空间。

Stringstr="

表示创建了一个长度等于0的空字符串,并在内存中为其分配了内存空间。

Stringstr=newString("

tw"

);

str在内存中有两个对象,1.堆内存有一个newSting

2.常量池中有一个字符串。

27.使用运算符"

=="

和方法equals()进行比较对象的区别?

使用"

算符比较基本数据类型时,比较的是值相等;

=="

算符比较对象时,比较的是内存地址值

使用equals()方法比较对象时,比较的是对象的内容,与地址无关,如果没有重写equals()方法就直接调用的是Object的equals()方法。

28.接口和抽象类有何区别?

(1)成员特点:

构造方法:

接口没有构造方法;

抽象类有构造方法。

成员变量:

接口中只有常量;

抽象类中可以是常量,也可以是变量。

成员方法:

接口中只有抽象方法;

抽象类中既有抽象方法,也有非抽象方法。

(2)关系特点:

类与类:

类与类之间只有单继承,可以有多层继承。

类与接口:

类与接口之间是实现关系,可以单实现,也可以多实现。

接口与接口:

接口与接口之间是继承关系,可以单继承,也可以多继承。

(3)设计理念:

接口对应的设计模式是简单工厂设计模式,抽象类对象的设计模式是模板设计模式。

(5)必须实现抽象类或接口的所有抽象方法才可以实例化。

黑马程序员入学面试题

32.不借用第三方变量,互换两个变量。

n=n^m;

m=n^m;

//(n^m)^m一个数异或另一个数两次,还是得原来那个数n=n^m//n^(n^m)

33.传统for和增强for有什么区别呢?

1.增强for对集合进行遍历,集合不能为空。

只能获取集合元素,但是不能对集合进行操作。

增强for有一个局限性,必须要有被遍历的目标。

2.迭代器除了遍历,还可以进行remove集合中元素的动作。

如果是用ListIterator,还可以在遍历过程中进行增删改查的动作。

建议在遍历数组的时候,还是希望是用传统for。

因为传统for可以定义角标。

1.增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。

不能获取下标等。

2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。

34.Collection和Colections的区别是什么?

Collection是一个单列集合的顶层接口,它是List、Set、Queue等接口的父接口。

在这个接口中,定义了集合类中通用的方法。

Collections是针对集合操作的工具类,有对集合进行排序和二分查找等静态方法。

37.线程的状态:

线程的五种状态:

1)新建(new)用new语句创建的线程对处于新建状态,此时它和其它Java对象一样,仅仅在Heap中被分配了内存。

当一个线程处于新建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。

Threadt=newThread(newRunner());

2)就绪(Runnable)程序通过线程对象调用启动方法start()后,系统会为这个线程分配它运行时所需的除处理器之外的所有系统资源。

这时,它处在随时可以运行的状态,在随后的任意时刻,只要它获得处理器即会进入运行状态。

t.start()

3)运行(Running)处于这个状态的线程占用CPU,执行程序代码。

在并发环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。

如果计算机中有多个CPU,那么同一时刻可以让几个线程占用不同的CPU,使它们都处于运行状态,只有处于就绪状态的线程才有机会转到运行状态。

4)阻塞(Blocked)阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。

当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。

阻塞状态可分为以下3种:

位于对象等待池中的阻塞状态(Blockedinobject'

swaitpool):

当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中。

位于对象锁池中的阻塞状态(Blockedinobject'

slockpool):

当线程处于运行状态,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中。

其他阻塞状态(OtherwiseBlocked):

当前线程执行了sleep()方法,或者调用了其他线程的join()方法,或者发出了I/O请求时,就会进入这个状态。

当一个线程执行System.out.println()或者System.in.read()方法时是,就会发出一个I/O请求,该线程放弃CPU,进入阻塞状态,直到I/O处理完毕,该线程才会恢复执行。

5)死亡(Dead)当线程退出run()方法时,就进入死亡状态,该线程结束生命周期。

线程有可能是正常执行完run()方法而退出,也有可能是遇到异常而退出。

不管线程是正常结束还是异常结束,都不会对其他线程造成影响。

40.集合

集合名称阅读技巧:

JDK1.2出现的集合框架中常用的子类对象

前缀名是结构名,后缀名是体系名。

ArrayList:

数组结构,看到Array就知道查询速度快,看到List就知道可以又重复元素,可以增删改查

LinkedList:

链表结构,增删快

HashSet:

哈希结构,查询速度更快,不保证有序,不可以重复,必须覆盖hashCode和equals方法

LinkedHashSet:

链表加哈希结构,可以实现有序

TreeSet:

二叉树结构,可以排序。

有两种方法:

1.自然排序compable,2.比较器comparatorJava提供了只包含一个compareTo()方法的Comparable接口。

这个方法可以个给两个对象排序。

具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。

compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。

equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。

只有当输入参数也是一个comparator并且和当前comparator的排序结果是相同的时候,这个方法才返回true.

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素.但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,

Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,Vector属于遗留容器,现在已经不推荐使用,

LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,其实对内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

由于ArrayList和LinkedListed都是非线程安全的,如果需要多个线程操作同一个容器,可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这其实是装潢模式最好的例子,将已有对象传入另一个类的构造器中创建新的对象来增加新功能)。

Map集合

Map(k,v)k:

此映射所维护的键的类型v:

映射值的类型

Map集合:

双例集合,一次存一对,称为键值对。

要保证键的唯一性。

Map集合没有迭代器,必须先将map集合转成set集合,在使用迭代器,就可以取出结合中的元素;

或者使用map集合特有的entrySet方法,也可以取出map集合中虽有元素。

Map集合常见子类:

1.HashTable:

底层数据结构是哈希表结构,线程同步的,不允许null键,null值;

2.HashMap:

哈希表结构,不同步,允许null键,null值

3.TreeMap:

二叉树结构,不同步,可以对map集合众多键进行排序。

41.为什么需要配置path,什么时候需要

答:

path路径:

是操作系统的环境变量,目的是希望在任意目录下都能执行该命令操作起来更加方便快捷;

classpath是给类提供路径:

想在其他目录下执行java程序时需要配置classpath路径。

42.IO流

输入流:

InputStream输出流:

OutputStream

字节输入流:

FileInputStream字节输出流:

FileOutoutStream

字节输入流缓冲区:

BufferedInputStream字节输出流缓冲区:

BufferedOutputStream

转换流:

InputStreamReader字符输出流:

OutputStreamWriter

字符流:

FileReaderFileWriter

字符输入流缓冲区:

BufferedReader字符输出流缓冲区:

BufferedWriter

49.list,set,map是否继承自collection接口?

list,set是map不是。

50.arraylist和vector的区别。

一.同步性:

vector是线程安全的,也就是说是同步的,而arraylist是线程序不安全的,不是同步的

二.数据增长:

当需要增长时,vector默认增长为原来一培,而arraylist却是原来的一半

51.hashmap和hashtable的区别

一.历史原因:

hashtable是基于陈旧的dictionary类的,hashmap是java1.2引进的map接口的一个实现

二.同步性:

hashtable是线程安全的,也就是说是同步的,而hashmap是线程序不安全的,不是同步的

三.值:

只有hashmap可以让你将空值作为一个表的条目的key或value

7:

给成员变量赋值的方式有几种?

分别怎么实现?

A:

给静态的成员变量赋值

(1)可以通过类中的方法给成员变量赋值(私有成员变量的也可以)publicvoidsetXXX(){...}

(2)可以通过构造方法给成员变量赋值(私有成员变量的也可以)publicXXX(){...}

(3)可以通过代码块完成成员变量的初始化值(私有成员变量的也可以){xxx=...;

}

(4)可以通过类名.成员变量赋值

B:

给非静态的成员变量赋值

(1)可以通过类的方法赋值publicvoidsetXXX(){...}

(2)可以通过对象调用

(3)可以通过代码块完成成员变量的初始化值{xxx=...;

}

如何理解字符串一旦初始化就不可以被改变。

不可以被改变说的是常量池中的值,并不是引用s(s是可以重新被赋值的)

2、Strings1=newString("

abc"

和Strings2="

两者的区别

第一种方式:

第一种方式在内存中存在两个"

字符串,一个是在常量池中,一个是在堆内存当中.

第二种方式:

在内存中只存在一个"

在常量池中.

异常:

异常是在程序运行过程中,发生的各种不正常状况。

Java中引入异常,以异常类Exception对这些不正常状况进行封装,通过异常处理机制对程序运行时可能发生的各种问题进行处理。

Throwable顶层类,包括error错误,Exception异常,异常分为运行时异常和编译时异常

处理方式:

throws声明抛出,trycatch捕捉处理,finally一定会被执行(释放资源)

运行时异常,运行时可能会报错,可以不处理。

编译时异常,编译时无法编译通过,必须处理。

throw和throws:

throws表示抛出异常类,由方法调用者使用;

throws用在方法声明后面,跟的是异常类名;

throws后可以跟多个异常类名,用逗号隔开。

throw用在方法体内,跟的是异常对象名;

表示抛出异常,由方法体内的语句处理。

只能抛出一个异常对象名;

异常注意事项:

子类抛出的异常比父类抛出的异常小。

如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集

父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。

此时子类产生该异常,只能捕获处理,不能声明抛出

泛型:

(提前使用未知数据类型)

什么是泛型:

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

泛型替代了Object来代表任意类型,在编译时会擦除。

泛型类:

定义:

类名后<

变量>

使用:

创建对象时确定类型

泛型方法:

方法返回值前<

调用方法时确定类型

泛型接口:

接口名后<

使用:

1、定义类时确定类型,2、始终不确定类型,直到创建对象时确定类型

泛型优点:

提高程序的安全性,将运行期问题转移到了编译期,省去了类型强转的麻烦,优化了程序设计

线程:

每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元均是程序执行的一条条执行路径,这些执行路径就是线程,如果希望程序中实现多段程序代码同时运行,则需要多线程技术。

是由cpu高速切换执行,java使用的是抢占式调度模型。

1.直接继承Thread类重写run方法,2.线程与线程执行目标分离方式,实现runnable接口,重写run方法,相比较而言,2避免了1方法单继承的局限性,且能够用多个线程操作同一份共享数据,把线程和线程数据有效的分离开,也体现java面向对象思想。

此外,还有线程池技术,提交任务,开启线程。

五种状态:

新建状态:

new,可运行状态:

start方法启动,运行状态:

获得cpu

死亡状态:

run方法执行完,Exception,error等待或阻塞状态:

wait-notify,join-调用jion的线程终止,sleep-时间到,io阻塞方法如read-阻塞方法返回,等待同步锁-获得同步锁

线程安全问题:

当多个线程共同操作一份数据时,当线程1操作数据到一半时,线程2抢走CPU,会导致”1使用的数据已经被其他数据修改为1不想要的数据了”。

Java中使用synchronized关键字来解决,将一个完整动作使用synchronized包裹。

即线程A中操作数据的代码与线程B中操作数据的代码均使用synchronized包裹,并使用相同的锁对象。

这时线程B会等待线程A中synchronized包裹的代码执行完毕后再执行,此时线程A已经操作完了代码,反之线程A也会等待线程B。

线程执行目标类成员位置定义多个线程要共享的同一份数据。

线程执行目标类成员位置定义多个线程要共享的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1