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 {
    @Test
    public 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 list
        List<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 遍历map
        Map<String,String> map=new HashMap<>();
        System.out.println("for-each遍历Map-----------");
        map.put("1", "111");
        map.put("2", "222");
        map.put("3", "222");
        //得到key的collecton
        Set<String> keySet=map.keySet();
        for(String key:keySet){
            System.out.println("map["+key+"]="+map.get(key));
        }

    }

    @Test
    public void t2(){
        System.out.println("=======Iterator循环================");
        //1-2 list
        List<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 遍历map
        Map<String,String> map=new HashMap<>();
        System.out.println("Iterator 遍历Map-----------");
        map.put("1", "111");
        map.put("2", "222");
        map.put("3", "222");
        //得到key的collecton
        Set<String> keySet=map.keySet();
        iter=keySet.iterator();
        while (iter.hasNext()) {
            String key= (String) iter.next();
            System.out.println("map["+key+"]="+map.get(key));
        }
    }

    @Test
    public 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 list
        List<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));
        }


    }

    @Test
    public 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);
    }



    @Test
    public 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());

@Test
    public 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] ) ;//可以获得对应的对象数组

测试代码


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

执行过程

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

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

@Test
    public 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 中的对象类型(如数组、集合、自定义类等)则是以地址传递的方式进行参数传递。这意味着当我们将一个对象作为参数传递给一个方法时,方法内部使用的是这个对象的引用,而不是对象本身。

执行过程

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

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

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

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

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

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

测试代码:

 @Test
    public 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常见数据结构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…

第二十一章博客

计算机应用实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

C++面试宝典第9题:找出第K大元素

题目 给定一个整数数组a,同时给定它的大小N和要找的K(1 <= K <= N),请根据快速排序的思路,找出数组中第K大的数(保证答案存在)。比如:数组a为[50, 23, 66, 18, 72],数组大小N为5,K为3,则第K大的数为50。 解析 这道题主要考察应聘者对于快速排序的理解,以及实…

开源项目解读 —— Self-Operating Computer Framework # 长期主义 # 价值

价值&#xff1a;生成主函数业务逻辑函数思维导图&#xff0c;帮助理解&#xff0c;PR到开源项目&#xff0c;希望帮助大家理解IPA工作原理&#xff0c;国内没有好的开源项目&#xff0c;我就来翻译分析解读&#xff0c;给大家抛砖引玉。思维导图用文心一言配合其思维导图插件实…

算法基础之数字三角形

数字三角形 核心思想&#xff1a;线性dp 集合的定义为 f[i][j] –> 到i j点的最大距离 从下往上传值 父节点f[i][j] max(f[i1][j] , f[i1][j1]) w[i][j] 初始化最后一层 f w #include <bits/stdc.h>using namespace std;const int N 510;int w[N][N],f[N][…

Dash中 基本的 callback 5

app.callback 在Dash中&#xff0c;app.callback 被用于创建交互性应用程序&#xff0c;它用于定义一个回调函数&#xff0c;该函数在应用程序中发生特定事件时被触发。回调函数可以修改应用程序的布局或更新图表等内容&#xff0c;从而实现动态交互。 下面是一个简单的 app.…

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…

Plantuml之序列图语法介绍(十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Rust与AI】LLM模型基本架构

本篇是《Rust与AI》系列的第二篇&#xff0c;上一篇我们主要介绍了本系列的概览和方向&#xff0c;定下了一个基调。本篇我们将介绍LLM的基本架构&#xff0c;我们会以迄今为止使用最广泛的开源模型LLaMA为例展开介绍。 LLM背景 Rust 本身是不挑 AI 模型的&#xff0c;但是 LLM…

Java进阶(第六期): Arrays类(数组工具)、冒泡排序、选择排序、二分查找、【正则表达式】、Java正则爬取信息

文章目录 一、Arrays1.1代码示例&#xff1a; 二、冒泡排序2.1 代码示例 三、选择排序3.1 代码示例 四、二分查找4.1 代码示例 &#xff08;这里采用乱序数组&#xff09; 五、正则表达式5.1 正则表达式的基本使用5.2 正则表达式爬取信息练习 Java进阶&#xff08;第六期&#…

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

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

CGAL的三维点集

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

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展&#xff0c;越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统&#xff08;ADAS&#xff09;中的横向辅助驾驶进行深入研究。在这项研究中&#xff0c;LabVIEW作为一个强大的系…

数禾使用 Knative 加速 AI 模型服务部署丨KubeCon China 2023

作者&#xff1a;李鹏&#xff08;阿里云&#xff09;、魏文哲&#xff08;数禾科技&#xff09;&#xff0c; 此文基于 KubeCon China 2023 分享整理 摘要 AI 服务的数据、训练、推理等都需要消耗大量的计算资源以及运维成本&#xff0c;在数禾科技的金融业务场景下&#xf…

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

遇到DDOS怎么办,盾真的可以抗攻击吗

网络在以难以想象的速度发展&#xff0c;黑客们针对网络漏洞发起的攻击也从未停止&#xff0c;但复杂的网络环境让网络安全的维护更为艰难&#xff0c;如果游戏公司没有做好防御措施&#xff0c;黑客发起攻击只是时间问题。在网络攻击愈加多元化的今天&#xff0c;游戏行业可以…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

图解二叉树的Morris(莫里斯)遍历

二叉树的Morris(莫里斯)遍历 本文参考链接&#xff1a;https://leetcode.cn/problems/binary-tree-preorder-traversal/submissions/490846864/ 文章目录 二叉树的Morris(莫里斯)遍历模板代码前序遍历中序遍历后序遍历 Morris 遍历使用二叉树节点中大量指向 null 的指针&…

Apache Commons CLI:构建命令行应用的利器

引言 大家好&#xff01;我是小黑&#xff0c;本文聊聊如何用Apache Commons CLI构建命令行应用。咱们都知道&#xff0c;命令行界面&#xff08;CLI&#xff09;虽然看起来不如图形界面那么花哨&#xff0c;但在许多场景下&#xff0c;它的效率和便利性是无与伦比的。特别是对…

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…