java知识点2

2019-07-28  本文已影响0人  繁星追逐

JVM (java Virtual Machine)起到了主要作用。JVM是运行在平台之上的程序,它能够虚拟出一台目标机,所有字节码就是在虚拟出的目标机上运行。

Java虚拟机的主要任务是装载class文件并且解释执行其中的字节码

数组的定义和创建

数组名= new  数据元素类型[ 元素个数]

 int  a[] = new int[5];

在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。

垃圾回收机制

Java的垃圾回收机制是自动的,它保证程序健壮的主要手段,避免了由于程序员忘记回收内存而引起的内存泄漏,同时也避免了回收内存带来的代码繁琐。

垃圾回收机制实际上是JVM内部运行的一个优先级比较低的后台线程,这种多线程的模式使得java 具有更好的性能,完全不用程序员参与。

垃圾回收机制仅仅作用于堆内存,于栈内存无关。

对于程序员来说,对象何时变成垃圾呢?

对象的引用被赋值为null;Person p = new Person( );   p= null;

一次性使用的匿名对象;       new Person( ).sayHello();

超出生命周期的;如:

     for( int I = 0; i< 100; i++){

                  Personp = new Person( );

         }      

这里,变量p 被实例化100次,每结束一次循环,变量p就超出生命周期,对象变为垃圾。

this关键字

代表对象自身的引用

一个引用

指向调用该方法的当前对象

通常在类的方法定义中使用

用this关键字的情况

方法中的变量与成员变量重名

在一个构造器中,调用其它重载的构造器

返回当前对象的引用

super和this关键字

super()

作用:调用父类的构造器

只能出现在子类的构造器中,且必须是第一行

super()中的参数,决定了调用父类哪个构造器

如果子类构造器中没有出现super,那么编译器会默认加上super(),即调用父类的空构造器,如果父类没有空构造器,编译器提示错误。

this()

作用:调用本类的构造器

只能写在构造器的第一行

在同一个构造器中super()和this()不能同时出现

如调用的是父类中无参的构造器,则可以不写super( )

如果子类中调用了父类无参的构造器,而父类中没有无参构造器则系统编译出错

单例模式(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点

单例模式要点:

某个类只能有一个实例

它必须自行创建这个示例

必须自行向整个系统提供这个实例

 

final关键字

final可以修饰的元素:

类:不能被继承

变量(属性和局部变量):不能被重新赋值

在声明时赋值,或在构造器中赋值

系统不会对final属性默认的赋初始值

方法:不能在子类中被覆盖,即不能修改。

抽象类的规则

注意:

抽象类不能被实例化;

其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;

抽象方法不能为static;

在下列情况下,一个类必须声明为抽象类:

当一个类的一个或多个方法是抽象方法时;

当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;

当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;

接口中只包含常量和抽象方法,而没有变量和方法的实现

接口对类来说是一套规范,是一套行为协议;

接口不是一个类,不能实例化

针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。

接口与抽象类的对比

接口不能含有任何非抽象方法,而抽象类可以。

类可以实现多个接口,但只能有一个父类。

接口和接口之间可以多继承 

     如:public interface A extends B,C

            B,C也是接口.

抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法完全是抽象方法,是一套纯粹的规范。一般来说,有关系的类才能继承同一个抽象类,而无关的类不可能有同一个抽象父类,但是无关的类可以实现同一个接口。

内部类特性

内部类就是定义在另一个类内部的类。

内部类对于同一包中的其它类来说,内部类能够隐藏起来。

注意

内部类可以访问其外部类中所有的属性和方法

无需创建外部类的对象,即可从内部类访问外部类的变量和方法。

必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。

如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。

不能定义static变量

Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况。一般情况下很少用Throwable,而是使用它的两个子类Error、Exception。

Error类特指应用程序在运行期间发生的严重错误。如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error。

Exception类有几十个子类,描述了不同类型的异常,其中:

以RuntimeException为代表的一些类,称为非检查性异常(unchecked Exception),

以IOException为代表的一些类为检查性异常(checked Exception)。所谓的检查和非检查是指编译器在编译时是否检查。如果代码中存在检查性异常,必须进行异常处理,否则编译时不能通过;而非检查性异常编译时不进行检查,到运行时才会显现。

String的创建:有两种方式:

静态方式(常用)。像是给变量直接赋值一样来使用。如:String s1 = “abc”; String s2 = “abc”;

动态方式。动态的内存分配,使用new运算符。如:String s3= new String(“abc”); String s4= new String(“abc”);

StringBuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。

StringBuffer和StringBuilder都是长度可变的字符串。

两者的操作基本相同。

两者的主要区别在于

StringBuffer类是线程安全的;

StringBuilder类是线程不安全的。

StringBuffer在JDK1.0中就有,而StringBuilder是

在JDK5.0后才出现的。

StringBuilder的一些方法实现要比StringBuffer快

些。

Calendar c = Calendar.getInstance();

c.get(Calendar.YEAR);

SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");

将日期格式成指定的字符串

sdf.format(new Date());

将格式化的字符串转换成日期对象

sdf.parse(“2011-07-16”);

HashMap与TreeMap的比较

HashMap基于哈希表实现。

   TreeMap基于树实现。

HashMap可以通过调优初始容量和负载因子,优化HashMap空间的使用。

   TreeMap没有调优选项,因为该树总处于平衡状态

HashMap性能优于TreeMap。

HashMap与Hashtable的比较

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

如何选择集合类

Set内存放的元素不允许重复,List存放的元素有一定的顺序。

Map的应用主要在利用键/值对进行快速查询。

ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好。

HashSet和TreeSet的区别在于集合内元素是否排序。

进程/线程区别

每个进程都有独立的代码和数据空间,进程的切换

会有很大的开销

 同一类线程共享代码和数据空间,每个线程有独立

运行的栈和程序计数器,线程切换的开销小

多进程:在操作系统中能同时运行多个任务(程序)

多线程:在同一应用程序中有多个顺序流同时执行

多线程的实现

(1)  创建线程类

继承Thread类     或

实现Runnable接口

(2)  通过Thread类构造器来创建线程对象

 Thread( )

 Thread(Runnable target)

(3)  通过start()方法激活线程对象

Java线程的优先级用1~10的整数来表示,越小则优先级越低

当一个线程运行到需要同步的语句后,CPU不去执行其他线程中的、可能影响当前线程中的下一句代码的执行结果的代码块,必须等到下一句执行完后才能去执行其他线程中的相关代码块,这就是线程同步

实现同步的两种方式

synchronized方法

synchronized void methodA() {  }

synchronized语句

synchronized (Object) {

    //要同步的语句

 }

网络编程

 

 

 

 

 

支持序列化的接口和类

Serializable接口、Externalizable接口

ObjectInputStream

ObjectOutputStream

只有一个实现Serializable接口的对象可以被序列化工具存储和恢复

Serializable接口没有定义任何属性或方法。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化

 

上一篇下一篇

猜你喜欢

热点阅读