JavaSE知识点总结.docx

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

JavaSE知识点总结.docx

《JavaSE知识点总结.docx》由会员分享,可在线阅读,更多相关《JavaSE知识点总结.docx(29页珍藏版)》请在冰豆网上搜索。

JavaSE知识点总结.docx

JavaSE知识点总结

JavaSE知识点

1、继承,封装,多态

1、分类

我们可以把JAVA中的类分为以下三种:

类:

使用class定义且不含有抽象方法的类。

抽象类:

使用abstractclass定义的类,它可以含有,也可以不含有抽象方法。

接口:

使用interface定义的类。

在这三种类型之间存在下面的继承规律:

1.类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

2.抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

3.接口只能继承(extends)接口。

2、继承(inheritance)

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

继承是为了重用父类代码,同时为实现多态性作准备。

构造方法在实例化的时候调用的,而子类既然继承了父类,那就具备了父类所有的属性以及方法,当子类实例化的时候就先调用父类的构造了,如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其它构造方法,则会默认先调用父类的无参构造方法。

你想那么子类中从父类继承的字段,要谁来初始化呢?

父类中有这些字段的初始化方式,所以最好的选择就是用父类的构造方法。

java创建对象的三个步骤就是,申请内存,调用构造方法,返回对象引用。

3、封装(encapsulation)

类使得数据和对数据的操作集成在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏。

封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

4、多态(polymorphism)

方法的重写、重载与动态连接构成多态性。

Java之所以引入多态的概念

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;该引用只能调用父类中定义的方法和变量;

二、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

三、变量不能被重写(覆盖),”重写“的概念只针对方法。

5、重写

英文名是overriding,是指在继承情况下,子类中定义了与其基类中方法具有相同型构的新方法,就叫做子类把基类的方法重写了。

这是实现多态必须的步骤。

6、重载

英文名是overloading,是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法。

在同一个类中,是不允许定义多于一个的具有相同型构的方法的。

7、接口与抽象类

abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制。

在abstractclass方式中,可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。

从某种意义上说,interface是一种特殊形式的abstractclass。

抽象类里面可以有非抽象方法但接口里只能有抽象方法声明方法的存在而不去实现它的类被叫做抽象类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。

不能创建abstract类的实例。

接口(interface)是抽象类的变体。

在接口中,所有方法都是抽象的。

多继承性可通过实现这样的接口而获得。

接口中的所有方法都是抽象的,没有一个有程序体。

接口只可以定义staticfinal成员变量,instanceof运算符可以用来决定某对象的类是否实现了接口。

java抽象类的构造方法和普通类的构造方法一样,都是用来初始化类,只是不能直接创建抽象类的实例对象而已。

在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法,可以这么理解吧抽象类就是一个不能实例化的类

不过如果方法加了abstract那么就必须在子类里面重写了

2、Java存储

JAVA的容器---List,Map,Set

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│└Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。

一些Collection允许相同的元素而另一些不行。

一些能排序而另一些不行。

JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。

所有实现Collection接口的类都必须提供两个标准的构造函数:

无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。

后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?

不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。

典型的用法如下:

Iteratorit=collection.iterator();//获得一个迭代子while(it.hasNext()){Objectobj=it.next();//得到下一个元素}由Collection接口派生的两个接口是List和Set。

List接口

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。

用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

和下面要提到的Set不同,List允许有相同的元素。

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

Sort()对list接口进行排序

LinkedList类

LinkedList实现了List接口,允许null元素。

此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。

这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

注意LinkedList没有同步方法。

如果多个线程同时访问一个List,则必须自己实现访问同步。

一种解决方法是在创建List时构造一个同步的List:

Listlist=Collections.synchronizedList(newLinkedList(...));

ArrayList类

ArrayList实现了可变大小的数组。

它允许所有元素,包括null。

ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。

但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。

其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。

这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。

当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

实现长度可变的数组,采用和数组相同的存储方式,被称为动态数组,可以添加任何类型的数据,可以存储不唯一有序的对象

Vector类

Vector非常类似ArrayList,但是Vector是同步的。

由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

Stack类

Stack继承自Vector,实现一个后进先出的堆栈。

Stack提供5个额外的方法使得Vector得以被当作堆栈使用。

基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。

Stack刚创建后是空栈。

Set接口

Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。

很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

请注意:

必须小心操作可变对象(MutableObject)。

如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

Hashset不能保存重复的对象,特点是存储的元素可以是无序排列,集合元素可以是空

Map接口

请注意,Map没有继承Collection接口,Map提供key到value的映射。

一个Map中不能包含相同的key,每个key只能映射一个value。

Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

Hashtable类

Hashtable继承Map接口,实现一个key-value映射的哈希表。

任何非空(non-null)的对象都可作为key或者value。

添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。

Hashtable通过initialcapacity和loadfactor两个参数调整性能。

通常缺省的loadfactor0.75较好地实现了时间和空间的均衡。

增大loadfactor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。

使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:

Hashtablenumbers=newHashtable();numbers.put(“one”,newInteger

(1));numbers.put(“two”,newInteger

(2));numbers.put(“three”,newInteger(3));要取出一个数,比如2,用相应的key:

map的publicSetkeySet()返回所包含键的set集合,因为map中键是不能重复的,所以使用了set集合的不可重复的特性来做返回值类型.循环key

for(Stringkey:

map.keySet()){}

collections与collection区别

Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

CompareTo()比较同类的两对象顺序大小

Sort()对list接口进行排序

Fill()对集合元素进行替换

 

3、遍历

①Iterator接口

hasnext()是否存在课访问元素

next()返回要访问的下一个元素

②For(元素类型元素名:

遍历的对象或者方法){

引用了变量名的java语句

}

4、常用类的用法

1.StringBuffer类和StringBuilder类的区别

所谓的线程安全问题就是同时有多个线程访问同一个资源时引起的数据混乱问题。

StringBuffer是线程安全的,所以当它作为成员变量时不存在线程安全问题。

StringBuilder是线程不安全的,在作为成员变量时有可能出现线程不安全问题。

如果在方法内部使用一个这样的变量,用StringBuilder效率会更高,因为首先StringBuilder没有加锁,其次方法内部不存在线程安全问题。

2.Math.random()与java.util.random()的区别

直接调用Math.random()是产生一个[0,1)之间的随机数,

如果用

java.util.Randomrandom=newRandom();random.nextInt()这样产生一个长整型的随机数并且与上一次是一样的,如果过一会再产生就不会一样了,例如:

for(inti=0;i<10;i++){

Randomrandom=newRandom();

Thread.sleep(100);

System.out.print((int)random.nextInt(100)+"");

}

就是产生不同的随机Long数了

如果想用java.util.Random()产生指定范围的随机数就需要进行求模运算,进行一些处理。

同样可以random.nextInt(100)产生100以内的随机数。

一般最好用nextInt(范围)的,如果不是大量的运算的话,就可以用Math.random了,(因为他可以运算起来慢一些,浮点之后再取整)

(int)(Math.random()*100)

3.数据类型的包装类

Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类,有些地方也翻译为外覆类或数据类型类。

int是基本类型,直接存数值

Integer是类,产生对象时用一个引用指向这个对象

Java把内存划分成两种:

一种是栈内存,另一种是堆内存

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配

而实际的对象是在存储堆内存中即

inti=5;//直接在栈中分配空间

Integeri=newIntegr(5);//对象是在堆内存中,而i(引用变量)是在栈内存中

在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理.

包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:

基本数据类型(原始类型)

包装类(封装类)

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double

在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。

对于包装类说,这些类的用途主要包含两种:

a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。

b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

4.int和Integer的区别

java提供两种不同的类型:

引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。

Int是java的原始数据类型,Integer是java为int提供的封装类。

Java为每个原始类型提供了封装类。

引用类型和原始类型的行为完全不同,并且它们具有不同的语义。

引用类型和原始类型具有不同的特征和用法,它们包括:

大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。

对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。

5.Enum枚举

在JDK1.5之前,我们定义常量都是:

publicstaticfianl....。

,有了枚举,可以把相关的常量分组到一个枚举类型里

6.日期时间类

Date:

用来表示日期和时间

SimpleData类格式化时间的类

Calendar类用来操作时间的类,是抽象类用getInstance获取其对象

7.String

1.字符串转换成字节数组Strings.getBytes()

2.intthree=Integer.parseInt(String.valueOf(zuo.charAt

(2)));//取数字字符串的第三个数

3.contains(tuipiao)是否包含

String类的构造方法

//String?

?

?

?

?

?

//?

?

?

:

String();

//?

?

?

:

String(byte[]bytes)

//?

?

?

:

String(byte[]bytes,intindex,intlength)

//?

?

?

:

String(char[]value)

//?

?

?

:

String(char[]value,intindex,intlength)

//?

?

?

:

String(Stringstr)

......

1、byte[]转string

byte[]srtbyte;//声明一个byte字节数组

Stringres=newString(srtbyte);//使用构造函数转换成字符串

System.out.println(res);

2、string转byte[]

Stringstr="Hello";//声明一个字符串

byte[]srtbyte=str.getBytes();//使用string类的getBytes方法进行转换

也可以将byte转换的时候,设定编码方式相互转换,如下代码:

Stringstr="hello";

byte[]srtbyte=null;

srtbyte=str.getBytes("UTF-8");//设定转换的编码格式

Stringres=newString(srtbyte,"UTF-8");

System.out.println(res);

 

java中substring的用法

str=str.substring(intbeginIndex);

截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;

str=str.substring(intbeginIndex,intendIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str;

5、Java输入输出(IO流)

结构图

常用的

1.文件 File

javaio的开始:

File

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

讲?

?

?

 java?

?

?

?

?

?

File,java?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

importjava.io.*;

publicclassFileExample{

publicstaticvoidmain(String[]args)throwsIOException{

createFile();

}

/**

*?

?

?

?

?

?

 

*@authorliuyd

*/

publicstaticvoidcreateFile(){

try{

Filef=newFile("C:

/?

?

?

?

?

.txt");

//?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  

f.createNewFile();

//?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  

System.out.println("?

?

?

?

?

"+f.getTotalSpace()/(1024*1024*1024)+"G");

//?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  

f.mkdirs();

//f.delete(); //  ?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  

//?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  

System.out.println("?

?

?

:

"+f.getName());

//?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

;?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

 null?

  

System.out.println("?

?

?

?

?

?

?

?

:

"+f.getParent());

}catch(IOExceptione){

e.printStackTrace();

}

}

}

2.字节流

构造方法:

publicFileOutputStream(Stringname):

创建一个具有指定名称的文件中写入数据的输出文件流

publicFileOutputStream(Stringname,booleanappend):

创建一个向具有指定name的文件中写入数据的输出文件流。

如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处

publicFileOutputStream(Filefile):

创建一个向指定File对象表示的文件中写入数据的文件输出流

publicFileOutputStream(Filefile,booleanappended):

创建一个向指定File对象表示的文件中写入数据的文件文件输出流。

如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。

总结:

1、FileInputStream是InputStream类(字节流输入)的子类,以字节流方式读取文件;FileInputStream的构造函数参数可以是File文件,也可以是字符串,但实际上使用File文件会更加规范。

2、类似的,FileOutputStream是OutputStream类的子类,以字节流方式写入文件。

如果进行写操作的文件不存在,责自动创建该文件。

如果文件所在的路径也不存在则报错。

3、与File类不同(File类关注的是文件在磁盘上的存储),FileInputStream,FileOutputStream关注是的文件的内容

4.采用BufferOutputStream类将FileOutputStream作为参数新建一个对象便可以提高文件

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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