java进阶(二)-java小干货

java一些精干知识点分享

  • 2. java小干货
    • 2.1循环遍历
    • 2.2可变参数
    • 2.3 list和数组转化
      • 2.3.1 数组转list
      • 2.3.2 list转数组
    • 2.4 值传递和地址传递
      • 2.4.1值传递
      • 2.4.2 地址传递
      • 2.4.3易错点总结
    • 2.5 数组
      • 数组帮助类Arrays
    • 2.5 基本数据类型和包装类
    • 2.5集合
    • 2.6文件流
    • 2.7java代码块、内部类和匿名类
    • 2.8 java泛型及通配符
    • 2.9 日期类LocalDate
    • 2.10枚举
    • 2.11 java常见数据结构

2. java小干货

2.1循环遍历

数组、list、map都需要遍历循环,有下面集中循环方式
1.for ecah
list可以是一个数组、list、set

// list可以是一个数组、list、set
for(bject o :list) {}

2.Iterator迭代器
list可以是list、set类的子类

Iterator iter = list.iterator();while(iter.hasNext()){Object o = iter.next();}

3.loop with size
可以是数组、list能得到索引长度的类及子类

for(int i=0;i<list.size();i++){Object o= list.get(i);}

4.lambda表达式

 list.forEach((value)->{System.out.println(value);});

代码示例

public class GanHuo {@Testpublic void t1(){//1.for-each遍历,最简单,但无法获得索引System.out.println("=======for(Object:list)循环=========");String arrayStr[]=new String[]{"1","2","3"};//1-1 数组System.out.println("for-each遍历数组-----------");for (String s : arrayStr) {System.out.println("arrayStr:"+s);}//1-2 listList<Integer> list= Arrays.asList(1,2,3,4);System.out.println("for-each遍历list-----------");for (Integer i : list) {System.out.println("list:"+i);}//1-3 遍历mapMap<String,String> map=new HashMap<>();System.out.println("for-each遍历Map-----------");map.put("1", "111");map.put("2", "222");map.put("3", "222");//得到key的collectonSet<String> keySet=map.keySet();for(String key:keySet){System.out.println("map["+key+"]="+map.get(key));}}@Testpublic void t2(){System.out.println("=======Iterator循环================");//1-2 listList<Integer> list= Arrays.asList(1,2,3,4);System.out.println("Iterator 遍历list-----------");Iterator iter=list.iterator();while (iter.hasNext()) {System.out.println("list:"+iter.next());}//1-3 遍历mapMap<String,String> map=new HashMap<>();System.out.println("Iterator 遍历Map-----------");map.put("1", "111");map.put("2", "222");map.put("3", "222");//得到key的collectonSet<String> keySet=map.keySet();iter=keySet.iterator();while (iter.hasNext()) {String key= (String) iter.next();System.out.println("map["+key+"]="+map.get(key));}}@Testpublic void t3(){System.out.println("=======for。size循环================");//1-1 数组String arrayStr[]=new String[]{"1","2","3"};System.out.println("loop size 遍历数组-----------");for (int i = 0; i < arrayStr.length; i++) {System.out.println("arrayStr["+i+"]="+arrayStr[i]);}//1-2 listList<Integer> list= Arrays.asList(1,2,3,4);System.out.println("loop size 遍历list-----------");for (int i = 0; i < list.size(); i++) {System.out.println("list["+i+"]="+list.get(i));}}@Testpublic void t4(){System.out.println("=======lambda表达式================");//list的lambda表达式List<Integer> list= Arrays.asList(1,2,3,4);System.out.println("lambda表达式 遍历list-----------");list.forEach((value)->{System.out.println(value);});//Map的lambda表达式Map<String,String> map=new HashMap<>();System.out.println("lambda表达式 遍历Map-----------");map.put("1", "111");map.put("2", "222");map.put("3", "222");map.forEach((key, value)->{System.out.print("key = " + key);System.out.println(", value = " + value);});}}

2.2可变参数

可变参数是指不指定参数的个数

定义:
数据类型… 变量名
可变参数规范
1.可变参数本身是一个数组
2.可变参数也可传递一个数组
3.可变参数个数不受限制,可无限制,也可没有
4.如果可变参数和常规参数混合,则可变参数要放到最后
5.每个方法最多只能有一个可变参数
代码示例

public class ChangeParam {public void param(Integer... val){System.out.println("val包含:"+val.length+"个参数");for (Integer i : val) {System.out.println(i);}}/***如果一个方法里包含常规参数和可变参数,则可变参数必须放置到最后一个*/public void param1(String name,Integer age,String... likes){System.out.println("name:"+name);System.out.println("age:"+age);System.out.println("likes-----");String temp="";for (String like : likes) {temp+=like+",";}System.out.println(temp);}@Testpublic void t1(){//可以传递不受限制的个数param(1,2,3);//可以不传参数param();//也可传递数组Integer[] array={1,2,3};param(array);//常规和可变参数混合param1("蒋增奎",20,"火锅","串串","烤鸭");}
}

2.3 list和数组转化

2.3.1 数组转list

1.使用List=Arrays.asList(数组对象),最简单,但不能新增删除
2.List=new ArrayList<>(Arrays.asList(intArray)),可新增删除,但性能差
3. Collections.addAll(list对象, 数组对象);可新增删除,性能好
4.list= Stream.of(数组对象).collect(Collectors.toList());

@Testpublic void array2List(){System.out.println("=========Arrays.asList=======");//1---直接用Arrays.asList后不能再新增System.out.println("1---直接用Arrays.asList后不能再新增");//基本类型数组Integer[] intArray={1,2,3};List<Object> list1= Arrays.asList(intArray);// list1.add(4);   //不能再新增,否则要报异常printList(list1);//自定义数组TestVO[] objArray={new TestVO(1,"jzk"),new TestVO(2,"张三")};list1=Arrays.asList(objArray);printList(list1);//2--Arrays.asList作为构造参数传入,可新增,但性能差System.out.println("2--Arrays.asList作为构造参数传入,可新增,但性能差");list1=new ArrayList<>(Arrays.asList(intArray));list1.add(4);printList(list1);//3--Collections.addAll(list,数组);能新增删除,性能好System.out.println("3--Collections.addAll(list,数组);能新增删除,性能好");list1=new ArrayList<>();Collections.addAll(list1, intArray);list1.add(4);printList(list1);//4--使用 Stream;能新增删除,性能好System.out.println("4--使用 Stream;能新增删除,性能好");list1= Stream.of(intArray).collect(Collectors.toList());list1.add(4);printList(list1);}private void printList(List<Object> list){for (Object o : list) {System.out.println(o);}}

2.3.2 list转数组

核心用到list.toArray()方法
1.Object[] arrays=list.toArray(); 只能获得Object数组
2.对象数组=list.toArray(new 对象[list.size] ) ;//可以获得对应的对象数组

测试代码

@Testpublic void list2array(){List<TestVO> list=getTestVO();System.out.println("方法1:list.toArray()===========");//注意:只能用转换成Object[]数组,不能强制转化Object[] arrays=list.toArray();for (Object array : arrays) {System.out.println((TestVO)array);}System.out.println("方法2:list.toArray(数组对象)===========");//这样可获得实际的类TestVO[] vos=new TestVO[list.size()];list.toArray(vos );for (TestVO vo : vos) {System.out.println(vo);}//或者这样写System.out.println("方法3:list.toArray(数组对象)简写===========");vos=list.toArray(new TestVO[list.size()]);for (TestVO vo : vos) {System.out.println(vo);}System.out.println("方法4:String[] strings = list.stream().toArray(String[]::new);===");TestVO[] vos2=list.stream().toArray( TestVO[]::new);for (TestVO vo : vos2) {System.out.println(vo);}}private void printList(List<Object> list){for (Object o : list) {System.out.println(o);}}private List<TestVO> getTestVO(){List<TestVO> list=new ArrayList<>();list.add(new TestVO(1,"jzk"));list.add(new TestVO(2,"张三"));return list;}

2.4 值传递和地址传递

在学习 Java 编程语言的过程中,我们经常会听到“值传递”和“地址传递”这两个概念。它们是用来描述参数传递方式的术语,而理解它们的区别对于编写高效的代码非常重要。在本文中,我们将详细介绍这两种传递方式,并通过代码示例来说明它们的差异。

2.4.1值传递

在 Java 中,基本数据类型(如整数、布尔值等)都是以值传递的方式进行参数传递。这意味着当我们将一个基本数据类型作为参数传递给一个方法时,方法内部会创建一个新的变量来存储这个参数的值,而不会影响原始的变量。

执行过程

  • 首先,在调用方法时,将实际参数的值复制一份,并将这份副本传递给方法进行操作。
  • 在方法内部,这个副本的值被赋给一个新的局部变量。
  • 在方法执行过程中,对该局部变量的任何改动都不会影响原始的变量,因为它们指向的是不同的内存空间。
  • 当方法执行完毕后,这个局部变量和方法的栈帧都会被销毁,而原始的变量的值保持不变。

基本数据类型的传递过程中,传入的值被复制到方法内部,并在方法内部进行操作,但不会影响原始变量的值。

@Testpublic void valPass(){String str="a";double db= Double.parseDouble("34.5");Double db1=45.2;Integer zs=Integer.valueOf(100);int zs1=200;boolean b=false;Boolean b1= true;System.out.println("str="+str);System.out.println("db="+db);System.out.println("db1="+db1);System.out.println("zs="+zs);System.out.println("zs1="+zs1);System.out.println("b="+b);System.out.println("b1="+b1);change1(str,db,db1,zs,zs1);System.out.println("str="+str);System.out.println("db="+db);System.out.println("db1="+db1);System.out.println("zs="+zs);System.out.println("zs1="+zs1);}private void change1(String str,double db,Double db1,int zs,Integer zs1){System.out.println("============change==========");str="b";db=-45.2;db1=-22.4;zs=-1;zs1=-2;}

执行效果,可以看出这些都是值传递,被引用后并没有改变以前值:

str=a
db=34.5
db1=45.2
zs=100
zs1=200
b=false
b1=true
============change==========
str=a
db=34.5
db1=45.2
zs=100
zs1=200

2.4.2 地址传递

与基本数据类型不同,Java 中的对象类型(如数组、集合、自定义类等)则是以地址传递的方式进行参数传递。这意味着当我们将一个对象作为参数传递给一个方法时,方法内部使用的是这个对象的引用,而不是对象本身。

执行过程

  • 创建一个对象并将其引用赋值给一个变量。

  • 将这个变量作为参数传递给一个方法。

  • 在方法内部,参数变量接收到了对原始对象的引用。

  • 在方法内部修改参数变量所指向的对象时,原始对象也会受到影响。

  • 方法执行完毕后,返回到原始调用处,可以通过原始变量访问到被修改后的对象。

对象的引用传递意味着传递的是对象的引用,通过引用可以访问和修改原始对象的属性。

测试代码:

 @Testpublic void addressPass(){StringBuffer sb=new StringBuffer("aa");TestVO vo=new TestVO(1,"蒋增奎");String[] array={"1","2","3"};List<Integer> list=new ArrayList<>();list.add(1);list.add(2);Map<String,Integer> map=new HashMap<>();map.put("1", 11);map.put("2", 22);System.out.println("sb:"+sb);System.out.println("vo:"+vo);System.out.println("array:"+ Arrays.toString(array));System.out.println("list:"+Arrays.toString(list.toArray()));System.out.println("map:"+map.toString());System.out.println("================");change2(sb,vo,array,list,map);System.out.println("sb:"+sb);System.out.println("vo:"+vo);System.out.println("array:"+ Arrays.toString(array));System.out.println("list:"+Arrays.toString(list.toArray()));System.out.println("map:"+map.toString());}private  void change2( StringBuffer sb, TestVO vo,String[] array,List<Integer> list,Map<String,Integer> map){sb.append("dd");vo.setName("蒋大爷");array[0]="改值11";list.add(3);map.put("3",333);}

效果,地址引用值都会被改变

sb:aa
vo:TestVO(id=1, name=蒋增奎)
array:[1, 2, 3]
list:[1, 2]
map:{1=11, 2=22}
================
sb:aadd
vo:TestVO(id=1, name=蒋大爷)
array:[改值11, 2, 3]
list:[1, 2, 3]
map:{1=11, 2=22, 3=333}

2.4.3易错点总结

易错点
java对象:String ,int等对应的封装类Integer,java.util.Date,BigDecimal是值传递,不是地址传递,虽然他们是对象

值传递VS地址传递

在这里插入图片描述

2.5 数组

数组帮助类Arrays

2.5 基本数据类型和包装类

2.5集合

2.6文件流

2.7java代码块、内部类和匿名类

2.8 java泛型及通配符

2.9 日期类LocalDate

2.10枚举

2.11 java常见数据结构

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

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

相关文章

DEA数据包络分析

数据包络分析(Data Envelopment Analysis&#xff0c;DEA)&#xff0c;1978年由 Charnes、Cooper和Rhodes创建的一种绩效评价技术(performance technique) 。采用多投入、多产出数据对多个决策单元(Decision Making Unit) 的相对效率进行评价因DEA的诸多优势&#xff0c;被广泛…

洛谷 P8772 [蓝桥杯 2022 省 A] 求和 刷题笔记

P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 处理 前缀和 提取公因式 然后模拟 #include<iostream> using namespace std; const int N2e510; long long a[N]; long long b[N],s[N]; int main(){ int n; cin>>n; …

裸机开发(2)-裸机实战

文章目录 LED灯GPIO中断中断相关概念IRQ中断简介GIC中断控制器简介总体框架图IMX6ULL 中断源ID对照 GIC逻辑分块CP15协处理器中断使能及优先级设置总中断使能具体中断ID使能中断优先级设置 LED灯 linux_bsp/board_driver/1.ledc GPIO中断 中断相关概念 IRQ中断简介 Cortex…

vue3(七)-基础入门之事件总线与动态组件

一、事件总线 事件总线使用场景&#xff1a; 两个兄弟组件之间的传参&#xff0c;或者两个没有关联的组件之间的传参 html &#xff1a;引入 publicmsg 与 acceptmsg 自定义组件 (自定义组件名称必须小写) <body><div id"app"><publicmsg></…

CGAL的三维点集

CGAL提供了几种处理点集的算法&#xff0c;从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构&#xff0c;但该软件包提供了一个3D点集结构&#xff0c;使用户更容易处理附加属性&#xff0c;如法向量、颜色、标签&#xff0c;并在其上调…

【Filament】立方体贴图(6张图)

1 前言 本文通过一个立方体贴图的例子&#xff0c;讲解三维纹理贴图&#xff08;子网格贴图&#xff09;的应用&#xff0c;案例中使用 6 张不同的图片给立方体贴图&#xff0c;图片如下。 读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角…

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA&#xff08;多尺度空洞注意力&#xff09;发表于今年的中科院一区(算是国内计算机领域的最高期刊了)&#xff0c;其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

洛谷——【数据结构1-2】二叉树

文章目录 题目【深基16.例1】淘汰赛题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 【深基16.例3】二叉树深度题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路&#xff1a;代码 [USACO3.4] 美国血统 American Heritage题目描…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

TLS 1.2详解

TSL由多个协议组成的两层协议集合&#xff0c;工作与应用层和传输层之间。 TLS协议包含两层协议&#xff1a;记录层协议&#xff08;TLS Record Protocol协议&#xff09;和 握手协议&#xff08;TLS Handshake Protocol协议&#xff09;&#xff0c;底层采用可靠传输协议&…

Lua的垃圾回收机制详解

Lua 是一种轻量级的编程语言&#xff0c;广泛用于嵌入到其他应用程序中&#xff0c;尤其是在游戏开发领域。Lua 的内存管理机制采用了自动垃圾收集&#xff08;Garbage Collection&#xff09;的方法。以下是Lua内存管理的一些关键方面&#xff1a; 垃圾收集原理概述 Lua 使用…

MFC 运行时类信息机制

目录 运行时类信息机制概述 测试 宏代换分析 结构体 CRuntimeclass 函数 GetRuntimeClass() 总结 执行过程分析 运行时类信息机制概述 在程序运行过程中可以获知对象的类的相关信息&#xff08;例如∶对象是否属于某个类) 如何使用&#xff1f; 类必须派生自CObject类…