java基础
面向对象三大特性
封装
是什么?
在Java中,一切皆对象。封装,就是把客观事物封装成抽象的类,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。
有什么好处?
我们将复杂的功能封装到一个类中,对外开放一个接口,我们在使用的时候不用管里面复杂的逻辑,直接调用即可完成功能。
继承
是什么?
继承是一个对象获取另一个一个对象中属性的方法。有什么好处?
继承可以大幅减少冗余的代码,并且可基于父类的基础上扩展代码,增加功能,提高开发效率。
多态
是什么?
用超类可引用其所有的子类,若不同的子类覆写了父类的一个方法,则用超类引用不同子类时调用该方法会执行实际子类的方法,这种由一个对象引用时调用方法反映的是实际子类的方法的特性叫做多态。有什么好处?
提高了代码的扩展性。
String、StringBuffer和StringBuilder的区别是什么?
相同点
都是用char数组保存数据的。
区别
String类中用来保存字符数据的数组的修饰符为final,这表明String对象一旦创建,其中的保存的字符数据就是不变的,也可以说String类是不可变的,所以要保存另一串字符数据需要创建一个新的String对象,而StringBuffer和StringBuilder中保存的字符数组是可变的,所以要保存另一串字符数据时无须新建一个对象,直接修改即可。
StringBuffer对方法加了同步锁,String中的字符数据是不可变的,所以这两者拥有线程安全性,StringBuilder则没有线程安全。由于没有线程安全和不用每次保存数据的时候创建对象,所以在操作多字符串数据时,StringBuilder相对来说运行速度更快,StringBuffer则相对慢些,String最慢。
修饰符
final
作用在类上
表示该类不可以被继承作用在方法上
表示该方法不可以被覆写- 作用在字段上
表示该字段不能被修改
- 作用在字段上
static
作用在成员变量上
被称为静态字段,静态字段只有一个共享的空间,在类的所有实例中共享静态字段。作用在方法上
被称为静态方法,静态方法能够在不创建实例的情况下通过类名直接调用,如Math.max()
;
静态方法不能调用非静态的方法和成员变量。
private
私有访问修饰符,被声明为private的方法、变量和构造方法只能被所属类访问,注意类和接口不能声明为private。
public
与private相反,被声明为public的方法、变量、类和接口可以被任何其他类访问。
== 与 equals
==
它的作用是判断两个对象的地址相不相等。即判断两个对象是不是同一个对象,基本数据类型中”==”比较的是值,而引用数据类型中”==”比较的是内存地址。(基本数据类型:如int,double,float,char等,引用数据类型:如String,StringBuilder等)equals
可以重写该方法,equals一般用来比较两个对象的值是否相等,在String类中使用较为频繁,判断两个字符串是否相等可以用一下办法:
if(str1 != null && str1.equals(str2)){
...
}
hashCode 与 equals
若要将类存入散列表中,重写equals方法时必须要重写hashCode。
hashCode
是什么?
在你要将对象存入散列表时,需要使用hashCode()
方法得到一个整数,这个整数称为哈希码,标识着对象在散列表中的位置,一般使用对象中的成员变量的值来计算哈希码。有什么用?
根据哈希码可以将对象存入到散列表的特定位置,下次需要检索该对象时会直接计算哈希码从而快速定位到对象在散列表中的位置,大大缩短搜索时间。
为什么要有hashCode
当我们使用散列表时,会根据对象的哈希码得出其在散列表中的位置,若散列表对应位置中已经存有数据了,说明两个对象的哈希码相同,这时候equals就登场了,使用equals判断两个对象是否相等,若相等,则在不加入散列表,若不相等,则表明两个对象不相等,这时候就重新将该对象散列到其他位置。所以
两个对象相等,则他们的哈希码一定相同;
两个对象相等,他们的哈希码不一定相同。
深拷贝 vs 浅拷贝
深拷贝
对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝。
浅拷贝
对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
Java集合
List是一种有序列表的集合
有两个实现方式,一是采用ArrayList,在该类内部使用数组存储数据,二是采用LinkedList,内部使用双向链表存储数据。
操作 | ArrayList | LinkedList |
---|---|---|
获取指定位置元素 | 速度快 | 需要从头开始查找 |
在指定位置添加或者删除 | 速度慢,需要移动元素 | 速度快,无需移动元素 |
内存占用情况 | 少 | 较大 |
对比上表,综合来说优先使用ArrayList。
最好使用迭代器来遍历List,如果使用普通for循环遍历的方式,当实现类是LinkedList时,每次查找指定位置元素时都需要从头开始查找。
Map采用键值查找的映射表集合
使用key-value对存储元素,key不可以重复,value可以重复。
有两个实现类
- HashMap:非线程安全的(ConcurrentHashMap类是线程安全的);底层数据结构采用红黑树存储元素,红黑树是一颗自平衡二叉查找树,它可以在时间复杂度O(log n)下完成数据的查找、删除添加。
- Hashtable:线程安全,但是由于效率问题,这个类基本被淘汰了。
HashMap底层实现
采用数组加链表方式存储(拉链法),当两个元素的hashCode相同时,在数组相应的位置链上一个链表,来解决冲突。为解决查找效率问题,当链表长度大于8时,将单链表改为红黑树方式存储冲突的元素。
Set是没有重复元素的集合
Set存储的元素是不重复的,要判断存入的元素之间是否相等,需要正确覆写equals()和hashCode()方法。equals()用来判断两个元素是否相等,hashCode()方法用来求出元素在散列表的位置。
Set集合有两个实现类,分别是HashSet和TreeSet:
- HashSet是无序的,HashSet是基于HashMap实现的,HashSet只存储key;
- TreeSet是有序的,因为它实现了SortedSet接口。
未完待续~
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 572108581@qq.com
文章标题:java基础
文章字数:1.8k
本文作者:ZSH
发布时间:2019-11-08, 20:07:06
最后更新:2019-12-19, 20:15:19
原始链接:https://zhongshanhao.github.io/2019/11/08/java基础/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。