目录
一、内部类
1.内部类与外部类
//外部类
public class A{
//内部类:定义在类中的类统称为内部类
//1.成员内部类:写在类成员位置上
public class B{
}
public void cFunc(){
//2.局部内部类:常用的类型,写在成员函数中
class C {
}
}
}
2.匿名局部类
定义:没有名字的局部内部类
位置: 方法或方法的形参列表中
本质:继承类或者实现接口的匿名子类对象
//抽象父类
public abstract class Person {
public abstract void study();
}
public class Test {
public static void main(String[] args){
//匿名内部类,本质是对象
new Person(){
@Override
public void study() {
System.out.println("study");
}
}.study();
}
}
二、集合
1.集合各类接口
集合:
1.单列集合顶层接口Collection:
继承
------>List
继承
------>ArrayList
------>LinkedList
------>Vector
------>Set
------>HashSet
------>LinkedHashSet
------>TreeSet
2.双列集合顶层接口Map:
继承
------>HashMap
------>HashTable
------>HashTree
2.Collection
Collection是顶层接口类,含有所有单列集合共性的内容,其子类相应增加特性内容
List接口:有序、可重复
Set接口:无序、唯一
--Collection共性内容
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
//测试Collection接口功能
public class Test {
public static void main(String[] args){
//集合的顶层都是接口, 例如: Collection, List, Set, Map
//故不能直接创建Collection,用其子类ArrayList多态创建
//泛型<>一般结合集合使用,用于限定数据类型,后面泛型可不写
Collection <String> ct = new ArrayList<String>();
ct.add("a");//增加元素
ct.add("b");
ct.add("c");
System.out.println(ct);//ArrayList类重写了toString()
System.out.println(ct.size());//返回Collection元素个数
ct.remove("a");//移除元素
System.out.println(ct);
System.out.println(ct.isEmpty());//是否为空
System.out.println(ct.contains("b"));//是否包含元素
ct.clear();//清空元素
System.out.println(ct);
ct.add("a");
ct.add("b");
ct.add("c");
//ct.iterator()会创建一个该类对应的迭代器,该迭代器继承Iterator接口
//多态创建迭代器对象
Iterator <String> iterator = ct.iterator();
while(iterator.hasNext()) {
//迭代过程不能对Collection进行修改,因为迭代器不知道,会报错
System.out.println(iterator.next());
}
//增强for遍历,底层为普通迭代器,也不能对Collection进行修改
for(String i:collection){
System.out.println(i);
}
}
}
3.List
特点:有序、可重复、有索引
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class Test {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("a");//增加元素
list.add("b");
list.add("d");
System.out.println(list);
list.add(2,"c"); //在指定索引添加元素
System.out.println(list);
list.remove(0);//移除指定索引元素
System.out.println(list);
list.set(0,"a");//修改指定索引元素
System.out.println(list);
//Collection通用遍历方法,快捷键itit
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("");
for(String i:list){
System.out.println(i);
}
System.out.println("");
//List遍历方法,快捷键itli
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
System.out.println("");
//List对应迭代器ListIterator
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String next = listIterator.next();
System.out.println(next);
}
System.out.println("");
while (listIterator.hasPrevious()) {
String previous = listIterator.previous();
System.out.println(previous);
}
System.out.println("");
//ListIterator可以对列表进行操作
while(listIterator.hasNext()){
String next = listIterator.next();
System.out.println(next);
//在改元素后添加
if("a".equals(next)){
listIterator.add("add");
}
}
System.out.println(list);
System.out.println("");
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
//在列表末尾添加
if("a".equals(s)){
listIterator.add("add");
}
}
System.out.println(list);
System.out.println("");
//用CopyOnWriteArrayList类可在迭代时对列表操作
CopyOnWriteArrayList<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
copyOnWriteArrayList.add("a");
copyOnWriteArrayList.add("b");
copyOnWriteArrayList.add("c");
Iterator<String> iterator = copyOnWriteArrayList.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
if("a".equals(next)){
copyOnWriteArrayList.add("d");
}
}
System.out.println(copyOnWriteArrayList);
}
}
4.ArrayList与LinkedList
ArrayList的特点: 数据结构为数组, 查询和修改快, 增删慢。
LinkedList的特点:数据结构为链表,查询和修改慢,增删快。
ArrayList与List所有的功能类似,不再重复
LinkedList
import java.util.LinkedList;
public class Test {
public static void main(String[] args){
LinkedList<String> linkedList = new LinkedList<>();
linkedList.addFirst("b");
linkedList.addFirst("a");
linkedList.addLast("c");
System.out.println(linkedList);
System.out.println("");
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
System.out.println("");
System.out.println(linkedList.removeFirst());
System.out.println(linkedList.removeLast());
System.out.println(linkedList);
}
}
5.Set
--Hash哈希
Set通过哈希值找到目标对象地址
JDK根据对象的地址值, 或者字符串, 或者数字算出来的int类型的数值为哈希值
类中需要用到哈希值时,子类需要重写hashCode()方法计算哈希值
同种类属性值相同,则计算的哈希值也会相等
import java.util.Objects;
public class Person {
private String name;
private int num;
public Person(String name, int num) {
this.name = name;
this.num = num;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return num == person.num &&
Objects.equals(name, person.name);
}
//重写了哈希函数
@Override
public int hashCode() {
return Objects.hash(name, num);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
}
public class Test {
public static void main(String[] args){
Person person1 = new Person("张三",11);
Person person2 = new Person("张三",11);
Person person3 = new Person("李四",10);
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
System.out.println(person3.hashCode());
//特殊值哈希值相同
System.out.println("重地abc".hashCode());
System.out.println("通话abc".hashCode());
System.out.println("儿女".hashCode());
System.out.println("农丰".hashCode());
}
}
6.Map
Map是双列集合的顶层接口, 用来存储键值对对象, 键是唯一的, 值可以重复。
import java.util.*;
public class Test {
public static void main(String[] args){
Map<String,String> map = new HashMap<>();
map.put("张三","2020");
map.put("李四","2021");
map.put("王五","2021");
System.out.println(map);
System.out.println(map.size());
System.out.println(map.containsKey("张三"));
System.out.println(map.containsValue("2021"));
System.out.println(map.isEmpty());
System.out.println(map.get("张三"));
//遍历hashmap
System.out.println("");
Set<String> key = map.keySet();
for(String i:key){
System.out.println(i);
System.out.println(map.get(i));
}
System.out.println("");
Collection<String> value = map.values();
for(String i:value){
System.out.println(i);
}
System.out.println("");
Set<Map.Entry<String,String>> entrys = map.entrySet();
for(Map.Entry<String,String> entry:entrys){
System.out.println(entry.getKey() + entry.getValue());
}
System.out.println("");
map.remove("李四");
System.out.println(map);
map.clear();
System.out.println(map);
}
}
7.Collections工具类
import java.util.*;
public class Test {
public static void main(String[] args){
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(11);
arrayList.add(44);
arrayList.add(55);
arrayList.add(22);
Collections.sort(arrayList);
System.out.println(arrayList);
Collections.reverse(arrayList);
System.out.println(arrayList);
Collections.shuffle(arrayList);
System.out.println(arrayList);
}
}