集合线性表--List之ArrayList
集合操作——线性表
List: add()、remove()、subList()、list.toArray()、array.asList()、
List排序: Collections.sort(list); Comparable、 comparator
List
List接口是Collection的子接口,用于定义线性表数据结构;可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。并且List是可重复集
ArrayList和LinkedList
List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别
LinkedList: 易于增删
ArrayList: 易于查找
1. ArrayList 是由数组实现的 检索 要求不是太苛刻 都可以用这个
2.LinkedList 是由链表实现的 插入删除
get与set方法
这两个方法是List的方法独有的
List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法。
E get(int index):获取集合中指定下标对应的元素,下标从0开始。
E set(int index, E elment):将给定的元素存入给定位置,并将原位置的元素返回。
List是有序,所有 基于下标操作元素
/*
* get方法获取指定位置的元素
*/
/*
* 将cpp替换c++
* set 方法替换元素 将原来的元素保存起来
*/ String old =list.set(1, "c++");
System.out.println(list);
System.out.println(old); /*
* 将下标1和下标3这两个位置上的元素呼唤
*
*/ String e = list.get(1);
String e2 =list.set(3,e);
list.set(1, e2);
//意思是 list.set(1,list.set(3,list.get(1)));
System.out.println(list);
3. 插入和删除
List根据下标的操作还支持插入与删除操作:
void add(int index,E element):
将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
E remove(int index):
删除给定位置的元素,并将被删除的元素返回
class Test4{
/**
* 插入和删除
*/
private void mian() {
List<String> list = new ArrayList<String>();
list.add("java");
list.add("cpp");
list.add("php");
list.add("c#");
list.add("python");
list.add(1,"jsp");
/*
* 删除第三个元素
* remove(int index)
* 删除指定位置的元素 并返回
*
*/
String old =list.remove(2);
System.out.println(list);
System.out.println("被删除的是:"+old);
}
}
4. subList方法
List的subList方法用于获取子List。
需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响的原List。
List<E> subList(int fromIndex, int toIndex);
fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括) 。
**
* 取子集
* @author Administrator
*
*/
class TestList1{
/*
* List subList(int start,int end)
* 获取当前集合中的子集
*/
public static void main(String[] args) {
List<Integer> list =new ArrayList<Integer>(); //向集合中存入0-9
for(int i=0;i<10;i++){
list.add(i);
}
System.out.println(list);
//获取子集
List<Integer> subList =list.subList(3,8);
System.out.println(subList); //将子集中每个元素扩大10倍
for(int i=0;i<subList.size();i++){
int num = subList.get(i);
num=num*10;
subList.set(i,num);
}
/*
* 对子集元素的任何操作都会影响原集合
*/
System.out.println(subList);
System.out.println(list); subList.clear();//清空子集
System.out.println(subList);
System.out.println(list); }
}
5. List转换为数组
List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。
其有两个方法:
Object[] toArray()
<T>T[] toArray(T[] a)
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。
/**
* 集合转换为数组
*/
class TestList2{
public static void main(String[] args) {
/*
* Collection 中定义的方法
* object[] toArray()
*/
Collection<String> c = new ArrayList<String>();
c.add("a");
c.add("b");
c.add("c"); Object[] array =c.toArray();
//查看数组中第一个字符串的长度
String str =(String)array[0];
System.out.println(str.length()); /*
* 重载的toArray
* 该方法会检查我们传入的数组
* 若传入的数组的长度可以保存集合中所有元素,则
* 按照我们传入的数组的类型创建一个新数组
*/
String[] arrays =c.toArray(new String[5]);
System.out.println(arrays.length);
str=arrays[0];
System.out.println(str); }
}
6. 数组转换为List
Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。
其方法定义为:
static <T>List<T> asList<T… a>
返回的List的集合元素类型由传入的数组的元素类型决定。
需要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行的修改会影响数组对应的元素。
例如:
public class TestListD {
/**
* @param args
*/
public static void main(String[] args) {
String[] array ={"a","b","c"};
System.out.println(Arrays.toString(array));
/*
* Array 的asList方法,可以将数组转换为List集合
*
*/
List<String> list = Arrays.asList(array);
System.out.println(list);
/*
* 数组转换为集合时 这集合是只读的
* 对此类集合不能进行增删元素,但是可以修改元素
* 注意: 修改元素会影响原数组
*
* 解决方法: 新建一个集合
*/
List<String> newList = new ArrayList<String>();
newList.addAll(list);
newList.add("d");
System.out.println(newList);
newList.add("d");
list.set(0, "d");
System.out.println(list);
System.out.println("数组:"+ Arrays.toString(array));
}
}
List排序
1. Collections.sort方法实现排序
Collections是集合的工具类,它提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法。该方法的定义为:
void sort(List<T> list)
其作用是对集合元素进行自然排序(按照元素的由小至大的顺序)
/**
* 集合排序
*/ class TestListD1{
public static void main(String[] args) {
/*
* Collections 是集合的工具类
*
* Collection 与 Collections 的区别?
* 前者定义集合的,是所有集合的父接口
* 后者是操作集合的 是一个工具类
*
* 使用Collections 常用于排序集合
*/
//在集合中生成10个100以内的随机数
List<Integer> list = new ArrayList<Integer>();
//Math.random();//0-1之间的随机数
Random random= new Random();
for(int i=0;i<10;i++){
list.add(random.nextInt());
}
System.out.println(list);
/*
* Collections.sort(list);
* 只对List有序集进行排序(由小到大)
*
* 想使用sort排序 就要求 集合中的元素必须具有可比价性,能比较出大小
*/
Collections.sort(list);
System.out.println(list);
}
}
2. Comparable
要想对元素进行自然排序那么就必须要有一个必要条件,就是元素的大小。集合中存入的都是引用类型,是以对象的形式存在于内存中,那么对象是如何进行的大小比较呢?实际上,若想对某个集合的元素进行自然排序,该集合的元素有一个要求,就是这些元素必须是Comparable的子类。
Comparable是一个接口,用于定义其子类是可以比较的。因为该接口有一个抽象方法:
int compareTo(T t)
所有子类都需要重写该方法来定义对象间的比较规则。该方法要求返回一个整数,这个整数不关心具体的值,而是关注取值范围。
当返回值>0时,表示当前对象比参数给定的对象大。
当返回值<0时,表示当前对象比参数给定的对象小。
当返回值=0时,表示当前对象和参数给定的对象相等。
class Cell implements Comparable<Cell>{
private int row;
private int col;
@Override
/*
* 比较规则 :谁的行数大谁大
*
* 谁的行数小 谁大
*/
public int compareTo(Cell o){
return this.row- o.row;
// return o.row-this.row ;
}
}
/**
* 对Cell类进行自然排序
* @author Administrator
*
*/
class TestListD2{
public static void main(String[] args) {
List<Cell> list = new ArrayList<Cell>();
list.add(new Cell(2,3));
list.add(new Cell(5,1));
list.add(new Cell(3,2));
System.out.println(list);
/*
* 若集合中的元素没有实现Coparable接口
* 那么调用sort方法编译不通过
*/
Collections.sort(list);
System.out.println(list);
}
}
class Cell implements Comparable<Cell>{
private int row;
private int col;
@Override
/*
* 比较规则 :谁的行数大谁大
*
* 谁的行数小 谁大
*/
public int compareTo(Cell o){
return this.row- o.row;
// return o.row-this.row ;
}
}
/**
* 对Cell类进行自然排序
* @author Administrator
*
*/
class TestListD2{
public static void main(String[] args) {
List<Cell> list = new ArrayList<Cell>();
list.add(new Cell(2,3));
list.add(new Cell(5,1));
list.add(new Cell(3,2));
System.out.println(list);
/*
* 若集合中的元素没有实现Coparable接口
* 那么调用sort方法编译不通过
*/
Collections.sort(list);
System.out.println(list);
}
}
3. comparator
一旦Java类实现了Comparable,其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
该接口要求实现类必须重写其定义的方法:
int compare(T o1,T o2)
该方法的返回值要求,若o1>o2则返回值应>0,若o1<o2则返回值应<0,若o1==o2则返回值应为0
当元素自身提供的比较规则 不能满足我们对排序的需求时,我们就可以提供一个比较器,来指定比较规则
class TestListD3{
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("你好");
list.add("李绪春");
list.add("张飞");
list.add("刘苍松");
list.add("范传奇");
Collections.sort(list);
/*
* Collections提供了一个重载的sort方法
* static void sort(List list,Comparator c)
* 该方法根据给定的比较器对集合元素进行大小的比较
* 后进行自然排序
*/
/*
* 使用匿名内部类定义比较器(推荐做法)
* 临时用一下 所以 可以直接写成 匿名内部类
* 当我们需要使用某一个借口的实现类的实例或一个类的子类实例时,这时我们使用
* 内部类的最佳时机,匿名内部类的特点是不需要声明类,且只有一个实例
*/
Comparator com = new Comparator<String>(){
public int compare(String o1, String o2) {
/*
* 排序后 字符多的在前
*/
return o2.length()- o1.length();
}
};
Collections.sort(list,com);
System.out.println(list);
}
}
集合线性表--List之ArrayList的更多相关文章
- 集合线性表--List之LinkedList(队列与栈)
队列和栈1. Queue 队列(Queue)是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素.队列遵循 ...
- Java Se :线性表
Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 2.2_线性表的顺序存储结构_参考集合ArrayList
[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...
- JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表
Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...
- [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList
一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- HNCU1323:算法2-1:集合union (线性表)
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1323 题目描述 假设利用两个线性表LA和 ...
随机推荐
- POJ-2155-Matrix二位树状数组应用
题目: 一个只有0和1构成的二维平面,给你两种指令,一种是区间的更新,即0变为1,1变为0:一种是查询一个点是1还是0: 由于是二进制,所以每次更新在相应的点上加一,最后对2取余即可. 至于二维的树状 ...
- HDU - 2255 奔小康赚大钱 KM算法 模板题
HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...
- hdu6376 度度熊剪纸条 思维
度度熊剪纸条 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Codeforces Round #383 (Div. 2)D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(dp背包+并查集)
题目链接 :http://codeforces.com/contest/742/problem/D 题意:给你n个女人的信息重量w和美丽度b,再给你m个关系,要求邀请的女人总重量不超过w 而且如果邀请 ...
- Special Judge Ⅱ
Problem Description Q:什么是 Special Judge,Special Judge 的题目有什么不同? A:一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被 Spe ...
- 【Offer】[32] 【从上到下打印二叉树】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 不换行:从上到下打印出二叉树的每个节点,同层的节点按照从左到右的顺序打印.例如,输入下图的二叉树,则依次打印出8,6,10,5,7,9, ...
- 在Word指定位置插入富文本域值(html文本)
遇到此问题,首先想到的就是各种百度.结果度娘了一会并没有发现有用的有效的解决方法,哎,看来还得靠自己啊. 首先整理了下手头上的资源,一是HtmlAgilityPack,专门解析Html文本用的:二是我 ...
- 041 模块5-jieba库的使用
目录 一.jieba库基本介绍 1.1 jieba库概述 1.2 jieba库的安装 1.3 jieba分词的原理 二.jieba库使用说明 2.1 jieba分词的三种模式 2.2 jieba库常用 ...
- Docker的优缺点
Docker解决的问题 由于不同的机器有不同的操作系统,以及不同的库和组件,将一个应用程序部署到多台机器上需要进行大量的环境配置操作.(例如经常出现的类似"在我的机器上就没问题"这 ...
- Net基础篇_学习笔记_第九天_数组
结构:一次性存储不同类型的变量: 数组:一次性存储相同类型的变量: 数组的语法: 数组类型[ ] 数组名=new 数组类型[数组长度]: int[ ] nums=new int[10]; 数组初值都是 ...