Java零碎知识点

Posted ascto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java零碎知识点相关的知识,希望对你有一定的参考价值。

Java零碎知识点

Object的finalize方法

关于Object类中的finalize()方法

1.在object类中的源代码为:protected void finalize() throws Throwable;finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。

2.这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。不像equals tostring需要你去手动写,finalize()是需要重写,重写完将来自动会有程序来调用。GC:负责调用finalize()方法

3.finalize()方法的执行时机:当一个java对象即将被垃圾回收器回收时,垃圾回收器负责调用finalize()方法。

4.finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机,如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。

5.静态代码块的作用是什么?

static 静态代码块在类加载时刻执行,并且只执行一次。这是一个SUN准备的类加载时机;finalize()方法同样也是SUN为程序员准备的一个时机。这个时机是垃圾回收时机。

6.提示:Java中的垃圾回收器不是轻易启动的,垃圾太少或者时间没到种种条件下,有可能启动也可能不启动。

Object的hashCode()方法

hashCode()方法

在Object中的hashCode方法是怎样的?

public native int hashCode();

这个方法不是抽象方法,带有native关键字,底层调用c++程序。

native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++

hashCode()方法返回的是哈希码:实际上就是一个Java对象的内存地址,经过哈希算法,得出的一个值。所以hashCode()方法的执行结果可以等同看做一个Java的内存地址。

内部类

在一个类的内部定义的类,叫做内部类。内部类主要分为:实例内部类,静态内部类,局部内部类,匿名内部类。

实例内部类

类似于实例变量

1.创建实例内部类,外部类的实例必须已经创建

2.实例内部类会持有外部类的引用

3.实例内部类不能定义static成员,只能定义实例成员

静态内部类

类似于静态变量

1.静态内部类不会持有外部类的引用,创建时可以不用创建外部类。

2.静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须用过外部类的实例访问。

局部内部类

类似于局部变量

局部内部类是在方法中定义的,他只能在当前方法中使用。和局部变量的作用一样。局部内部类和实例内部类都不可以包含静态成员。局部变量在内部类中使用必须采用final修饰。

匿名内部类

是一种特殊的内部类,该类没有名字。匿名内部类是局部内部类的一种。

缺点:太复杂,太乱,可读性差,没有名字,不可以复用。

为啥用?:可以看懂别人的代码~

main方法中的String数组

main方法中的String[] args也可以写成String args[],和命名数组时一样,int[] a 等价于 int a[] (这个是c++的风格)

main方法上面的一维数组有什么用?

JVM负责调用main方法,调用时JVM会传过来一个String数组。

JVM默认传过来数组的长度为0(可以知道args不是null,数组创建了但是里面没有东西)

这个数组什么时候里面会有值呢?

其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数自动会被转换为“String[] args”

所以main方法上面的String[] args数组主要是用来接收用户输入参数的。(abc def )=>("abc","def")

"admin".equals(username)username.equals("admin")好,因为可以避免空指针异常!!!

StringBuilder

StringBuilder概述

stringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容可变

String和StringBuilder的区别就是string不可变,stringbuilder可变。

StringBuffer底层实际上是一个byte[]数组。往StringBuffer中放字符串,实际上是放到byte数组当中了,StringBuffer的初始化容量是16

拼接字符串统一调用append()方法,append的意思是追加。string底层也是byte数组,但是被final修饰了,一旦创建不可改变。

如何优化StringBuffer性能

在创建string buffer的时候尽可能给定一个初始化容量,最好减少扩容次数。

StringBuffer和StringBuilder的区别

StringBuffer是线程安全的,StringBuilder是线程不安全的。

包装类

Java中为八种基本数据类型又对应准备了八种包装类型。八种包装类属于引用数据类型,父类是object。

为啥要提供包装类?

Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。

集合

什么是集合?有什么用?

数组就是一个集合,集合实际上就是一个容器。可以容纳其他类型的数据。

集合是一个容器,是一个载体,可以一次容纳多个对象。

集合不能直接存储基本数据类型,另外集合也不能直接存储Java对象,集合当中存储的都是Java对象的内存地址。(或者说集合中存储的是引用) list.add(100)自动装箱,存的不是基本数据类型

在Java中集合分为两大类

1.单个方式存储元素:超级父接口:Java.util.Collection

2.以键值对的方式存储元素:超级父接口:java.util.Map

单个方式存储元素

以键值对的方式存储元素

**放在集合中的方法要重写equals方法!**这样的话,才可以保证当出现重复内容时,contains()方法生效!

当集合的结构发生改变时,迭代器必须重新获取,如果还有老的,会报异常。在迭代过程中不可以调用集合的remove()方法,但是可以调用迭代器的remove()方法

ArrayList集合

1.ArrayList集合初始化容量为10。(底层先创建了一个长度为0的数组,当添加了第一个元素后,初始化容量为10。)

2.底层是Object类型的数组

3.扩容到原容量的1.5倍

4.建议给定一个预估计的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略。

5.线程不安全

LinkList集合

LinkList集合是双向链表

Vector集合

1.底层是数组

2.初始容量10

3.线程安全

4.扩容后是原容量的二倍

Collections.synchronizedList(myList);可以将线程不安全的集合转换成线程安全的集合

自定义泛型的时候,<>尖括号中的是一个标识符,随便写。

Java源代码中经常出现的是:<E><T> E是Element单词首字母,T是Type单词的首字母。

增强for循环----foreach

Map

map和collection没有继承关系。

map集合以Key和Value的方式存储数据:键值对

key和value都是引用数据类型。

key和value都是存储对象的内存地址

key起主导地位,value是key的一个附属品。

对于Map.Entry的解释

HashMap的null只可以有一个,且key可以为空,但value有值。(线程不安全)

HashTable的key与value均不可以为空。hashtable的默认容量为11,默认负载因子为0.75。(线程安全)

Properties类

properties是一个map集合,继承HashTable,properties的key和value都是string类型。又称为属性类

Sorted

1.TreeSet集合底层实际上是一个TreeMap

2.TreeMap集合底层是一个二叉树。

3.放到TreeSet集合中的元素,等同于放到了TreeMap集合key部分了。

4.TreeSet集合中的元素:无需不可以重复,但是可以按照元素的大小顺序自动排序。

IDEA默认路径是Project的根

以上是关于Java零碎知识点的主要内容,如果未能解决你的问题,请参考以下文章

Java零碎知识点

C#零碎知识点笔记(容易混淆的一些点)2

java 零碎知识点

零碎的java知识点记录

Java基础零碎知识点总结(持续补充)

Java数据类型的零碎知识