ArrayList存储元素去重:
思路:
A:创建一个新的集合对象。
B:通过老集合获取一个迭代器对象,然后遍历老集合。
C:判断新集合中是否包含当前遍历到的元素,
如果包含,不添加,
如果不包含,就把该元素添加到新集合中。
自定义方法名:getSingle();
案例1:ArrayList存储字符串如何去除重复元素
案例2:ArrayList存储自定义对象如何去除重复元素
注意:对象的成员变量值相同,我们就认为他是同一个元素
示例:
自定义对象:用Person类来做,name,age属性
list.add(new Person("张三",25));
list.add(new Person("张三",25));
list.add(new Person("李四",26));
list.add(new Person("王五",27));
list.add(new Person("王五",27));
list.add(new Person("王五",27));
解题思路:
注意事项:
contains()方法判断集合中是否包含某个元素,或者remove()移除集合中的某个元素,这两个方法的底层都是调用了equals()方法,所以我们要在基本类(Person类)中重写equals()方法。
LinkedList:
void addFirst() 和 addLast() 添加
Object removerFirst() 和 removeLast(); 删除
Object getFirst() 和 getLast(); 获取
Object get(int index);
数据结构:
栈:先进后出。
队列:先进先出。
面试题:用LinkedList来模拟栈的数据结构。 1 2 3
思路:自己封装一个集合类,然后提供,进栈,出栈,判断栈结构是否为空三个方法就可以了。
class Stack{
private LinkedList list = new LinkedList();
//进栈
public void in(){
list.addLast();
}
//出栈
public Object out(){
list.removeLast();
}
//判断栈结构
public boolean isEmpty(){
list.isEmpty();
}
}
泛型:
概述:泛指某种类型。
好处:
1、提高安全性。(把运行期异常转移到编译期)
2、不用强转了。
泛型的格式:
<> <>中的数据类型必须是引用类型
注意事项:
1、前后泛型必须一致,或者后边的泛型可以不写。
ArrayList<String> list = new ArrayList<String>();
案例:ArrayList存储字符串、自定义对象并遍历(泛型版)
泛型的由来:
以前的集合能存的是Object类型的数据,这样什么类型的数据都可以存进集合了。
但是好多时候我们要做类型转换,这样就不安全。而泛型就是来解决这个问题的
泛型类:
格式:
在类名后边加泛型即可。
class Person<T> { //type
public void show(T t){
}
public <V> void method(V v){
}
public static <B> void function(B b){
}
}
泛型方法:
注意:方法的泛型最好和类型的泛型一致。
分类:
非静态方法:
1、泛型可以与类的泛型一直,这样不用定义自己的泛型。
public void show(T t) { }
2、泛型与类的泛型不一致,需要定义自己的泛型。
public <V> void method(V v) { }
静态方法:
必须定义自己的泛型,为什么?
因为静态成员是随着类的加载而加载的,类加载的时候,对象还没有创建。
格式:
public static <B> void function(B b){ }
泛型接口:
格式:
interface Smoke<T>{
void smoke(T t);
}
实现方式:
1、用普通类来实现。
class Demo1 implements Smoke<Student> { //较常用
public void smoke(Student s){
}
}
class Demo2 implements Smoke<Teacher> {
public void smoke(Teacher t){
}
}
2、用泛型类来实现。
class Test<T> implements Somke<T> {
public void somke(T t){
}
}
通配符:<?>
向下限定
? extends E E及其子类
向上限定
? super E E及其父类
集合加强:
增强for:
格式:
for(元素的数据类型 变量名 : 数组或者集合名){
//具体的功能代码
}
ArrayList<String> list = new ArrayList<String>();
案例:ArrayList存储字符串、自定义对象并遍历(增强for版)
遍历集合:
1、普通for: get(),size()方法
2、迭代器。
3、增强for。
底层是依赖于迭代器的。
问:这三种遍历方式能不能在遍历集合的同时,删除集合中的元素。
A:普通for。
可以。但是注意索引要--。 (看需求)
B:迭代器。
可以。但是要调用迭代器的remove()方法,不要调用集合的remove()方法。
注意:
遍历集合的同时,往集合中添加元素,
如果使用的是普通的迭代器,是不可以的,会报并发修改异常。
如果使用的是列表迭代器,是可以的,但是要使用列表迭代器中的add()方法。
C:增强for。
不可以。
可变参数:
什么时候使用?
定义的方法,不知道形参的个数的时候就可以考虑使用。
格式:
修饰符 返回值类型 方法名(数据类型... 变量名){ //int... b
}
注意事项:
1、可变参数底层其实是一个数组。
2、如果方法有多个参数,并且有可变参数时候,可变参数必须放参数列表最后。
集合和数组之间的相互转换:
集合转数组:
toArray();
注意:
如果数组的长度大于集合的长度,转换后的数组长度是数组自己的长度。
如果数组的长度小于等于集合的长度,转换后的数组长度是集合的长度。
示例:
集合:10 20 30 (Integer)
数组长度是5: 10 20 30 null null
数组长度是3: 10 20 30
数组长度是2: 10 20 30
数组转集合:
Arrays类中的asList()。
注意:
数组转成集合后,集合中的元素不能添加或删除。
要转集合的数组必须是引用类型,如果基本类型,会直接吧该基本类型的数组当做集合中的一个元素。
ArrayList集合的嵌套:
关键点:
1、创建一个学科集合。
ArrayList<ArrayList<Person>> list = ArrayList<>();
2、遍历的时候,通过增强for的嵌套遍历,获取到每一个学员,然后输出学员的信息。
|
|