Java 数据结构与泛型学习笔记
前言
1 常用数据结构
Collection类图(部分)如下
1.1 String
主要介绍String类型及一些主数据类型的方法使用,类方法如上所示,下面记录一些特殊用法
String str = "Hello World!";
String[] strs = str.split("");//字符串转字符串数组
char c = str.charAt(0);//字符串取字符
char[] chars = str.toCharArray();//字符串转字符数组
String str = String.valueOf(chars);//字符数组转字符串
String str = String(chars);//字符数组转字符串
//其他主数据类型转为String
String.valueOf(Object o);
//String转为其他主数据类型
Integer.parseInt(str);
Double.parseFloat(str);
1.2 ArrayList
ArrayList<Object> list = new ArrayList<Object>();
//1.传统遍历
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//2.简洁遍历
for(Object tem:list){
System.out.println(tem);
}
//3.迭代器遍历
Iterator<Object> iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
1.3 HashMap
HashMap<key,value> map = new HashSet<key,value>();
//遍历
public static void main(String[] args) {
// 循环遍历Map的4中方法
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 2);
// 1. entrySet遍历,在键和值都需要时使用(最常用)
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
}
// 2. 通过keySet或values来实现遍历,性能略低于第一种方式
// 遍历map中的键
for (Integer key : map.keySet()) {
System.out.println("key = " + key);
}
// 遍历map中的值
for (Integer value : map.values()) {
System.out.println("key = " + value);
}
// 3. 使用Iterator遍历
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
}
// 4. java8 Lambda
// java8提供了Lambda表达式支持,语法看起来更简洁,可以同时拿到key和value,
// 不过,经测试,性能低于entrySet,所以更推荐用entrySet的方式
map.forEach((key, value) -> {
System.out.println(key + ":" + value);
});
}
1.4 HashSet
Set(集合)防止重复,通过先判断新加入的元素和集合内的元素的hashCode()是否相等再通过a.equals(b)方法判断是否真的相同,所以如果要引入自定义类的实例变量,该类必须覆盖hashCode()和equals()方法。
基础的HashSet,保持集合有序TreeSet(要求集合内元素必须实现Comparable接口,并实现compareTo()方法)。
HashSet<Object> set = new HashSet<Object>();
//1.简洁遍历
for(Object tem:set){
System.out.println(tem);
}
//2.迭代器遍历
Iterator<Object> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
1.5 Vector
Vector vector = new Vector();
//遍历方式同ArrayList,未写明类型同<Object>
2 泛型 <>
主要作用是定义集合的数据类型,以ArrayList为例,E代表用来创建与初始ArrayList的类型,当你看到E时,替换为实际的类型。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public boolean add(E o)
//more codes
}
泛型、数组、多态与传参
设:class Animal;class Dog extends Animal;class Cat extends Animal;
1、当方法参数设定为Animal[]时,可以将存有Dog、Cat对象的Animal[]数组传入方法,并正常编译执行。
2、当方法参数设定为Animal[]时,可以将存有Dog的Dog[]数组传入方法,但不能正常执行。
3、当方法参数设定为ArrayList<Animal 时,只能传入ArrayList<Animal 列表,传入Dog或Cat列表即报错。
4、当通过泛型或万用字符方法定义函数参数时,可以向方法传入多态参数列表。
自定义使用泛型的方法
//只能传入Animal类对象
public void takeThing(ArrayList<Animal> list){}
//泛型定义,可以传入Animal及它的子类对象,Animal可以是类,也可以是接口
public <T extends Animal> void takeThing(ArrayList<T> list){}
//万用字符定义,可以传入Animal及它的子类对象,Animal可以是类,也可以是接口
public void takeThing(ArrayList<? extends Animal> list){}