Java基础(7)-集合类3
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):在指定位置添加元素
- 获取功能
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;i<list.size();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;i<list.size();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<al.size();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<al.size();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<v.size();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<al1.size();i++){
String s = (String) al1.get(i);
System.out.println(s);
}
}
}
-----------------------------------------------
输出结果
java
python
scalca
-----------------------------------------------
练习1:ArrayList去除集合中自定义对象的重复值(对象的成员变量值)
Java基础(7)-集合类3的更多相关文章
- java基础(8) -集合类-Collecion
集合类-Collecion Collection接口 常用方法 //添加新元素 boolean add (E element); //返回迭代器 Iterator<E> iterator( ...
- 面试【JAVA基础】集合类
1.ArrayList的扩容机制 每次扩容是原来容量的1.5倍,通过移位的方法实现. 使用copyOf的方式进行扩容. 扩容算法是首先获取到扩容前容器的大小.然后通过oldCapacity (oldC ...
- 【java基础之jdk源码】集合类
最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...
- Java基础__Java中自定义集合类
Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 【JAVA面试题系列一】面试题总汇--JAVA基础部分
JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- Java基础应用
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
- Java基础知识学习(一)
部门接了新项目,后台使用Java框架play framework,前端是html,前后台通过rest交互,能够支持多端的互联网架构. 因为之前没有Java基础,前端使用的也很少,决定深入学习一下Jav ...
- java基础要点
Java语言是现在比较常用的编程语言,因为Java语言可以编写桌用程序,也可以编写web程序,还能编写嵌入式程序.这是由于相比脚本语言,Java 的运行速度要快.而对于底层语言,Java与平台无关,可 ...
随机推荐
- ios中的coredata
本文转载至 http://blog.csdn.net/chen505358119/article/details/9334831 分类: ios2013-07-15 18:12 12449人阅读 评论 ...
- Mac下通过shell脚本修改properties文件
通过shell脚本替换属性文件中的某行记录 假设有如下属性文件 demo.properties user.name=test user.password=123456 ................ ...
- Python成长之路(常用模块学习)
Python 拥有很多很强大的模块 主要写一下常用的几个吧 大概就是这些内容了 模块介绍 time &datetime模块 random os sys shutil json & pi ...
- 边双联通问题求解(构造边双连通图)POJ3352(Road Construction)
题目链接:传送门 题目大意:给你一副无向图,问至少加多少条边使图成为边双联通图 题目思路:tarjan算法加缩点,缩点后求出度数为1的叶子节点个数,需要加边数为(leaf+1)/2 #include ...
- nginx发布的nginScript
nginx发布的nginScript 背景 2015年9月,nginx宣布支持类JavaScript语言.这意味着开发者可以更轻松.自由的控制全球最优秀的HTTP及反向代理服务器,并在此之上可以衍生出 ...
- set集合可以添加重复元素
set集合判断元素的唯一性要重写hashcode和equals方法,这样就能保证不会加入重复的元素, 但是在以下这种情况下任然可以加入重复元素,即使他们的hashcode和equals方法结果相同 p ...
- 修改已生成项目app名称
在搜索里添加product Name,然后修改成你需要的app名称 修改完后可能会报错误如下 原因是test的测试路径发生了变化,其实如果不修改Test host的路径保留原来的重命名之前的app也是 ...
- sql的reader方法注意事项
如果恢复注释. 在数据只有一条时,list将始终为空 原因很简单. 第一个红框已经跑完了.第二次调用的时候,就是第二条了,此时数据为空
- Cassandra代替Redis?(转)
原文:Cassandra代替Redis? 最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例.而这篇百万用户时尚分享网站 ...
- 前端基础 & 初识JS(JavaScript)
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...