泛型
概念
一种不确定的数据类型,用以将数据类当作参数传递和返回
达到一种方法可接受多种数据类型的目的
定义
<T,X,....>
使用
在方法上使用
public class Test {
public static void main(Stirng [] args){
Integer i= test(1);
String str=test("123");
Test t=new Test();
Test test=test(t);
}
public static <X> X test(X str){
return str;
}
public static <X,Y> void test01(X x,Y y1,Y y2){
}
}
在类中使用
public class Person<K,Y,Z> extends Object{
private K k;
private Y y;
private Z z;
private String str;
public Person(){
super();
}
public Person(K k,Y y, Z z, String str){
super();
this.k=k;
this.y=y;
this.z=z;
this.str=str;
}
public K getK(){
return K;
}
public void setK(K k){
this.k=k;
}
public Y getY(){
return y;
}
public void setY(Y y){
this.y=y;
}
public Z getZ(){
return z;
}
public void setZ(Z z){
this.z=z;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Person [k=" + k + ", y=" + y + ", z=" + z + ", str=" + str + "]";
}
}
public class Test {
public static void main(String[] args) {
Person<Integer, String, Boolean> person = new Person<Integer, String, Boolean>();
Person<String, Integer, Integer> person2 = new Person<String, Integer, Integer>();
}
}
在接口上使用
public class java{
public static void main(String[] args) {
MyInterfaceTest<String> test = new MyInterfaceTest<String>();
new MyInterface<Integer>() {
@Override
public void test01(Integer k) {
}
@Override
public Integer test02(Integer k) {
return null;
}
};
}
}
interface MyInterface<K>{
void test01(K k);
K test02(K k);
}
class MyInterfaceTest<K> implements MyInterface<K>{
@Override
public void test01(K k) {
}
@Override
public K test02(K k) {
return null;
}
}
泛型的优点
1,省略了强转代码,并且避免了强制转换产生的数据丢失等情况
2,可以把运行时的问题提前到编译时期
集合
集合框架图(来自菜鸟教程)
概念
存储一组数据类型相同的数据(只能是引用数据类型),长度可变
体系
Collection:接口
特点:无序(存入顺序与取出顺序不同),无下标
方法:
增:
boolean add(E e) 增加一个数据
boolean addAll(Collection <? extends E> c):将子集合中的数据添加到集合中
删:
boolean remove(Object o);删除一个数据
boolean removeAll(Collection <?> c); 将子集合中所有数据从集合中删除
void clear(); 清空集合
查:
int size(); 获取集合中元素的个数
boolean contains(Object o); 判断指定元素是否存在集合中
boolean containsAll(Collection<?> c); 判断子集合中所有数据是否都在集合中
Iterator<E> iterator(); 迭代器
其他:
boolean isEmpty();判断集合中是否不存在元素
Object[] toArray(); 将集合中转换为数组
子接口:List
特点:有序,有下标
子类特有的方法
增:
一次插入一个数据,1参为插入位置 2参为插入数据
void add(int index, E element);
一次插入一组数据, 1参插入开始位置 2参插入数据
void addAll(int index, Collection<? extends > c);
删:
按照下标删除指定位置的数据
E remove(int index);
改:
修改指定位置的数据,1参下标,2参修改后的数据
E set(int index);
查:
获取指定位置的数据,参数下标
E get(int index);
子类
ArrayList jdk1.2出现,线程不安全
数据结构:数组
特点:查询快,增删慢
Vector jdk1.0出现,线程安全
数据结构:数组
LinkedList jdk1.2出现,线程不安全
数据结构:链表
特点:增删快,查询慢
子接口Set
特点:无序,无下标,不可重复
子类特有方法:无
子类:
HashSet jdk1.2出现,线程不安全
数据结构:链表+红黑树(基于哈希表)
LinkedHashSet jdk1.4,线程不安全
数据结构:链表+红黑树(基于哈希表)+链表
特点:有序
TreeSet
数据结构:链表+红黑树
方案一:
数据自身拥有比较性
步骤1:让存储的数据所属的类实现Comparable
步骤2:重写 compareTo 方法
方法二:
提供比较器
创建 TreeSet 对象时,传入比较器的对象(可通过匿名内部类来实现)
关于List和Set的子集的toString()方法
List和Set子集并没有重写 toString() 方法但是在生成子集对象后通过子集对象调用 toSatring() 方法后发现 toString() 方法被重写,是因为List和Set继承了 AbstractList 和AbstractSet ,这两者继承了 AbstractCollection 类,该类对 toString() 进行了重写
Map与其相识
操作集合的工具类:Collections
用以操作集合的工具类
常用方法:
Collections.sort(list);
Collections.reverse(list);
Integer max=Collections.max(list);
Integer max=Collections.max(list);
Map接口(字典)
概念
存储一组数据类型相同的数据,长度可变
数据的要求:键值对应
体系
Map(接口)
HashMap(类)
特点:链表+红黑树(哈希表),线程不安全,1.2
HashTable(类)
特点:链表+红黑树(哈希表),线程安全,1.0
Properties(类)
TreeMap(类)
特点:链表+红黑树
注意:
TreeMap存储数据,键(key)要么拥有比较性,要么在创建TreeMap时传入比较器
Map的方法
特点: 存储的数据格式为键值对应
方法:
增
V put(K key, V value);
注意:如果字典中key不存在,则是添加,如果key存在,那么将修改key对应的value
void putAll(Map<? extends K, ? extends V> m);
删
V remove(Object key);
void clear();
改
V put(K key, V value);
查
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
Entry中的方法:
K getKey();
V getValue();