JavaSE学习笔记 Day18

JavaSE学习笔记 Day18

个人整理非商业用途,欢迎探讨与指正!!
« 上一篇


文章目录

  • JavaSE学习笔记 Day18
    • ···
        • 16.2.2迭代器
        • 16.2.3泛型的基本使用
      • 16.3常见的单列集合实现类
        • 16.3.1ArrayList
        • 16.3.2List集合的遍历
        • 16.3.3ArrayList的底层实现
        • 16.3.4LinkedList
        • 16.3.5LinkedList底层实现
        • 16.3.6Vector
        • 16.3.7HashSet
        • 16.3.8HashSet数值的存放


···

16.2.2迭代器

反复反馈的过程,通常就是为了获取结果使用的。迭代和遍历是类似的
每次迭代都是重复的过程,每次迭代的结果作为下一次的初始值
迭代器是传统的遍历方式,JDK1.5之前使用
迭代器的方法
 hasNext:判断迭代器是否有下一个元素
 next:获取当前游标对应的元素,将游标向后移动一位
 remove:移除当前迭代器中的数据

public class Demo02 {public static void main(String[] args) {Collection coll = new ArrayList();coll.add("hello");coll.add(new Integer(10));coll.add(20);coll.add("bmh");//		可以通过集合获取迭代器
//		迭代器可以帮我们进行集合的遍历(JDK1.5之前)Iterator iterator = coll.iterator();//		判断当前是否有元素while(iterator.hasNext()) {
//			获取当前,向后移位System.out.println(iterator.next());}}
}

迭代器的常见问题:
 1.迭代器是一个一次性的工具,迭代完成之后,游标会停到最后一位,就不能在向下了,迭代器空了没有数据了
 2.迭代时每次循环不能调用多次next(),若想调用多次,数据是next()的倍数,否则抛出NoSuchElementException
 3.迭代时不要向集合中添加或者删除元素,会抛出ConcurrentModificationException(并发修改异常)

public class Demo02 {public static void main(String[] args) {Collection coll = new ArrayList();coll.add("hello");coll.add(new Integer(10));coll.add(20);coll.add("bmh");coll.add("bmh");//		可以通过集合获取迭代器
//		迭代器可以帮我们进行集合的遍历(JDK1.5之前)Iterator iterator = coll.iterator();//		判断当前是否有元素/*while(iterator.hasNext()) {
//			获取当前,向后移位System.out.println(iterator.next());}*/System.out.println("------------------------");
//		第二次迭代/*while(iterator.hasNext()) {System.out.println(iterator.next());}*/System.out.println("------------------------");/*while(iterator.hasNext()) {
//			获取当前,向后移位System.out.println(iterator.next());System.out.println(iterator.next());System.out.println("=======");}*/System.out.println("------------------------");while(iterator.hasNext()) {
//			向集合中添加元素coll.add("hi");
//			获取当前,向后移位System.out.println(iterator.next());}}
}
16.2.3泛型的基本使用

Java中的菱形语法:<>
JDK1.5后引入
参数化类型,可以擦除数据类型,消除向下造型
集合都是泛型类或者泛型接口

public class Demo03 {public static void main(String[] args) {
//		泛型写Object及其任意的子类(基本类型不能写)
//		前后的类型需要一致,或者前写后不写,默认和前是一致的
//		Collection<Integer> coll = new ArrayList<Integer>();
//		泛型添加之后,规范化了类型,如下:当前的集合中只能添加Integer类型Collection<Integer> coll = new ArrayList<>();
//		规定好了类型
//		coll.add("hello");coll.add(10);coll.add(20);//		集合都是泛型类或者接口 Iterator迭代器也是集合Iterator<Integer> iterator = coll.iterator();while(iterator.hasNext()) {System.out.println(iterator.next());}Collection<String> coll1 = new ArrayList<>();coll1.add("helloworld");coll1.add(new String("你好世界"));Iterator<String> it = coll1.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}

16.3常见的单列集合实现类

16.3.1ArrayList

List接口的实现类
底层使用数组完成

常用方法:
add(int index, E element) 向集合指定下标中添加元素
add(E e) 在集合的尾部添加元素
get(int index) 通过下标返回指定位置的元素
set(int index, E element) 设置修改,修改的指定下标的内容
listIterator() 获取list专属迭代器
subList(int fromIndex, int toIndex) 集合的截取,从fromIndex到toIndex(不包含)结束

public class Demo04 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();
//		添加list.add("张三");list.add("李四");list.add("王五");
//		toString是重写过的System.out.println(list.toString());
//		在指定位置进行添加元素list.add(0, "赵六");System.out.println(list);
//		下标需要在范围之内		
//		list.add(-1,"小七");//		list中可以添加null值list.add(null);System.out.println(list);
//		清空/*list.clear();System.out.println(list);*///		返回下标System.out.println(list.indexOf("张三"));System.out.println(list.indexOf(null));//		是否包含System.out.println(list.contains("李四"));//		通过下标移除 返回结果为刚刚被删除的数据System.out.println(list.remove(0));System.out.println(list);//		修改集合的内容 返回的是原本的值System.out.println(list.set(0, "wch"));System.out.println(list);//		获取方法System.out.println(list.get(0));//		集合的截取List<String> subList = list.subList(0, 2);//返回值是List的一个实现类型中的内部类(继承了AbstractList的)System.out.println(subList);}
}
16.3.2List集合的遍历

有三种方式
 1.迭代器
 2.foreach循环
 3.for循环(只能遍历list集合)

public class Demo05 {//	list集合的遍历public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();list.add("张三");list.add("李四");list.add("王五");//		1.迭代器Iterator<String> it = list.iterator();while(it.hasNext()) {System.out.println(it.next());}ListIterator<String> it1 = list.listIterator();
//		向下:下面是否有内容while(it1.hasNext()) {System.out.println(it1.next());}System.out.println("+++++++++++++++++++++++++");
//		向上:上面是否有内容while(it1.hasPrevious()) {System.out.println(it1.previous());}System.out.println("-------------------------");
//		2.foreachfor (String string : list) {System.out.println(string);}System.out.println("-------------------------");
//		3.普通for循环for(int i = 0;i<list.size();i++) {System.out.println(list.get(i));}}
}
16.3.3ArrayList的底层实现

ArrayList的底层是数组实现的,所有它有一些数组的特征(下标)
数组结构的特点:1.查询快,2.增删慢
add(E e)方法:
 1.若为一次添加元素,那么将底层的空数组进行扩容默认是10,默认的容器可以手动的指定(调用的ArrayList的带参构造)
 2.若不为第一次添加元素,当有效个数为size+1,大于数组(底层默认的数组)的长度了就需要扩容
 3.每次的扩容为原来的1.5倍(oldCapacity + (oldCapacity >> 1))
 ps:移位运算符,是最快速的运算符
  ①a>>b 等价与 a / 2的b次方
  ②a<<b 等价与 a * 2的b次方
add(int index,E e)方法:
 1.检测下标的范围是否合法
 2.判断是否需要扩容
 3.将原数组的index下标位向后拷贝
 4.在index下标位添加新元素e
 5.有效个数++
get(int index)方法:
 1.判断下标是否合法
 2.返回指定位置的元素

16.3.4LinkedList

api和ArrayList类似,有自己独特的添加首尾的方法
底层使用的双链表实现的

public class Demo06 {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();
//		方法 默认是添加到最后的list.add("张三");list.add("李四");list.add("王五");System.out.println(list);
//		添加到结尾list.addLast("赵六");System.out.println(list);
//		添加到头部list.addFirst("李二");System.out.println(list);
//		获取头和尾System.out.println(list.getFirst());System.out.println(list.getLast());
//		和ArrayList类似的方法System.out.println(list.get(3));}
}

可以模拟栈和队列的数据结构
栈:先进后出
队列:先进先出

public class Demo07 {public static void main(String[] args) {
//		模拟栈LinkedList<String> list = new LinkedList<>();
//		入栈:先进后出
//		调用addFirstlist.push("张三");//先进入的存在最后 list.push("李四");list.push("王五");list.push("赵六");System.out.println(list.get(0));System.out.println(list);
//		出栈:将数据移除list.pop();//赵六出栈list.pop();//王五出栈list.pop();//李四出栈list.pop();//张三出栈System.out.println(list);System.out.println("--------------------------------");
//		模拟队列
//		调用add(默认添加到尾部)list = new LinkedList<>();list.offer("张三");list.offer("李四");list.offer("王五");list.offer("赵六");System.out.println(list);
//		出列list.poll();//张三list.poll();//李四list.poll();//王五list.poll();//赵六System.out.println(list);}
}
16.3.5LinkedList底层实现

底层选用双链表结构
数据结构中存在表结构
 顺序表:内存空间是连续的,数组,允许随机访问,尾插和尾删方便,优点:查询快;缺点:插入的效率低,删除效率低,长度固定(查快,删改慢)
 单链表:内存不是连续的,可以随意的增删改,查询效率低,应用:HashSet,HashMap
  单链表只能下一个
 双链表:和单链表类似,内存不连续,查询效率比单链表快一倍,但查询效率仍然是低的,应用:LinkedList
  双链表可以下一个,也可以上一个

//LinkedList双链表的源码
private static class Node<E> {E item;//当前元素Node<E> next;//下一个元素Node<E> prev;//上一个元素//构造方法Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}
16.3.6Vector

与ArrayList方法基本一样
底层同样使用的是数组
Vector是线程安全的,底层中只要有synchronized关键字就是线程安全的
 线程安全都是效率低
创建时底层数据的默认长度为10
和ArrayList有一定的区别,默认长度是0,第一次添加数据时才会扩容到10
查询快,在不考虑线程安全时使用ArrayList,考虑时使用Vector

public class Demo08 {public static void main(String[] args) {Vector<String> v = new Vector<>();v.add("张三");v.add("李四");System.out.println(v);v.remove("张三");System.out.println(v);
//		通过下标移除v.remove(0);System.out.println(v);v.remove("");}
}
16.3.7HashSet

Set集合的主要实现类之一
特点:无序(插入无序),无下标,不可重复,只能添加一个null值
常用的方法和Collection接口中基本一致

public class Demo09 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");
//		取出顺序和添加顺序无关:无序System.out.println(set);
//		没有下标
//		set.get(0);
//		不可重复set.add("张三");System.out.println(set);
//		可以添加null值,但是只能加入一个set.add(null);set.add(null);System.out.println(set);}
}
16.3.8HashSet数值的存放

无序:只是添加和set集合的存放是不一样的
在存储时内部是有一套自己的方案的,按照hash值进行存放的

public class Demo10 {public static void main(String[] args) {HashSet<String> set = new HashSet<>();
//		0~9的hash值是连续的
//		无序并不是杂乱无章的,只是添加和存储的顺序不一样set.add("1");set.add("7");set.add("2");set.add("3");set.add("4");set.add("8");set.add("0");set.add("5");set.add("9");set.add("6");System.out.println(set);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark编程实验二:RDD编程初级实践

目录 一、目的与要求 二、实验内容 三、实验步骤 1、pyspark交互式编程 2、编写独立应用程序实现数据去重 3、编写独立应用程序实现求平均值问题 4、三个综合实例 四、结果分析与实验体会 一、目的与要求 1、熟悉Spark的RDD基本操作及键值对操作&#xff1b; 2、熟悉使…

Linux-----21、挂载

# 挂载命令 将硬件资源&#xff0c;或文件资源&#x1f4bf;&#xff0c;和&#x1f4c2;空目录&#x1f517;连接起来的过程 # mount linux 所有存储设备都必须挂载使用&#xff0c;包括硬盘 ​ 命令名称&#xff1a;mount ​ 命令所在路径&#xff1a;/bin/mount ​ 执行…

得帆信息创始人-张桐,受邀出席 BV百度风投AIGC主题论坛

近日&#xff0c;得帆信息创始人兼CEO张桐&#xff0c;作为百度风投被投代表企业创始人受邀出席“向未来&#xff0c;共成长” BV百度风投AIGC主题论坛。 与包括上海市徐汇区相关部门领导、百度集团相关事业部负责人及代表&#xff0c;以及来自国寿资本、中网投、麦顿投资的投资…

如何让32位.Net 应用打开3G开关

昨天刚分享了《如何让.NET应用使用更大的内存》&#xff0c;结果就有同学说&#xff0c;<最好加一下32位如何开启大内存&#xff0c;因为很多传统项目32位&#xff0c;实在迁移不动了>&#xff0c;那么&#xff0c;我就验证了一些可行的方案&#xff0c;发现都挺简单的。…

内网安全—Windows系统内核溢出漏洞提权

系统内核溢出漏洞提权 往缓冲区中写入超出限定长度的内容&#xff0c;造成缓冲区溢出&#xff0c;从而破坏程序的堆栈进而运行自己精心准备的指定代码&#xff0c;达到攻击的目的。 分类&#xff1a; 堆溢出 栈溢出 查找补丁的方法 1、手工查找补丁情况 systeminfo Wmic qfe…

CGAL和求解器

几个CGAL包必须解决稠密或稀疏矩阵的线性系统、线性整数规划和二次规划。这个包为此提供了概念和模型。 对于线性系统&#xff0c;我们通常使用Eigen库提供模型。 Eigen类Eigen_matrix和Eigen_vector的封装器也在需要时提供。为其他求解器开发等效模型很简单&#xff0c;例如在…

在Django中使用多语言(i18n)

在Django中使用多语言 配置中间件 MIDDLEWARE [......django.contrib.sessions.middleware.SessionMiddleware,django.middleware.locale.LocaleMiddleware, # 此行重点django.middleware.common.CommonMiddleware,...... ]配置翻译文件目录 根目录下创建目录locale # 国…

Cmake基础(5)

这篇文章主要描述如何使用cmake构建一个库工程 文章目录 add_libraryinstall 库工程的代码&#xff1a;头文件和源文件 #ifndef ADD_H #define ADD_H#ifdef _WIN32 #ifdef MYMATH_EXPORTS #define MYMATH_API __declspec(dllexport) #else #define MYMATH_API __declspec(dll…

CopyOnWriteArrayList(一)

1 CopyOnWriteArrayList介绍 CopyOnWriteArrayList是一个线程安全的ArrayList。 CopyOnWriteArrayList是基于lock锁和数组副本的形式去保证线程安全。 在写数据时&#xff0c;需要先获取lock锁&#xff0c;需要复制一个副本数组&#xff0c;将数据插入到副本数组中&#xff0c…

Semaphore学习一

一、定义 是JUC包下的一个工具类&#xff0c;我们可以通过其限制执行的线程数量&#xff0c;达到限流的效果。 当一个线程执行时先通过其方法进行获取许可操作&#xff0c;获取到许可的线程继续执行业务逻辑&#xff0c;当线程执行完成后进行释放许可操作&#xff0c;未获取达到…

Python 全栈体系【四阶】(七)

第四章 机器学习 六、多项式回归 1. 什么是多项式回归 线性回归适用于数据呈线性分布的回归问题。如果数据样本呈明显非线性分布&#xff0c;线性回归模型就不再适用&#xff08;下图左&#xff09;&#xff0c;而采用多项式回归可能更好&#xff08;下图右&#xff09;。例…

数据安全传输基础设施平台(二)

5安全传输平台总体设计 5.1 方案特点 规范化&#xff1a;严格遵循各种相关规范设计。独立性&#xff1a;系统各子系统间互相独立&#xff0c;在保持系统间接口的前提下&#xff0c;各系统间的升级互不干扰。最小耦合性&#xff1a;各子系统进行严格功能分解&#xff0c;每个子…

PCL点云处理之点云置平(拟合平面绕中心旋转到绝对水平)(二百二十七)

PCL点云处理之点云置平(绕中心旋转到绝对水平)(二百二十七) 一、什么是点云置平二、算法流程三、算法实现一、什么是点云置平 有时候,我们处理的点云平面并非位于水平面,而是位于某个任一三维平面上,而大多数算法又只能在水平面处理,或者水平面的点云处理是相对更简单…

P2P应用

目录 一.P2P的简介 二.P2P的工作方式 1.具有集中目录服务器的P2P工作方式 2.具有全分布式结构的P2P文件共享程序 一.P2P的简介 P2P(对等连接)&#xff0c;是指两台主机在通信时&#xff0c;并不区分哪一个是服务请求方和哪一个是服务提供方。只要两台主机都运行了对等连接…

人工智能_机器学习069_SVM支持向量机_网格搜索_交叉验证参数优化_GridSearchCV_找到最优的参数---人工智能工作笔记0109

然后我们再来说一下SVC支持向量机的参数优化,可以看到 这次我们需要,test_data这个是测试数据,容纳后 train_data这个是训练数据 这里首先我们,导出 import numpy as np 导入数学计算包 from sklearn.svm import SVC 导入支持向量机包 分类器包 def read_data(path): wit…

ping: unknown host www.baidu.com

您遇到的问题表明系统无法解析 “www.baidu.com” 的域名。这通常与 DNS&#xff08;域名系统&#xff09;配置或网络连接问题有关。以下是一些解决步骤&#xff1a; 1. 检查网络连接 首先确保您的系统已连接到互联网。您可以尝试 ping 一些知名的网站或使用 IP 地址来测试连…

从事开发近20年,经历过各种技术的转变和进步

1、jsp、javabean、servlet、jdbc。 2、Struts1、hibernate、spring。 3、webwork、ibatis、spring 4、Struts2、mybatis、spring 5、spring mvc &#xff0c;spring全家桶 6、dubbo&#xff0c;disconf 微服务&#xff0c;soa 7、springboot 全家桶 8、docker 9、dock…

qt使用事件来进行文件操作

使用键盘进行操作 #include<QKeyEvent> 包含的头文件 在.h文件中添加此函数 void keyPressEvent(QKeyEvent*k); 在.cpp中的实现操作 void MainWindow::keyPressEvent(QKeyEvent*k) {if(k->modifiers()Qt::ControlModifier&&k->key()Qt::Key_S){saveAc…

AXure的情景交互

目录 导语&#xff1a; 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语&#xff1a; Axure是一种流行的原型设计工具&#xff0c;可以用来创建网站和应用程序的交互原型。通过Axure&#xff0c;设计师可以创建情景交互&#xff0c;以展示用户与系统的交…

力扣题目学习笔记(OC + Swift) 14. 最长公共前缀

14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 方法一 竖向扫描法 个人感觉纵向扫描方式比较直观&#xff0c;符合人类理解方式&#xff0c;从前往后遍历所有字符串的每一列&#xff0c;比较相同列上的…