集合框架2
1、ArrayList去除重复字符串
思路:创建一个新的集合,然后将旧集合的内容遍历放入新集合,如果新集合里不存在该元素就放入,存在就不要了
publicstaticvoid main (String[] args){
ArrayList list=newArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
ArrayList newList=getSingle(list);
System.out.println(newList);
}
/**
* 创建新集合将重复元素去掉
* 1、明确返回值类型,返回ArrayList
* 2、明确参数列表ArrayList
*/
- publicstaticArrayList getSingle(ArrayList list){
ArrayList newList =newArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!newList.contains(obj)){
newList.add(obj);
}
}
return newList;
}
}
2、ArrayList去除重复的自定义对象
contains依赖于equals方法,所以需要在person类中重写equals方法
注意:remove方法的底层同样依赖于equals方法:
3、LinkedList特有功能
4、栈和队列
栈:先进后出
队列:先进先出
5、LinkedList模拟栈数据结构的集合并测试
publicclassStack{
privateLinkedList list =newLinkedList();
// 模拟进栈方法
publicvoid in(Object obj){
list.addLast(obj);
}
// 模拟出栈方法
publicObject out(){
return list.removeLast();
}
// 模拟栈结构是否为空
publicboolean isEmpty(){
return list.isEmpty();
}
}
publicstaticvoid main(String[] args){
//demo1();
Stack s=newStack();
s.in("a");
s.in("b");
s.in("c");
s.in("d");
while(!s.isEmpty()){
System.out.println(s.out());
}
}
6、泛型概述和基本使用
<>标识了集合只能存储某该类引用数据或者该类的子类型,所有对象都继承object,泛型不定义为object,无意义
类型转换异常:将类型转换成非该类型实例时出现类型转换异常:运行期错误
注意:it.next()只能调用一次,如果多次会让指针向后移动多次
泛型注意事项:
7、泛型的由来
种瓜得瓜种豆得豆
8、泛型类的概述及其使用
9、泛型方法的概述和使用
非静态方法:方法泛型需要与类的泛型一致;如果不一致,需要在方法上声明该泛型:
静态方法:必须声明自己的泛型,因为静态方法是随着类的加载而加载的,非静态方法是在创建对象的时候赋值
10、泛型接口的使用
两种方法:推荐用第一种
11、泛型高级之通配符
12、增强for循环的概述和使用
底层依赖的是迭代器iterator
13、三种迭代的能否删除
publicstaticvoid main(String[] args){
// TODO Auto-generated method stub
ArrayList<String> list=newArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
//1、普通for循环版删除
for(int i=0;i<list.size();i++){
if("b".equals(list.get(i))){
list.remove(i--);
}
}
System.out.println(list);
}
//2、迭代器删除
Iterator<String> it=list.iterator();
while(it.hasNext()){
if("b".equals(it.next())){
//list.remove("b");不能用集合的删除方法,迭代过程中如果修改会出现【并发修改异常】
it.remove();
}
}
System.out.println(list);
}
//3、增强for循环,不能删除,只能遍历,因为底层由迭代器实现的
for(String string:list){
if("b".equals(string)){
list.remove("b");
}
}
System.out.println(list);
}
14、静态导入的概述和使用
静态导入后,Arrays.sort的前缀可以省略不写直接写sort
15、可变参数的概述和使用
publicclassChangeableArgs_Demo2{
publicstaticvoid main(String[] args){
// TODO Auto-generated method stub
int[] arr={11,22,33,44,55};
//print(arr);
print(11,22,33);
}
// public static void print(int[] arr){
// for(int i=0;i<arr.length;i++){
// System.out.println(arr[i]);
// }
// }
publicstaticvoid print(int...arr){//可变参数是一个数组
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
16、Arrays工具类的aslist方法的使用
publicstaticvoid main(String[] args){
//demo1();
//demo2();
//集合转数组,加泛型的
ArrayList<String> list=newArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
String[] arr = list.toArray(newString[6]);//当集合转换数组时,数组的长度如果是<=集合的size值,转换后的数组长度等于集合
//如果数组的长度>集合的size值,那分配的数组长度就和指定的长度相同
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
publicstaticvoid demo2(){
// int[] arr={11,22,33,44,55}; 基本数据类型的数组转换成集合,会将整个数组当做一个对象进行转换
// List<int[]> list=Arrays.asList(arr);
// System.out.println(list);
Integer[] arr={11,22,33};//想将数组转换成集合,数组必须是引用数据类型
List<Integer> list=Arrays.asList(arr);
System.out.println(list);
}
publicstaticvoid demo1(){
String[] arr={"a","b","c"};
List<String> list=Arrays.asList(arr);//将数组转换成集合
//list.add("d"); 不能添加
System.out.println(list);
}
17、ArrayList嵌套
publicclassArrayListArrayList_demo1{
/**
* 集合嵌套
* 学科分为若干个班级
* 整个学科是一个大集合
* 若干个班级分为每一个小集合
* @param args
*/
publicstaticvoid main(String[] args){
ArrayList<ArrayList<Person>> list=newArrayList<>();
ArrayList<Person> first =newArrayList<>();
first.add(newPerson("张三",23));
first.add(newPerson("李四",24));
first.add(newPerson("王五",25));
ArrayList<Person> second =newArrayList<>();
second.add(newPerson("大黄",3));
second.add(newPerson("豆豆",4));
second.add(newPerson("小呆",5));
//将班级添加到学科集合中
list.add(first);
list.add(second);
//遍历学科集合
for(ArrayList<Person>a : list){
for(Person p:a){
System.out.println(p);
}
}
}
}