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零碎知识点的主要内容,如果未能解决你的问题,请参考以下文章