当前位置: 首页 > article >正文

Java和C语言语法细节(持续更新中)

30.导包:

在自定义类中,使用如上述图片的快捷方式时,要注意后面有导包的描述,一定要用对了,特别是自定义类有重复的情况下


31.\n是一个换行符:

如:


32.集合去重操作:

若集合底层是哈希表结构,重写hashCode方法和equals方法以做到去重;

此外重写compareTo方法做到去重。


33.双列集合创建成数组举例:

package a33MyMap;
​
import java.util.HashMap;
​
public class Test {
    public static void main(String[] args) {
        //1.创建集合数组对象
        HashMap<String,char>[] hm=new HashMap[5]; 
        //HashMap<String,char>[] hm= new java.util.HashMap<String, char>()[5];是错误的
    }
}

34.双列集合中键和值都不能是基本数据类型。

如果键和值要用到基本数据类型,则需要用包装类

如:HashMap<String,Integer> hm=new HashMap<>();


35.双列集合在数组中添加元素的注意事项:

package a34practice;
​
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
​
public class Test {
    public static void main(String[] args) {
        //1.创建集合数组对象
        Map<String,String>[] m=new HashMap[1];
​
        //2.输入属性
         /* 1:m为数组名,代表数组地址值,m.put()是错误的,
              m[0].put才对
            2.在调用put方法前需要m[0]=new HashMap<>();
              不然的话直接添加就是一个null值
          */
        m[0]=new HashMap<>();
        m[0].put("张三","深圳");
​
        //3.遍历
         //此时m也只是数组名,无法调用forEach方法,m[0]才可以调用forEach方法,因为m[0]才是一个集合对象
        m[0].forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"="+value);//运行结果为张三=深圳
            }
        });
    }
}

36.获取字符串每一个字符:(注:字符串的charAt方法可以获取指定索引上的字符)

字符串不能用增强for遍历


37.基本数据类型包装类:

Java基本数据类型(也称为原始数据类型)包括byteshortintlongfloatdoublecharboolean。为了能让这些基本数据类型像对象一样被操作(比如放入集合中、进行序列化等),Java为每种基本数据类型都提供了对应的包装类(Wrapper Class)。

这些包装类位于java.lang包中,它们分别是:

  1. Byte - 对应基本数据类型 byte

  2. Short - 对应基本数据类型 short

  3. Integer - 对应基本数据类型 int

  4. Long - 对应基本数据类型 long

  5. Float - 对应基本数据类型 float

  6. Double - 对应基本数据类型 double

  7. Character - 对应基本数据类型 char

  8. Boolean - 对应基本数据类型 boolean

使用包装类的目的

  • 作为集合的元素:Java集合(如ArrayListHashMap等)只能存储对象引用,而不能直接存储基本数据类型。因此,当我们想要将基本数据类型存储在集合中时,就需要使用其对应的包装类。

  • 提供方法:包装类提供了许多实用的方法,比如类型转换(parseIntparseDouble等)、基本类型与字符串的转换(toString)、比较大小(compareTo)等。

  • 泛型支持:Java泛型不支持基本数据类型,只能使用包装类。

自动装箱与拆箱

从Java 5(JDK 1.5)开始,引入了自动装箱(Autoboxing)和拆箱(Unboxing)的概念。这意味着基本数据类型与其对应的包装类之间的转换可以自动进行,无需手动编写代码进行转换。例如:

Integer i = 10; // 自动装箱:int -> Integer
int j = i; // 自动拆箱:Integer -> int

注意事项

  • 虽然自动装箱和拆箱提供了便利,但它们可能会导致性能问题,因为涉及到对象的创建和销毁。

  • 某些情况下,自动装箱可能会导致意外的行为,比如Integer类型的缓存问题(在-128到127范围内的Integer对象是缓存的,超出这个范围则每次都会创建新对象)。

因此,在需要高性能或避免潜在问题时,建议直接使用基本数据类型而不是包装类,或者在必要时手动进行装箱和拆箱操作。


38.Arrays类常用方法(Arrays类用来操作数组):包括比较,排序,转换为字符串


39.有关数据类型转换:(注:方法最终的类型以方法定义时返回的类型为准,不是return语句后的类型)

例一:

int x(int a,int b) { 
        return 1.2*(a+b); 
    }

上述代码会报错,因为返回的是浮点型(乘了个1.2),而方法定义时返回整型,浮点型比整型大,不能隐式转换从浮点型转为整型,因为大范围不能变到小范围的。

修改方案:可以在方法定义时返回double,如下

double x(int a, int b) {
        return 1.2*(a+b);
    }

例二:

float x( int a,int b ) {
        return (a-b);
    }

上述代码正确,a和b均为整型,所以返回的是整型,方法定义时返回浮点型,浮点型比整型大,能隐式转换从整型转为浮点型,因为小范围可以变到大范围的。

例三:

int x( int a,int b) {
        return a-b;
    }

上述代码正确,返回的类型和方法定义时返回的类型一致,均为整型。

例四:

int x( int a,int b ) { 
        return a*b; 
    }

上述代码正确,返回的类型和方法定义时返回的类型一致,均为整型。


40.双列集合用stream流的方法:

双列集合无法直接使用stream流,需要先用keySet方法(获取所有的键)或entrySet方法(获取到所有键值对对象的单列集合)将其转换为单列集合,才能使用stream流:


41.编写算法时一定要注意极端情况。


42.当图片无法显示时,一定要看图片路径和自己写的图片路径是否一样,不一样就无法显示。


43.符号->和.不能乱用:

->”的用处是使用一个指向以便访问结构体或对象其内成员

.”的用处是使用一个指向以便访问结构体或对象


44.C语言中变量不用static,extern修饰的话默认为extern。


45.单链表中头结点只是没数据,但不是NULL。


46.顺序表和单链表一般都会设置一个变量记录长度,而且他们底层也自动有了长度,所以不需要设置成数组


47.C语言逻辑问题:

修改方案:


48.迭代和递归:

迭代和递归是计算机科学中两种常见的循环或重复执行的方式,它们在算法和数据结构的设计中扮演着重要角色。下面是关于迭代和递归的详细解释:

迭代(Iteration)

迭代是指通过循环结构(如for循环、while循环)来重复执行某段代码,直到满足特定的条件为止。在迭代过程中,每次循环都会使用上一次循环的结果作为下一次循环的初始值。迭代的核心是循环控制变量(如计数器)的更新,以及循环条件(何时停止循环)的判断。

迭代的特点包括:

  • 显式地使用循环结构。

  • 循环代码块中参与运算的变量同时是保存结果的变量。

  • 当前保存的结果作为下一次循环计算的初始值。

  • 使用计数器或条件判断来结束循环。

递归(Recursion)

递归是一种通过函数自身调用自身来解决问题的编程方法。在递归中,函数会不断地调用自身,直到满足某个基本条件(称为基本情况或基准情形)为止。递归的核心在于将大问题分解为小问题,直到问题变得足够小,可以直接解决为止,然后再将结果逐级返回。

递归的特点包括:

  • 显式或隐式地调用函数自身。

  • 存在一个或多个基本情况,用于停止递归调用。

  • 递归调用通常将问题分解为更小的问题,然后解决这些小问题。

  • 递归过程类似于树的深度优先遍历,从根节点开始,不断向下分解,直到叶子节点(基本情况),然后再逐级返回结果。

迭代与递归的区别

  1. 实现方式:迭代是通过循环结构实现的,而递归是通过函数自身调用自身实现的。

  2. 内存使用:大量的递归调用会建立函数的副本,可能耗费大量的时间和内存。而迭代则不需要反复调用函数和占用额外的内存。

  3. 代码复杂度:递归的代码通常更加简洁,因为它遵循了将问题分解为更小问题的自然思路。但是,递归的代码可能更难理解和调试,尤其是当递归深度很大时。迭代的代码则相对更加直观,但可能需要更长的代码来实现相同的功能。

  4. 适用场景:递归在处理具有递归性质的问题(如树形结构、图形遍历等)时非常有效。而迭代则更适合处理那些可以通过简单重复来解决的问题。

注意事项

  • 无限递归或无限迭代都可能导致程序崩溃或停止执行。因此,在使用递归或迭代时,必须确保存在明确的停止条件。

  • 在选择使用递归还是迭代时,需要考虑问题的性质、代码的可读性、性能要求以及内存使用等因素。

最后,需要指出的是,虽然递归在某些情况下可以提供更简洁的代码和更自然的解决方案,但在实际应用中,迭代由于其更高的执行效率和更低的内存使用,往往被更广泛地采用。



http://www.kler.cn/news/323493.html

相关文章:

  • pytorch ----【输入张量.data.size()/输入张量.size()】的使用
  • 基于MATLAB的虫害检测系统
  • Java实现找色和找图功能
  • 每天一道面试题(20):锁的发生原因和避免措施
  • C++ | 定长内存池 | 对象池
  • 【C语言】动态内存管理:malloc、calloc、realloc、free
  • 每天一道面试题(19):Spring Boot 中自动装配机制的原理
  • IIS开启后https访问出错net::ERR_CERT_INVALID
  • EasyExcel使用介绍
  • 【个人笔记】数据一致性的解决方案
  • 10.C++程序中的循环语句
  • RS485ESD-Enhanced, Fail-safe, Slew-Rate-limited RS-485/RS-422 Transceivers
  • 基于Hive和Hadoop的白酒分析系统
  • 信号处理: Block Pending Handler 与 SIGKILL/SIGSTOP 实验
  • 开关电源要做哪些测试?
  • Docker精讲:基本安装,简单命令及核心概念
  • ①无需编程 独立通道 Modbus主站EtherNet/IP转ModbusRTU/ASCII工业EIP网关串口服务器
  • 染色算法的简单概述
  • altera FPGA下载失败
  • MySQL之基础篇
  • 【bug fixed】hexo d的时候Spawn failed
  • c语言200例 066
  • Spring Boot实战:构建在线商城系统
  • PyQt5中关于QLineEdit的空输入报错的简单处理
  • 华为云发布全栈可观测平台AOM,以AI赋能应用运维可观测
  • Apache Cordova/PhoneGap
  • ConstructorParameters
  • 基于elasticsearch存储船舶历史轨迹
  • 基于SpringBoot+Vue的大学生勤工助学兼职管理系统
  • 2024最新【PyCharm】史上最全PyCharm安装教程,图文教程(超详细)