程序地带

JavaSE基础——(16)List集合


目录


一、去除ArrayList重复字符串


二、LinkedList特有功能


 三、栈和队列


四、用LinkedList模拟栈数据结构


五、泛型


5.1泛型的基本概述


5.2泛型的好处


5.3泛型的使用


5.4ArrayList存储字符串使用泛型遍历


5.5泛型的由来


六、泛型类


6.1泛型类概述与使用


6.2泛型方法概述与使用


6.3泛型通配符


七、增强for循环


7.1增强for循环的概述和使用


7.2三种迭代是否能删除


八、静态导入


九、可变参数


9.1可变参数概述与使用


9.2Arrays工具类的asList()方法


十、集合的嵌套ArrayList


 


一、去除ArrayList重复字符串
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest {
public static void main(String []args){
ArrayList list=new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
ArrayList newList=getSingle(list);
System.out.println(newList);
}
public static ArrayList getSingle(ArrayList list){
ArrayList newList=new ArrayList<>();
Iterator it=list.iterator();
while(it.hasNext()){
Object obj=it.next();
if(!newList.contains(obj)){
newList.add(obj);
}
}
return newList;
}
}


 


二、LinkedList特有功能
public void addFirst(E e)//将元素添加到链表头部
public void addLast(E e)//将元素添加到链表尾部
public E getFirst()//获取链表头部元素
public E getLast()//获取链表尾部元素
public E removeFirst()//删除链表头部元素,并返回删除的元素
public E removeLast()//删除链表尾部元素,并返回删除的元素
public E get(int index)//获取指定索引处的元素

 


 三、栈和队列

先进后出队列
先进先出

 


四、用LinkedList模拟栈数据结构
import java.util.LinkedList;
public class ListTest {
public static void main(String []args){
Stack stack=new Stack();
stack.in("a");
stack.in("b");
stack.in("c");
while(!stack.isEmpty()){
System.out.println(stack.out());
}
}
}
class Stack{
private LinkedList list=new LinkedList();
//模拟进栈
public void in(Object obj){
list.add(obj);
}
//模拟出栈
public Object out(){
return list.removeLast();
}
//判断栈元素是否为空
public boolean isEmpty(){
return list.isEmpty();
}
}


 


五、泛型
5.1泛型的基本概述

泛型,即“参数化类型”,


就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,


在java中我们一般用<>表示,<>中为引用数据类型,


其作用是限定了集合存储的数据类型,或者说类中操作的数据类型,


 


5.2泛型的好处
提高安全性,将运行期的错误转换到编译期省去强转的麻烦

 


5.3泛型的使用
public class PatternTest {
public static void main(String []args){
ArrayList<Student> list=new ArrayList<Student>();
list.add(new Student("测试1",20));
list.add(new Student("测试2",21));
list.add(new Student("测试3",22));
list.add(new Student("测试4",23));
Iterator<Student> it=list.iterator();
while(it.hasNext()){
Student stu=it.next();
System.out.println(stu.getName()+" "+stu.getAge());
}
}
}


注意,前后的泛型必须一致,或者后面的泛型可以省略不写,但是尖括号不可以省略<>,


泛型也不要定义成Object,没有意义。


 


5.4ArrayList存储字符串使用泛型遍历
public class PatternTest {
public static void main(String []args){
ArrayList<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}


 


5.5泛型的由来

早期的Object类型可以接受任意的对象类型,


但是在实际的使用中,会有类型转换的问题,也就存在着隐患,


如果在进行类型转换时两个类型不匹配,那么就会抛出ClassCastException,


所以java提供了泛型来解决这个安全问题。


 


六、泛型类
6.1泛型类概述与使用

将泛型定义在类上,在定义类的时候指定一个类型形参T,


在类中T就当作类型来使用,比如,


class myPattern<T>{
private T t;
public myPattern(T t) {
this.t=t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}

 


6.2泛型方法概述与使用

将泛型定义在方法上,定义的格式如下,


public <泛型类型> 返回值类型 方法名(泛型类型 形参名)

比如,


public <T> void show(T t){
System.out.println(t);
}

注意,这里的方法泛型最好与类的泛型一致,如果不一致,需要在方法上声明该泛型。


但是如果为静态方法时,则方法的泛型不能与类泛型一致,必须要声明自己的泛型!


 


6.3泛型通配符

泛型通配符通常表示为:<?>,


它表示任意类型,如果没有明确,则为Object以及任意的Java类,


List<?> list=new ArratList<String>();//当右边的泛型是不确定时,左边可以指定为?

 


七、增强for循环
7.1增强for循环的概述和使用

增强for是用来简化数组和Collection集合的遍历,比如,


//遍历数组
int arr[]={1,2,3};
for(int i:arr){
System.out.println(i);
}
//遍历集合
ArrayList<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
for(String i:list){
System.out.println(i);
}


 


7.2三种迭代是否能删除
普通for循环:可以删除,但是索引要自减迭代器:可以删除,但是必须要使用迭代器自身的remove方法,否则会出现并发修改异常增强for循环:不可以删除,只能遍历
ArrayList<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
//for循环删除,索引要--
for(int i=0;i<list.size();i++){
if("b".equals(list.get(i))){
list.remove(i--);
}
}
//迭代器删除,用迭代器自身的remove方法
Iterator<String> it=list.iterator();
while(it.hasNext()){
if("b".equals(it.next())){
it.remove();
}
}
//增强for循环不可以删除,只能遍历
for(String str:list){
if("b".equals(str)){
list.remove("b");
}
}
System.out.println(list);

 


八、静态导入

之前我们已经学习了导包,导包是导入一个类,


而这里的静态导入,导入的是一个静态方法,格式如下,


import static 包名.类名.方法名

这个方法必须是静态的,如果有多个同名的静态方法,容易不知道是使用哪个类中的方法,这个时候必须要加类前缀,一般不使用,


import static java.util.Arrays.sort;
public class StaicImportTest {
public static void main(String []args){
int arr[]={5,7,4,9,0,1,6,2,8,3};
sort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}


 


九、可变参数
9.1可变参数概述与使用

如果在定义方法的时候不知道该定义多少个参数,那么我们就会使用可变参数,


使用格式为,


修饰符 返回值类型 方法名(数据类型... 变量名){}

这里的变量名就代表了一个数组,可变参数其实和数组类似,但是功能比数组更强大,


可变参数不仅可以接受数组地址作为参数,还可以接受一个实际意义上的数组比如{1,2,3},还可以什么都不给,


public static void main(String []args){
int arr[]={5,7,4,9,0,1,6,2,8,3};
print(arr);
print(1,2,3);
}
public static void print(int... arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}


如果一个方法有可变参数,并且有多个参数,那么可变参数一定要放在最后一个位置。


 


9.2Arrays工具类的asList()方法
static List<T> asList(T... a)//返回一个受指定数组支持的固定大小的列表

这里asList()方法返回值类型是一个集合,接受的参数数组a,功能是将一个数组转换为集合,


这里就用到了可变参数,我们看看这个功能具体如何使用,


String str[]={"a","b","c"};
List list= Arrays.asList(str);
System.out.println(list.toString());


注意,数组转换成集合之后,不能增加删除元素!但是可以使用其他的集合方法。


如果将基本数据类型的数组转换成集合,他会将整个数组当作一个对象转换,也就是会输出数组的地址,


如果一定要将基本数据类型的数组转换成集合,可以换成基本数据类型包装类比如Integer等。


 


十、集合的嵌套ArrayList

例:我们将一个年级分为若干个班级,班级里有不同的学生,整个年级为一个大集合,而班级又为每个小集合,


这样大集合里面就会嵌套小集合,我们看看如何实现,


ArrayList<ArrayList<Student>> gradeSeven=new ArrayList<>();
ArrayList<Student> classOne=new ArrayList<>();//一班
classOne.add(new Student("一班测试1",20));
classOne.add(new Student("一班测试2",21));
classOne.add(new Student("一班测试3",22));
ArrayList<Student> classTwo=new ArrayList<>();//二班
classTwo.add(new Student("二班测试1",20));
classTwo.add(new Student("二班测试2",21));
//将班级添加到学校中
gradeSeven.add(classOne);
gradeSeven.add(classTwo);
//遍历年级集合,输出年级中的每个人
for(ArrayList<Student> i:gradeSeven){
for(Student j:i){
System.out.println(j);
}
}


 


 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39478524/article/details/112689237

随机推荐

PIL Image resize 调整大小谜之操作

玩Yolo-V3,得到了boundingbox然后想把它们绘制到图片上,网络的输入时608*608的,但是测试图片是602*452的,PIL转t...

Alex 007 阅读(457)

指针连接两个字符串_极限Redis (3) 动态字符串

Redis是使用C语言开发的,C语言中的字符串大都是通过字符数组实现的,但是使用字符数组有以下不足:字符数组的长度都是固定,容易发生空指针获取字...

weixin_39716703 阅读(648)

指针嵌套指针 拷贝_二级指针的作用详解

一、概念在如下的A指向B、B指向C的指向关系中:首先C是"一段内容",比如你用malloc或者new分配了一块内存,然后塞进去"一段内容",...

weixin_39682301 阅读(900)

指针连接两个字符串_C语言字符串的命令行参数

在图形界面普及之前都使用命令行界面。DOS和UNIX就是例子。Linux终端提供类UNIX命令行环境。命令行(command-line)是在命令行环境中,用户为运行程序输入命令的行。假设...

weixin_39654619 阅读(715)

comparable和comparator的区别

相同点:两个都是接口都是实现比较的返回值都是a>b返回正整数,a=b返回0,a<b返回负数。不同点:comparable位于java.la...

性感程序员 阅读(935)

pdf拼版插件_pdf文件中的文字批量转曲的办法

如果PDF格式文件仅仅用于传阅,文件件中的文字转不转曲不会有多大区别,不会影响阅读。但是如果文件用于印刷,从一个电脑传送到另外一台电脑上后,对方...

weixin_39958025 阅读(817)