- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 集合框架之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 是怎样存储的 。
(1)通过转到 ArrayList 的 add 方法的定义 。
(2)通过定义,不难发现,数组容量和 ensureCapacityInternal 这个东西有关,那我们就看看它的定义 。
(3)我们看里面的 calculateCapacity ,他有两个参数,此时数组为空,那么 minCapacity 就为 1。我们再转到 calculateCapacity 看看它的定义 。
(4)此时我们就好像可以与之前串起来了,当数组为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 时,就返回DeFauLt_CAPACITY 和 minCapacity(此时为1) 的最大值。DeFauLt_CAPACITY 其实是默认容量的意思,我们可以转到它的定义看看有多大 。
(5)DeFauLt_CAPACITY 的值是10,故 calculateCapacity 函数此时的返回值为10,最后我们再确定一下 ensureExplicitCapacity 是干啥的 。
(6)此时 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 的使用(附小游戏练习)的文章就介绍到这了,更多相关Java List 的使用内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_51367845/article/details/120838319 。
最后此篇关于Java 集合框架之List 的使用(附小游戏练习)的文章就讲到这里了,如果你想了解更多关于Java 集合框架之List 的使用(附小游戏练习)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要开发一个简单的网站,我通常使用 bootstrap CSS 框架,但是我想使用 Gumbyn,它允许我使用 16 列而不是 12 列。 我想知道是否: 我可以轻松地改变绿色吗? 如何使用固定布局
这个问题在这里已经有了答案: 关闭 13 年前。 与直接编写 PHP 代码相比,使用 PHP 框架有哪些优点/缺点?
我开发了一个 Spring/JPA 应用程序:服务、存储库和域层即将完成。 唯一缺少的层是网络层。我正在考虑将 Playframework 2.0 用于 Web 层,但我不确定是否可以在我的 Play
我现有的 struts Web 应用程序具有单点登录功能。然后我将使用 spring 框架创建一个不同的 Web 应用程序。然后想要使用从 struts 应用程序登录的用户来链接新的 spring 应
我首先使用Spark框架和ORMLite处理网页上表单提交的数据,在提交中文字符时看到了unicode问题。我首先想到问题可能是由于ORMLite,因为我的MySQL数据库的字符集已设置为使用utf8
我有一个使用 .Net 4.5 功能的模块,我们的应用程序也适用于 XP 用户。所以我正在考虑将这个 .net 4.5 依赖模块移动到单独的项目中。我怎样才能有一个解决方案,其中有两个项目针对不同的版
我知道这是一个非常笼统的问题,但我想我并不是真的在寻找明确的答案。作为 PHP 框架的新手,我很难理解它。 Javascript 框架,尤其是带有 UI 扩展的框架,似乎通过将 JS 代码与设计分开来
我需要收集一些关于现有 ORM 解决方案的信息。 请随意编写任何编程语言。 你能谈谈你用过的最好的 ORM 框架吗?为什么它比其他的更好? 最佳答案 我使用了 NHibernate 和 Entity
除了 Apple 的 SDK 之外,还有什么强大的 iPhone 框架可供开始开发?有没有可以加快开发时间的方法? 最佳答案 此类框架最大的是Three20 。 Facebook 和许多其他公司都使用
有人可以启发我使用 NodeJS 的 Web 框架吗?我最近开始从免费代码营学习express js,虽然一切进展顺利,但我对express到底是什么感到困惑。是全栈框架吗?纯粹是为了后端吗?我发现您
您可以推荐哪种 Ajax 框架/工具包来构建使用 struts 的 Web 应用程序的 GUI? 最佳答案 我会说你的 AJAX/javascript 库选择应该较少取决于你的后端是如何实现的,而更多
我有生成以下错误的 python 代码: objc[36554]: Class TKApplication is implemented in both /Library/Frameworks/Tk.
首先,很抱歉,如果我问的问题很明显,因为我没有编程背景,那我去吧: 我想运行一系列测试场景并在背景部分声明了几个变量(我打印它们以仔细检查它们是否已正确声明),第一个是整数,另外两个字符串为你可以看到
在我们承担的一个项目中,我们正在寻找一个视频捕获和录制库。我们的基础工作(基于 google 搜索)表明 vlc (libvlc)、ffmpeg (libavcodec) 和 gstreamer 是三
我试过没有运气的情况下寻找某种功能来杀死/中断Play中的正常工作!框架。 我想念什么吗?还是玩了!实际没有添加此功能? 最佳答案 Java stop类中没有像Thread方法那样的东西,由于种种原因
我们希望在我们的系统中保留所有重大事件的记录。例如,在数据库可能存储当前用户状态的地方,事件日志应记录对该状态的所有更改以及更改发生的时间。 事件记录工具应该尽可能接近于事件引发器的零开销,应该容纳结
那里有 ActionScript 2.0/3.0 的测试框架列表吗? 最佳答案 2010-05-18 更新 由于这篇文章有点旧,而且我刚刚收到了赞成票,因此可能值得提供一些更新的信息,这样人们就不会追
我有一个巨大的 numpy 数组列表(一维),它们是不同事件的时间序列。每个点都有一个标签,我想根据其标签对 numpy 数组进行窗口化。我的标签是 0、1 和 2。每个窗口都有一个固定的大小 M。
我是 Play 的新手!并编写了我的第一个应用程序。这个应用程序有一组它依赖的 URL,从 XML 响应中提取数据并返回有效的 URL。 此应用程序需要在不同的环境(Dev、Staging 和 Pro
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!