- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java集合框架之List ArrayList LinkedList使用详解刨析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
方法 | 描述 |
---|---|
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置的元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置的元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List<E> subList(int fromIndex, int toIndex) | 截取部分 list |
注意: 下面的示例都是一份代码分开拿出来的,上下其实是有逻辑关系的 。
示例一: 用 List 构造一个元素为整形的顺序表 。
List<Integer> list = new ArrayList<>();
示例二: 尾插 e 。
list.add(1);list.add(2);System.out.println(list);// 结果为:[1, 2]
示例三: 将 e 插入到 index 位置 。
list.add(0,10);System.out.println(list);// 结果为:[10, 1, 2]
示例四: 尾插 c 中的元素 。
List<Integer> list1=new LinkedList<>();list1.add(99);list1.add(100);list.addAll(list1);System.out.println(list);// 结果为:[10, 1, 2, 99, 100]
只要是继承于 Collection 的集合类的元素都可以被插入进去,但要注意传过来的具体的类型要么是和 list 的具体类型是一样的,要么是 list 具体类型的子类 。
示例五: 删除 index 位置的元素 。
System.out.println(list.remove(0));System.out.println(list);// 结果为:10 和 [1, 2, 99, 100]
示例六: 删除遇到的第一个 o 。
System.out.println(list.remove((Integer) 100));System.out.println(list);// 结果为:true 和 [1, 2, 99]
示例七: 获取下标 index 位置的元素 。
System.out.println(list.get(0));// 结果为:1
示例八: 将下标 index 位置元素设置为 element 。
System.out.println(list.set(2,3));System.out.println(list);// 结果为:99 和 [1, 2, 3]
示例九: 判断 o 是否在线性表中 。
System.out.println(list.contains(1));// 结果为:true
示例十: 返回第一个 o 所在下标 。
System.out.println(list.indexOf(1));// 结果为:0
示例十一: 返回最后一个 o 的下标 。
list.add(1);System.out.println(list.lastIndexOf(1));// 结果为:3
示例十二: 截取部分 list 。
List<Integer> list2=list.subList(1,3);System.out.println(list2);// 结果为:[2, 3]
注意,当我们将 list2 通过 set 更改元素,其实对 list 也会有影响 。
list2.set(0,5);System.out.println(list2);System.out.println(list);// 结果为:[5, 3] 和 [1, 5, 3, 1]
通过 subList 方法进行的截取,得到的集合的数值指向的地址和原集合中数值的地址是一样的 。
。
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。其继承了 AbstractList,并实现了 List 接口。LinkedList 不仅实现了 List 接口,还实现了 Queue 和 Deque 接口,可以作为队列去使用.
ArrayList 类位于 java.util 包中,使用前需要引入它.
方法 | 描述 |
---|---|
ArrayList() | 无参构造 |
ArrayList(Collection<? extends E> c) | 利用其他 Collection 构建 ArrayList |
ArrayList(int initialCapacity) | 指定顺序表初始容量 |
示例一:
ArrayList<Integer> list1 = new ArrayList<>();
示例二:
ArrayList<Integer> list2 = new ArrayList<>(10);// 该构造方法就是在构建时就将底层数组大小设置为了10
示例三:
List<Integer> list = new ArrayList<>();list.add(1);list.add(2);ArrayList<Integer> list3 = new ArrayList<>(list);
Collection<? extends E> c 只要是具体类型都和 list3 是一样的集合都可以放入转化成 ArrayList 。
当我们使用 add 方法给 ArrayList 的对象进行尾插时,突然想到了一个问题:既然 ArrayList 的底层是一个数组,那么这个数组有多大呢?
为了解决这个问题,我进行了如下探索 。
跳转到 ArrayList 的定义,我们看到了 elementData 和 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 。
跳转到 elementData 的定义,我们可以了解 ArrayList 底层是数组的原因 。
跳转到 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的定义,初步分析得到这个数组其实是空的 。
为什么这个数组是空的但存储元素的时候没有报异常呢?我们再去了解下 add 是怎样存储的 。
通过转到 ArrayList 的 add 方法的定义 。
通过定义,不难发现,数组容量和 ensureCapacityInternal 这个东西有关,那我们就看看它的定义 。
我们看里面的 calculateCapacity ,他有两个参数,此时数组为空,那么 minCapacity 就为 1。我们再转到 calculateCapacity 看看它的定义 。
此时我们就好像可以与之前串起来了,当数组为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 时,就返回 DeFauLt_CAPACITY 和 minCapacity(此时为1) 的最大值。DeFauLt_CAPACITY 其实是默认容量的意思,我们可以转到它的定义看看有多大 。
DeFauLt_CAPACITY 的值是10,故 calculateCapacity 函数此时的返回值为10,最后我们再确定一下 ensureExplicitCapacity 是干啥的 。
此时 minCapacity 的值是10,而数组为空时数组长度为0,所以进入 if 语句,执行 grow 方法,我们继续转到 grow 的定义 。
此时我们就可以了解,当我们创建一个 ArrayList 时,其底层数组大小其实是0。当我们第一次 add 的时候,经过 grow ,数组的大小就被扩容为了10。并且这大小为10的容量放满以后,就会按1.5倍的大小继续扩容。至于这个数组最大能存放多少,大家可以再转到 MAX_ARRAY_SIZE 的定义去查看.
。
LinkedList 类是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址.
Java 的 LinkedList 底层是一个双向链表,位于 java.util 包中,使用前需要引入它 。
方法 | 描述 |
---|---|
LinkedList() | 无参构造 |
LinkedList(Collection<? extends E> c) | 利用其他 Collection 构建 LinkedList |
示例一:
LinkedList<Integer> list1 = new LinkedList<>();
示例二:
List<Integer> list = new LinkedList<>();list.add(1);list.add(2);LinkedList<Integer> list2 = new LinkedList<>(list);
Collection<? extends E> c 只要是具体类型都和 list2 是一样的集合都可以放入转化成 LinkedList 。
。
习题一 。
题目描述:
霍格沃茨学院有若干学生(学生对象放在一个 List 中),每个学生有一个姓名(String)、班级(String)和考试成绩(double)。某次考试结束后,每个学生都获得了一个考试成绩。遍历 list 集合,并把每个学生对象的属性都打印出来 。
本题代码:
class Student{ private String name; private String classes; private double score; // 重写构造方法 public Student(String name, String classes, double score) { this.name = name; this.classes = classes; this.score = score; } // 构造 get 和 set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClasses() { return classes; } public void setClasses(String classes) { this.classes = classes; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } // 重写 toString 方法 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", classes='" + classes + '\'' + ", score=" + score + '}'; }}public class TestDemo { public static void main(String[] args) { ArrayList<Student> students = new ArrayList<>(); students.add(new Student("哈利波特","大二班",95.5)); students.add(new Student("赫敏格兰杰","小三班",93)); students.add(new Student("罗恩韦斯莱","小二班",91)); for(Student s: students){ System.out.println(s); } }}// 结果为:// Student{name='哈利波特', classes='大二班', score=95.5}// Student{name='赫敏格兰杰', classes='小三班', score=93.0}// Student{name='罗恩韦斯莱', classes='小二班', score=91.0}
习题二 。
题目描述:
有一个 List 当中存放的是整形的数据,要求使用 Collections.sort 对 List 进行排序 。
该题代码:
public class TestDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(3); list.add(7); list.add(1); list.add(6); list.add(2); Collections.sort(list); System.out.println(list); }}// 结果为:[1, 2, 3, 6, 7]
补充:
Collections 是一个工具类,sort 是其中的静态方法,它是用来对 List 类型进行排序的 。
注意:
如果具体的类是类似于习题一那样的 Student 类,该类中含有多个属性,那就不能直接使用这个方法。要对 comparator 或者 comparable 接口进行重写,确定比较的是哪个属性才行 。
习题三 。
题目描述:
输出删除了第一个字符串当中出现的第二个字符串中的字符的字符串,例如 。
String str1 = "welcome to harrypotter";String str2 = "come";// 结果为:wl t harrypttr
希望本题可以使用集合来解决 。
该题代码:
public static void removeS(String str1, String str2){ if(str1==null || str2==null){ return; } List<Character> list = new ArrayList<>(); int lenStr1=str1.length(); for(int i=0; i<lenStr1; i++){ char c = str1.charAt(i); if(!str2.contains(c+"")){ list.add(c); } } for(char ch: list){ System.out.print(ch); }}
。
我们可以通过上述所学,运用 List 的知识,去写一个关于扑克牌的逻辑代码(如:获取一副牌、洗牌、发牌等等) 。
class Card{ private String suit; // 花色 private int rank; // 牌面值 public Card(String suit, int rank){ this.suit=suit; this.rank=rank; } @Override public String toString() { return "[ "+suit+" "+rank+" ] "; }}public class TestDemo { public static String[] suits = {"♣", "♦", "♥", "♠"}; // 获取一副牌 public static List<Card> getNewCards(){ // 存放 52 张牌 List<Card> card = new ArrayList<>(); for(int i=0; i<4; i++){ for(int j=1; j<=13; j++) { card.add(new Card(suits[i], j)); } } return card; } public static void swap(List<Card> card, int i, int j){ Card tmp = card.get(i); card.set(i, card.get(j)); card.set(j, tmp); } // 洗牌 public static void shuffle(List<Card> card){ int size = card.size(); for(int i=size-1; i>0; i--){ Random random = new Random(); int randNum = random.nextInt(i); swap(card, i, randNum); } } public static void main(String[] args) { // 得到一副新的牌 List<Card> cardList = getNewCards(); System.out.println("已获取新的扑克牌"); System.out.println("洗牌:"); shuffle(cardList); System.out.println(cardList); System.out.println("抓牌:(3个人,每人轮流抓牌总共抓5张)"); List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>(); List<Card> hand3 = new ArrayList<>(); List<List<Card>> hands = new ArrayList<>(); hands.add(hand1); hands.add(hand2); hands.add(hand3); for(int i=0; i<5; i++){ for(int j=0; j<3; j++){ Card card = cardList.remove(0); hands.get(j).add(card); } } System.out.println("第一个人的牌:"+hand1); System.out.println("第二个人的牌:"+hand2); System.out.println("第三个人的牌:"+hand3); }}/** 结果为:已获取新的扑克牌洗牌:[[ ♥ 9 ] , [ ♦ 6 ] , [ ♣ 8 ] , [ ♦ 2 ] , [ ♣ 6 ] , [ ♦ 4 ] , [ ♣ 11 ] , [ ♣ 9 ] , [ ♠ 8 ] , [ ♣ 5 ] , [ ♦ 8 ] , [ ♦ 10 ] , [ ♦ 1 ] , [ ♦ 12 ] , [ ♥ 10 ] , [ ♥ 7 ] , [ ♠ 12 ] , [ ♥ 12 ] , [ ♦ 7 ] , [ ♣ 13 ] , [ ♠ 6 ] , [ ♠ 5 ] , [ ♥ 3 ] , [ ♦ 5 ] , [ ♦ 11 ] , [ ♣ 12 ] , [ ♠ 7 ] , [ ♦ 3 ] , [ ♥ 5 ] , [ ♦ 13 ] , [ ♣ 1 ] , [ ♥ 8 ] , [ ♠ 10 ] , [ ♠ 4 ] , [ ♣ 4 ] , [ ♣ 7 ] , [ ♥ 1 ] , [ ♠ 1 ] , [ ♣ 3 ] , [ ♥ 11 ] , [ ♥ 13 ] , [ ♦ 9 ] , [ ♠ 13 ] , [ ♣ 10 ] , [ ♥ 6 ] , [ ♠ 11 ] , [ ♠ 3 ] , [ ♣ 2 ] , [ ♠ 2 ] , [ ♥ 2 ] , [ ♥ 4 ] , [ ♠ 9 ] ]抓牌:(3个人,每人轮流抓牌总共抓5张)第一个人的牌:[[ ♥ 9 ] , [ ♦ 2 ] , [ ♣ 11 ] , [ ♣ 5 ] , [ ♦ 1 ] ]第二个人的牌:[[ ♦ 6 ] , [ ♣ 6 ] , [ ♣ 9 ] , [ ♦ 8 ] , [ ♦ 12 ] ]第三个人的牌:[[ ♣ 8 ] , [ ♦ 4 ] , [ ♠ 8 ] , [ ♦ 10 ] , [ ♥ 10 ] ]*/
上述代码中有一处代码是这样写的 List<List<Card>>,其实不难理解,这个类型其实就是 List 中存放的每个元素都是一个 List 类型的,并且每一个 List 元素中的元素都是 Card 类型,类似于二维数组.
以上就是Java集合框架之List ArrayList LinkedList使用详解刨析的详细内容,更多关于Java 集合框架的资料请关注我其它相关文章! 。
原文链接:https://blog.csdn.net/weixin_51367845/article/details/120838319 。
最后此篇关于Java集合框架之List ArrayList LinkedList使用详解刨析的文章就讲到这里了,如果你想了解更多关于Java集合框架之List ArrayList LinkedList使用详解刨析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想添加 LinkedList (我们称之为列表 A)到 LinkedList> (称之为列表 B)。执行此操作后,我需要更改列表 A 的值并将其再次添加到列表 B,但不更改已存储在列表 B 中的值。
更新:感谢所有的回答。我发现的最干净的解决方案是这个: if ( k(Arrays.asList(new LinkedList<>())); 我有一个递归方法,可以从列表中生成所有“n 选 k”组合。
在我的 Java 应用程序中,以下两个都将编译和运行,并产生所需的结果。 //"Rotate" the list items one place to the left. myLinkedList.a
我写了一个LinkedList接受 Nodes 的类存储 Integers . 然后我创建了一个 LinkedList stack = new LinkedList() ,并添加了 Node s 如果
这个问题在这里已经有了答案: What does it mean to "program to an interface"? (33 个答案) 关闭 9 年前。 新手 Java 问题: 谁能解释一下
我有一个问题。我无法并排输出我的 LinkedList。我问了这个问题,但遗憾的是我的老师告诉我不要更改方法头或使用 java 库(如日历)。我得到了很多关于使用它或更改方法头的建议。我是根据年级而定
这里有什么问题?。我正在尝试使用邻接列表,通过利用 util 包中的集合来实现图形数据结构。这里 LinkedList array which holds some integer. Each ele
这个问题已经有答案了: Reversing a linked list in Java, recursively (33 个回答) 已关闭10 年前。 如何使用 linkedList 类中的方法以相反
我需要实现一个 LinkedList,到目前为止,我已经编写了在列表中按顺序插入值的方法。我有我的节点 front 作为我的类的实例数据,当创建我的第一个值并尝试将 front 的 next 值设置为
目前,我的 LinkedList(不是 Java 的)类中有一个方法,可以将单个节点添加到 LinkedList 中,如下所示: public void add(int index, T v) {
我正在编写一个读取 XML 文件的类,该 XML 使用“sax”类进行解析。在我的 XML 文件中,我创建了“for”标签和“宏”,使 for 循环能够写入 XML,例如: Th
我正在处理一个 C++ 作业,我将在一个链表的链表上创建一个搜索引擎。根据要求,我不能使用其他库和 STL。 基本上它会是这样的(我从小列表中删除了变量,因为它们是不相关的): 我的结构是这些: st
老实说,我现在真的很困惑这个问题,并且真的不知道如何解决这个问题。我需要编写一个方法,其中给定一个字符链接列表(例如:{'a','A','d','X'})并返回仅包含大写字符的列表(返回:{'A','
我正在尝试获取可执行文件中的两个链表,并在交替位置将它们合并到一起。前任。 ListOne 1,2,3 和 ListTwo 4,5 新的 ListOne 应该是 1,4,2,5,3。 链表.h文件:
这个问题在这里已经有了答案: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答
在尝试了解如何将哈希表插入LinkedLists时,我遇到了麻烦。我失去了尝试过的不同事物的数量。我知道我可以使用ArrayList或其他东西,但是我想使它与LinkedLists一起工作,以便可以对
我一直在尝试编写一种方法,不仅可以从 LinkedList(allUsers) 中删除对象(User),还可以从所有用户拥有的单个 LinkedList 中删除。谁能向我解释为什么这是错误的?我已经包
我有一个列表结构和一个名为树的递归函数。在下面的代码中,它永远不会到达 current == null 语句,因此它将永远运行。 如果我无法使用null,解决方案是什么? private void t
这个问题在这里已经有了答案: How does one add a LinkedList to a LinkedList in C#? (3 个答案) 关闭 9 年前。 假设我有以下内容: Link
我正在尝试为 LinkedList 创建一个反向 ListIterator,并且打算将其实现为 linkedList.listIterator(linkedList. size()) 交换了 next
我是一名优秀的程序员,十分优秀!