目录
一、接口 Interface
1. 接口语法
定义接口时,需要注意
实现接口时,需要注意
2. 接口的继承与多继承
3. 标记接口
作用
4. 接口与“抽象类”
Java 抽象类和接口总结
结论
二、容器:能装对象的对象
2.1 三种容器:
2.2 ArrayList 与 LinkedList
2.2.1 List 常见用法
2.2.2 遍历列表
2.3 Set 集合 HashSet 和 TreeSet
2.3.1 Set 常见用法
2.4 Map:HashMap
2.4.1 Map 常见用法
接口包含类要实现的方法,类则描述对象的属性和方法。一个类通过继承接口的方式,从而来继承接口的抽象方法。
interface USB {
void read(); // 接口包含类要实现的方法read()和write()
void write();
}
class YouPan implements USB {
public void read() {
System.out.println("U盘正在通过USB功能读取数据");
}
public void write() {
System.out.println("U盘正在通过USB功能写入数据");
}
}
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。
// 定义接口
interface 接口 [extends 其他的接口名]{
接口方法1;...
}
// 实现接口
class 类 implements 接口{
实现接口方法1{]
实现接口方法2{}
实现接口方法3{}
}
// 主函数调用
public class MyJava001{
public static void main(String[] args){
MyHero3 myobject001 = new MyHero3()
MyHero3.attack1();
MyHero3.attack2();
MyHero3.attack3();
}
}
// 举例:英雄技能
// 定义接口
interface MyAttacks{
public void attack1();
public void attack2();
public void attack3();
}
// 实现接口
class Myhero3 implements MyAttacks{
public void attack1(){
system.out.println(''技能1'')
}
public void attack2(){
system.out.println(''技能2'')
}
public void attack3(){
system.out.println(''技能3'')
}
}
// 主函数调用
public class MyJava001{
public static void main(String[] args){
MyHero3 myobject001 = new MyHero3()
myobject001.attack1();
myobject001.attack2();
myobject001.attack3();
}
}
1. 接口中的每一个方法都是隐式抽象的,当声明一个接口的时候,不必使用 abstract 关键字;
1. 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型;
2. 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常;
3. 变相地使 java 具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
接口的继承使用 extends 关键字,子接口继承父接口的方法。实现子接口的类需要实现的方法个数(自己声明的方法个数+继承的方法个数)。在Java中,类的多继承是不合法,但接口允许多继承。在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。
public interface Hockey extends Sports, Event
没有任何方法和属性的接口。它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
1.向一个类添加数据类型:标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。
2. 建立一个公共的父接口:正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
抽象类,架构师定义类和方法,接口是定义方法。
1. abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个 interface。
2. 在 abstract class 中可以有自己的数据成员,也可以有非 abstarct 的成员方法,而在 interface 中,只能够有静态的不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定义数据成员),所有的成员方法都是 abstract 的。
3. abstract class 和 interface 所反映出的设计理念不同。其实 abstract class 表示的是 "is-a" 关系, interface 表示的是 "has-a" 关系。
4. 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5. 接口中定义的变量默认是 public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6. 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7. 接口中的方法默认都是 public,abstract 类型的。
abstract class 和 interface 是 Java 语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。
容器中的七大接口:
Collection接口
Map接口
Set接口
List接口
Queue接口
Iterator接口
Comparable接口
其中List, Queue和 Set 接口继承了Collection接口,剩下的接口之间都是相互独立的,无继承关系。List 和 Set 接口主要是为了区分是否要包含重复元素,Iterater迭代器则是为了更灵活的迭代集合,与foreach一起使用。Comparable接口则用于比较。
1. List 列表:线性结构,类似数组,但数组定长,List 可自动变长度,只要内存够。
2. Set 集合:非线性,去重。
3. Map 映射:以 key-value 形式存储数据。
这三个都是接口,都不是类。意味着它们下面都有一些实现类。
List : ArrayList (线性结构)、LinkedList(链性结构)
Set:HashSet、 TreeSet
Map:HashMap
public interface List
extends Collection
【动画演示】链表详解及其底层机制 C语言_哔哩哔哩_bilibili
LinkedList 是每个节点分为两部分,前面是数据,后面是后继指针。这种结构的优势是内存可以不连续,不过查询效率比较低(需要通过头找到下一个,再下一个...),其在增加和删除方面效率较高。
容器方面用的最多的是“往里放东西,往外拿东西”,所以用的最多的是 ArrayList ,其适用于大量随机访问的情况。
ArrayList 是实现 List 接口的,底层采用数组实现。
ArrayList 实现java.io.Serializable接口,这意味着 ArrayList 支持序列化,能通过序列化去传输。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
import java.util.ArrayList;
//模块 java.base
//软件包 java.util
public class ArrayList
extends java.util.AbstractList
implements java.util.List, // 实现的所有接口
java.util.RandomAccess,
Cloneable,
java.io.Serializable
变量和类型 | 方法 | 描述 |
---|---|---|
void |
add(int index, E element) |
将指定元素插入此列表中的指定位置。 |
boolean |
add(E e) |
将指定的元素追加到此列表的末尾。 |
boolean |
addAll(int index, Collection extends E> c) |
从指定位置开始,将指定集合中的所有元素插入此列表。 |
boolean |
addAll(Collection extends E> c) |
将指定集合中的所有元素按指定集合的Iterator返回的顺序附加到此列表的末尾。 |
E |
remove(int index) |
删除此列表中指定位置的元素。 |
---|---|---|
boolean |
remove(Object o) |
从该列表中删除指定元素的第一个匹配项(如果存在)。 |
void |
clear() |
从此列表中删除所有元素。 |
---|---|---|
Object |
clone() |
返回此 |
int |
size() |
返回此列表中的元素数。 |
---|
boolean |
contains(Object o) |
如果此列表包含指定的元素,则返回 |
---|
|
|
返回此列表中指定位置的元素。 |
---|
public class List {
public static void main(String[] args) {
// LinkedList list = new LinkedList();
ArrayList list = new ArrayList();
// 增加元素,将指定的元素追加到此列表的末尾
list.add("福满多");
list.add("小当家");
list.add("康师傅"); // list 可以存放重复数据,并且按照我们存储的顺序来的
list.add("康师傅");
System.out.println(list);
// 删除元素
list.remove("小当家");
System.out.println(list);
// 列表装了多少元素
System.out.println(list.size());
// 查询某个元素
Object obj = list.get(0); // 为保证列表/容器的通用性,所以都是object
String s = (String) obj; // 向下转型,需要强转
System.out.println(s);
//如果此列表包含指定的元素,则返回true
System.out.println(list.contains("福满多"));
}
}
// 输出
[福满多, 小当家, 康师傅, 康师傅]
[福满多, 康师傅, 康师傅]
3
福满多
true
类似遍历数组,只不过要用.get(i)
集合就是数学中的集合的概念:所有的元素都具有唯一的值,元素在其中没有顺序。使用方法与ArrayList类似,与此相比集合中元素唯一且无序(重复数据添加不进去)。不过 TreeSet 根据其元素的自然顺序进行排序。
//模块 java.base
//软件包 java.util
Class HashSet
java.lang.Object
java.util.AbstractCollection
java.util.AbstractSet
java.util.HashSet
//模块 java.base
//软件包 java.util
//实现的所有接口
//Serializable , Cloneable , Iterable , Collection , NavigableSet ,Set , SortedSet
Class TreeSet
java.lang.Object
java.util.AbstractCollection
java.util.AbstractSet
java.util.TreeSet
add()、 remove() 、size() 、contains()
数字到了 set 集合,会变成 int ,但是 int 不是基本数据类型,不能转换成obj,所以存的是Integer。
import java.util.HashSet;
public class Set {
public static void main(String[] args) {
HashSet s = new HashSet();
s.add(234);
s.add(2); // 数字2到了set集合会变成int,但是int不是基本数据类型,不能转换成obj,所以存的是Integer
s.add(147);
s.add(2);
System.out.println(s);
System.out.println(s.contains(2)); // True
System.out.println(s.contains("2")); // False
}
}
传统意义上的Hash表,是能以int做值,将数据存放起来的数据结构。Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象,hash表是以一对值进行存储的(key,value)。HashMap通过散列机制,用来快速访问。
public class HashMap
extends AbstractMap
implements Map, Cloneable, Serializable
V |
put(K key, V value) |
将指定的值与此映射中的指定键相关联。 |
---|---|---|
void |
putAll(Map extends K,? extends V> m) |
将指定映射中的所有映射复制到此映射。 |
Collection |
values() |
返回此映射中包含的值的Collection视图。 |
boolean |
containsKey(Object key) |
如果此映射包含指定键的映射,则返回 |
---|---|---|
boolean |
containsValue(Object value) |
如果此映射将一个或多个键映射到指定值,则返回 |
Set |
keySet() |
返回此映射中包含的键的Set视图。 |
---|
V |
get(Object key) |
返回指定键映射到的值,如果此映射不包含键的映射,则返回 |
---|
public static void main(String[] args) {
HashMap map = new HashMap();
// 增加映射
map.put("jay","周杰伦");
map.put("zly","张靓颖");
map.put("tz","陶喆");
map.put("zbc","周笔畅");
System.out.println(map);
System.out.println(map.containsKey("tz"));
}
{jay=周杰伦, zly=张靓颖, tz=陶喆, zbc=周笔畅} // 映射
true
如果出现相同的Key,原来的数据会被顶掉。
4_Map_哔哩哔哩_bilibili