Java基础(7)-集合类3

浏览: 1236

list集合的特点

1)有序(存储和取出的元素一直)
2)可重复

List子类的特点

ArrayList

  • 有序,可重复
  • 底层数据结构是数组
  • 查询快,增删慢
  • 线程不安全,效率高

Vector

  • 有序,可重复
  • 底层数据结构是数组
  • 查询快,增删慢
  • 线程安全,效率低

LinkedList

  • 有序,可重复
  • 底层数据结构是双向循环链表
  • 查询慢,增删快
  • 线程不安全,效率高

list存储字符串并遍历

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest1{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

//创建字符串并添加字符串
list.add("wu");
list.add("jia");
list.add("dong");

//遍历集合
Iterator it = list.iterator();
while(it.hasNext()){
String s = (String) it.next();
System.out.println(s);
}
}

}

-----------------------------
输出结果
wu
jia
dong
-------------------------------

练习:list存储自定义对象并遍历

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class ListDemo2{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

Student s1 = new Student("wu",21);
Student s2 = new Student("jia",22);
Student s3 = new Student("dong",23);

list.add(s1);
list.add(s2);
list.add(s3);

Iterator it = list.iterator();
while(it.hasNext()){
Student s = (Student) it.next();
System.out.println(s);
}
}
}


class Student{
//成员变量
private String name;
private int age;

//无参构造方法
public Student(){
super();
}

//有参构造方法
public Student(String name,int age){
this.name = name;
this.age = age;
}

//setXxx()方法和getXxx()方法
public void setName(String name){
this.name = name;
}

public String getName(){
return name;
}

public void setAge(int age){
this.age = age;
}

public int getAge(){
return age;
}

//toString()方法
public String toString(){
return "Student [name="+name+",age="+age+"]";
}
}

--------------------------------------
输出结果
Student [name=wu,age=21]
Student [name=jia,age=22]
Student [name=dong,age=23]
-------------------------------------

List集合特有的功能

1)添加功能

void add(int index, Object element):在指定位置添加元素

2) 获取功能

Object get(int index):获取指定位置的元素

3)列表迭代器

ListIterator listIterator():List集合特有的迭代器

4)删除功能

Object remove(int index):根据索引删除元素,返回被删除的元素

5)修改功能

Object set(int index, Object element):根据索引修改元素,返回被修改的元素

示例:

向指定位置添加元素

/*
*void add(int index,Object element):在指定位置添加元素
*/


import java.util.ArrayList;
import java.util.List;

public class ListDemo3{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("hadoop");
list.add("spark");
list.add("storm");

System.out.println("最先的list:"+list);

//向指定位置添加元素
list.add(1,"data");

System.out.println("指定位置添加元素后的list:"+list);
}
}

-------------------------------------
输出结果
最先的list:[hadoop, spark, storm]
指定位置添加元素后的list:[hadoop, data, spark, storm]
---------------------------------------

get()方法获取指定元素和list的遍历

import java.util.List;
import java.util.ArrayList;

public class ListDemo4{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

//添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");

//get()方法获取指定位置的元素
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println("----------------------");

//for循环改进
//遍历的方式是size()和get()
for(int i = 0;isize();i++){
System.out.println(list.get(i));
}


}
}

--------------------------------------
输出结果
aaa
bbb
----------------------
aaa
bbb
ccc
ddd

--------------------------------------

list存储自定义对象并遍历

import java.util.List;
import java.util.ArrayList;

public class ListDemo5{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

Student s1 = new Student("www",21);
Student s2 = new Student("jjj",22);
Student s3 = new Student("ddd",24);

list.add(s1);
list.add(s2);
list.add(s3);

for(int i=0;isize();i++){
System.out.println(list.get(i));
}
}
}


class Student{
//成员变量
private String name;
private int age;

//无参构造方法
public Student(){
super();
}

public Student(String name,int age){
this.name = name;
this.age = age;
}

//get和set方法
public void setName(String name){
this.name = name;
}

public String getName(){
return name;
}

public void setAge(int age){
this.age = age;
}

public int getAge(){
return age;
}

public String toString(){
return "Student [name="+name+",age="+age+"]";
}
}

-------------------------------------
输出结果
Student [name=www,age=21]
Student [name=jjj,age=22]
Student [name=ddd,age=24]
---------------------------------------------
也可用迭代器去遍历

列表迭代器ListIterator

/*
*列表迭代器:
ListIterator listIterator():List集合特有的迭代器
该迭代器继承了Iterator迭代器,所有可以直接使用hasNext()和next()方法
*/



import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class ListDemo6{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("hive");
list.add("habase");
list.add("sqoop");
/*
Iterator it = list.iterator();
while(it.hasNext()){
String s = (String) it.next();
System.out.println(s);
*/


ListIterator it = list.listIterator();
while(it.hasNext()){
String s = (String) it.next();
System.out.println(s);


}
}

}


=-------------
输出结果
hive
habase
sqoop
----------------------


/*
特有功能
Object previous():获取上一个元素
boolean hasPrevious():判断是否有元素
注意:ListIterator可以实现逆向遍历,但须先正向遍历,所以无意义,不使用
*/

import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
public class ListDemo6{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("hive");
list.add("habase");
list.add("sqoop");

ListIterator it = list.listIterator();

while(it.hasNext()){
String s = (String) it.next();
System.out.println(s);
}
System.out.println("-----------------------");
//逆向遍历
while(it.hasPrevious()){
String s = (String) it.previous();
System.out.println(s);
}


}

}

----------------------------------
输出结果
hive
habase
sqoop
-----------------------
sqoop
habase
hive

---------------------------------

并发修改异常:ConcurrentModificationException

/*
一个集合,判断是否有"cccc"这个元素,如果有添加一个“wujiadong”元素

该异常产生原因:迭代器是依赖于集合而存在,在判断成功后,集合中添加了新元素,而迭代器却不知道,所以报错。即迭代器遍历元素时,通过集合不能修改元素


*/




import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;

public class ListDemo7{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");

ListIterator it = list.listIterator();
while(it.hasNext()){
String s = (String) it.next();
if("cccc".equals(s)){
list.add("wujiadong");
}
}
System.out.println(list);

}
}

------------------------------------------
输出结果
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at ListDemo7.main(ListDemo7.java:17)

注释:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常
------------------------------------------

解决方法
1)迭代器遍历元素,迭代器修改元素
2)集合遍历元素,集合修改元素

/*
方式1:用迭代器,元素时添加在刚才迭代的元素后面
*/
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;

public class ListDemo7{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");

ListIterator it = list.listIterator();//注意这里不能用Iterator,该接口中不含add方法
while(it.hasNext()){
String s = (String) it.next();
if("cccc".equals(s)){
it.add("wujiadong");//通过迭代器添加元素
}
}
System.out.println(list);

}
}

------------------------------------------
输出结果
[aaaa, bbbb, cccc, wujiadong, dddd]
-------------------------------------------
/*
方式2:用集合,元素添加在最后
*/

import java.util.List;
import java.util.ArrayList;

public class ListDemo7{
public static void main(String[] args){
//创建集合对象
List list = new ArrayList();

list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");

for(int i=0;i<list.size();i++){
String s = (String) list.get(i);
if("cccc".equals(s)){
list.add("wujiadong");
}
}
System.out.println(list);
}
}

-----------------------------------------------
输出结果
[aaaa, bbbb, cccc, dddd, wujiadong]
-------------------------------------------------

ArrayList存储字符串并遍历

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo1{
public static void main(String[] args){
//创建集合对象
ArrayList al = new ArrayList();

al.add("hadoop");
al.add("storm");
al.add("spark");

System.out.println("---迭代器遍历------------------------");
//迭代器遍历
Iterator it = al.iterator();
//方法一
while(it.hasNext()){
String s = (String) it.next();
System.out.println(s);
}
System.out.println("---size和get方法遍历--------------------------");
//方法二
for(int i=0;i String s = (String) al.get(i);
System.out.println(s);
}
}
}

-------------------------------------------
输出结果
---迭代器遍历------------------------
hadoop
storm
spark
---size和get方法遍历--------------------------
hadoop
storm
spark

----------------------------------------------

ArrayList存储自定义对象并遍历

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo2{
public static void main(String[] args){
//创建集合对象
ArrayList al = new ArrayList();

Student s1 = new Student("wujiadong",21);
Student s2 = new Student("jiangrui",22);
Student s3 = new Student("sunqiangkun",23);
Student s4 = new Student("xuqingyu",24);

al.add(s1);
al.add(s2);
al.add(s3);
al.add(s4);

System.out.println("--------迭代器遍历--------------");
Iterator it = al.iterator();
while(it.hasNext()){
Student s = (Student) it.next();
System.out.println(s);
}

System.out.println("------size和get遍历---------------");
for(int i=0;i Student s = (Student) al.get(i);
System.out.println(s);
}
}
}


class Student{
//成员变量
private String name;
private int age;

//构造方法
public Student(){
super();
}

public Student(String name,int age){
this.name = name;
this.age = age;
}

//set和get方法
public void setName(String name){
this.name = name;
}

public String getName(){
return name;
}

public void setAge(int age){
this.age = age;
}

public int getAge(){
return age;
}

//toString方法
public String toString(){
return "Student [name="+name+",age="+age+"]";
}
}




----------------------------------
输出结果
--------迭代器遍历--------------
Student [name=wujiadong,age=21]
Student [name=jiangrui,age=22]
Student [name=sunqiangkun,age=23]
Student [name=xuqingyu,age=24]
------size和get遍历---------------
Student [name=wujiadong,age=21]
Student [name=jiangrui,age=22]
Student [name=sunqiangkun,age=23]
Student [name=xuqingyu,age=24]

--------------------------------------

Vector特有的功能

添加功能

public void addElement(Object obj)

获取功能

public Object elementAt(int index)
public Enumeration elements()
import java.util.Vector;
import java.util.Enumeration;
public class ArrayListDemo3{
public static void main(String[] args){
//创建集合对象
Vector v = new Vector();

v.addElement("aaaa");
v.addElement("bbbb");
v.addElement("CCCC");
v.addElement("dddd");

for(int i=0;i String s = (String) v.elementAt(i);
System.out.println(s);
}

System.out.println("------------------");
Enumeration en = v.elements();//返回的是实现类的对象
while(en.hasMoreElements()){
String s = (String) en.nextElement();
System.out.println(s);
}

}
}

--------------------------------------
输出结果
aaaa
bbbb
CCCC
dddd
------------------
aaaa
bbbb
CCCC
dddd

注意:以后还是用add(), get() , Iterator 这些方法,上述方法基本不用。

JDK升级:
1)安全
2)效率
3)简化书写
------------------------------------

LinkList特有功能

添加功能

public void addFirst(Objet e):
public void addLast(Object e): 和add()没很大区别

获取功能

public Object getFirst():
public Object getLast():

删除功能

public Object removeFirst():
public Object removeLast():

实例

import java.util.LinkedList;

public class LinkedListDemo{
public static void main(String[] args){
LinkedList ll = new LinkedList();

ll.add("java");
ll.add("python");
ll.addLast("PERL");
ll.add("scalca");

System.out.println(ll);
System.out.println("1-----------------------------");

ll.addLast("R");
System.out.println(ll);

System.out.println("2-----------------------------");
ll.addFirst("C++");

System.out.println(ll);
System.out.println("3--------------------------------");
ll.removeFirst();
System.out.println(ll);
System.out.println("4========================");
ll.removeLast();
System.out.println(ll);
}
}

-----------------------------------------
输出结果
[java, python, PERL, scalca]
1-----------------------------
[java, python, PERL, scalca, R]
2-----------------------------
[C++, java, python, PERL, scalca, R]
3--------------------------------
[java, python, PERL, scalca, R]
4========================
[java, python, PERL, scalca]

练习1:ArrayList去除集合中字符串的重复值(创建新集合)

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo4{
public static void main(String[] args){
//创建集合
ArrayList al = new ArrayList();

al.add("java");
al.add("python");
al.add("scalca");
al.add("java");
al.add("python");
al.add("scalca");
al.add("python");

//遍历集合,获取到每一个元素
ArrayList al1 = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
String s = (String) it.next();

//拿这个元素到集合中去找,看有没有
if(!al1.contains(s)){
al1.add(s);
}

}

//遍历新集合
for(int i=0;i String s = (String) al1.get(i);
System.out.println(s);
}

}
}

-----------------------------------------------
输出结果
java
python
scalca

-----------------------------------------------

练习1:ArrayList去除集合中自定义对象的重复值(对象的成员变量值)

推荐 0
本文由 邬家栋 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

作为系列文章,建议把这个系列已经发表的文章也放在上面 这样也方便读者观看, 比如Java基础这个系列到这篇文章已经发表了7篇 那就可以在这第7篇文章的正文里 罗列出这个系列的6篇文章,并给出链接, 这样更能吸引&方便读者观看前面的6篇文章观看!

要回复文章请先登录注册