java基础特别问题

news2024/11/19 20:41:09

基础学习

    • 数据类型转换
    • 运算符
    • 字符串
    • 方法传递参数: 值传递
    • 构造器
    • String
      • new关键字创建的对象则按对象方式去处理
    • 静态代码块和实例代码块
      • 静态代码块:
      • 实例代码块:
    • 多态
    • 匿名内部类
    • 格式:
    • StringJoiner (JDK1.8)
    • 小数计算BigDecimal
    • 时间
    • 时间
    • 集合
      • List 有序 有索引 重复
        • ArrayList 低层(数组)
        • LinkList 低层(双向链表)
          • 双链表
      • Set
        • HashSet 无序 不重复 无索引
          • 低层 哈希表(JDK1.8前:数组+链表 ;1.8后数组+链表+红黑树)
          • LinkedHashSet 有序(双链表的机制) 不重复 无索引
          • TreeSet 排序 不重复 无索引
            • 排序:
    • 可变参数
      • 双列集合
      • Map(key-value)
        • HashMap 无序 不重复 无索引
        • LinkedHashMap 有序 不重复 无索引
        • TreeMap 排序 不重复 无索引
    • Stream (JDK1.8上线)
      • 如何获取集合和数组的流
      • 中间操作
      • 终结方法(不在返回新流)
    • File
    • 字符集(1bit=8位)
      • 字符的编码和解码
        • 编码
        • 解码
    • io流
      • 字节流、字符流 (解决文件读写)
        • 字节流
        • 字符流
          • 字符流数据刷新
        • 关闭流
      • 缓冲流(解决读写性能)
        • 字节缓冲流
        • 字符缓冲流
        • 读写推荐使用:缓冲流+数组(数组扩大到一个阀值,其效率不会在继续显著提高)
      • 转换流(解决不同编码读取时的乱码)
      • 打印流
        • PrintStream 字节
        • PrintWriter 字符
      • 数据流
        • DataOutputStream 输出
        • DataInputStream 输入
      • 序列化流
    • 特殊文件
      • Properties(属性集合key=value)
        • 读取
        • 写入
      • XML 扩展标记语言
      • 读取
        • 方法

数据类型转换

byte short char :这三种类型相互运算是以int为结果类型
原因:以为他们之 间相互运算可能存在超过其原数据类型的存储空间

运算符

/:两个整数做运算其结果一定是整数,因为最高类型为整数
解决:通常可给其中一个整数*1.0来转换类型

int a=5;
int b=a/2    // 2

字符串

能算则算,不能算就在一起吧

		int a=10;
		char c='a';
		System.out.println(a+5);           // 15
		System.out.println(a+c+"test");    // 107test
		System.out.println("test"+a+111);  // test10111

方法传递参数: 值传递

  • 基本类型方法参数中传递时:为其数值的传递,结果,原数据无变化
  • 应用类型方法参数中传递时: 内存地址的传递,结果,堆中发生了变化

构造器

  • 如果类不写构造器,类编译时会自动生成一个无参构造器;
  • 如果类定义类有参构造器,则类不会在自动生成无参构造器,所以要手写补充无参构造器;

String

String是不可变的字符串
只要是以“xxx”方式创建的字符串,都会存储在堆内存的字符串常量池中,相同内存只会存储一份(节约内存)

new关键字创建的对象则按对象方式去处理

        String name1="name";
        String name2="name";
        System.out.println(name1==name2);  // true

        String name11=new String("nema");
        String name22=new String("nema");
        System.out.println(name11==name22);   // false

在这里插入图片描述
在这里插入图片描述
s2+“c”:去运算后生成堆内存对象

静态代码块和实例代码块

静态代码块:

  • 格式:static{}
  • 特点:类加载时自动执行,只会执行一次

静态代码块只执行一次

实例代码块:

  • 格式: {}
  • 特点:实例代码块会每次在创建对象时,在构造方法前执行

多态

编译看左边 运行看右边

匿名内部类

就是一种特殊的局部内部类;所谓匿名,是值不需要为此类指定名字
实质:匿名内部类编译成一个子类,子类会立马创建一个对象出来

格式:

new 类或者接口(参数){
	类体(一般是方法重写)
}

StringJoiner (JDK1.8)

解决:字符串拼接时候需要前缀、后缀、分隔符

 StringJoiner stringJoiner=new StringJoiner(",","[","]");
        stringJoiner.add("a");
        stringJoiner.add("b");
        stringJoiner.add("c");
        System.out.println(stringJoiner); // [a,b,c]

小数计算BigDecimal

BigDecimal bigDecimal =new BigDecimal (double) 此种方式也存在精度丢失。可以下来解决

  • BigDecimal bigDecimal =new BigDecimal (String );
  • BigDecimal bigDecimal = BigDecimal.valueOf(String);

时间

在这里插入图片描述

时间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集合

单列集合

List 有序 有索引 重复

ArrayList 低层(数组)

  • 初始化创建一个长度为0的数组
  • 添加第一个元素时,会创建个长度为10的数组
  • 存满时,会自动扩容1.5倍
  • 如果一次性添加多个元素,1.5倍不够用,则创建一个实际长度的数组
    特点:查询快,增删慢

LinkList 低层(双向链表)

双链表

在这里插入图片描述

Set

HashSet 无序 不重复 无索引

特点:增删改查性能就较好

低层 哈希表(JDK1.8前:数组+链表 ;1.8后数组+链表+红黑树)

哈希值:就是一个int的数值,每一个java对象都有,Object类的方法 hashCode返回其自己的哈希值
,不同对象的哈希值不同,但也可能存在相同(int -21亿,21亿,如果对象唱过21亿则会出现:哈希碰撞)
无序:使用元素的哈希值和数组的长度求余计算出存入的位置
在这里插入图片描述
扩容:

  • 数组 16*0.75=12,当数组元素超过12中翻倍扩
  • 链表:JKD8后长度超过8 生成红黑树
    在这里插入图片描述
    **红黑树:**
    根据对象内容去重
    正常情况下,每一个对象hashCode不同,根据其数据存储算法,则为非重复数据。当其hashCode相同时进一步比较equals是否相同;去重则为让其hashCode、equals都相同;对象重写其hashCode、equals让其算法相同即可
    hashCode 和 equals:
LinkedHashSet 有序(双链表的机制) 不重复 无索引

低层: 哈希表 ,但是它的每一个元素都多了一个双链表的机制记录前后的元素的位置

TreeSet 排序 不重复 无索引

低层:红黑树

排序:
  • 默认自带比较器
  • 让自定义类实现comparable 接口
  • TreeSet 有参构造器设置比较器(comparator)

可变参数

格式:数据类型…参数名称
特点:可不传数据、可传一个、可传多个、可传数组
注意:形参中只能有一个可变参数,只可以放在最后

 public static void main(String[] args) {
    testParam();
    testParam(1);
    testParam(2,3);
    testParam(new int[]{1,2,3,4,5});
    }
    public static  void testParam(int...param){
        System.out.println("----------:"+param.length);
    }

双列集合

Map(key-value)

HashMap 无序 不重复 无索引

LinkedHashMap 有序 不重复 无索引

TreeMap 排序 不重复 无索引

Stream (JDK1.8上线)

用于操作集合和数组的数据
特点:Stream流大量的集合了Lambda编程分格,更加强大和简洁的操作集合和数组

如何获取集合和数组的流

  • List ,Set直接使用Collection集合接口提供的stream()
  • Map map,ketSet 然后获取strean()
  • 数组 Arrays.stream(object[]) 或者 Stream.of(T…t)

中间操作

filter:过滤
sorted:排序
limit:限制数量
skip:跳过
distinct:去重
concat:多流合并为新流
map:映射

 List<String> list=new ArrayList();
        list.add("公司是");
        list.add("公司啊");
        list.add("阿萨德");
        list.add("规范的");
        list.add("轨道射灯");
        list.stream().filter(s -> s.startsWith("公司") && s.length() == 3).sorted().forEach(s -> System.out.println(s));

终结方法(不在返回新流)

  • foreach
  • count
  • max
  • min

返回对象

  • List 、Set ----->Collectors.toList()
  • Array------>toArray()
  List<String> newList = list.stream().filter(s -> s.startsWith("公司") && s.length() == 3).sorted().collect(Collectors.toList());

File

构造方法形参:文件路径
注: File.separator 根据系统获取分隔符-----兼容

  • 绝对路径:绝对地址查找
  • 相对路径:当前项目下查找

字符集(1bit=8位)

  • ASCIl 汉字占1字节
  • GBK 汉字占2字节 以1开头 如:1XXXXXXX 1XXXXXXX
  • UTF-8 汉字占3字节 以110 10 10开头 如:110xxxxx 10xxxxxx 10xxxxxx
    编码和解码其字符集必须一致(汉字在不同字符集所占字节不同),否则乱码

字符的编码和解码

编码

  • byte[] getBytes() :默认字符集
  • byte[] getBytes(String charsetName):指定字符集

解码

  • new String(byte[]) :默认字符集
  • new String(byte[],String charsetName):指定字符集

io流

在这里插入图片描述

字节流、字符流 (解决文件读写)

字节流

  • InputStream
    • FileInputStreat
  • OutputStream
    • FileOutPutStream
  try(        InputStream inputStream =new FileInputStream("F:"+File.separator+"a.txt");
                    OutputStream outputStream=new FileOutputStream("F:"+File.separator+"c.txt")) {

            byte[] bytes=new byte[1024];
            int len=0;
            while ((len=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
            }
        }catch (Exception e){

        }

字符流

  • Reader
    • FileReader
  • Writer
    • FileWriter
  try(        Reader reader=new FileReader("F:"+File.separator+"a.txt");
                    Writer writer= new FileWriter("F:"+File.separator+"b.txt")) {

            char[] chars=new char[6];
            int len=0;
            while ((len=reader.read(chars))!=-1){
                writer.write(chars,0,len);
            }
            writer.flush();
        }catch (Exception e){

        }
字符流数据刷新

本质: 频繁向磁盘写文件浪费性能。 则输出的数据写入内存,当刷新或关闭,则从内存写入到磁盘文件。当写入内存的数量达到一定的程度也会写入,
字符流输出数据后,要刷新或者关闭(关闭会自动刷新)字符流,写出去的数据才会生效。

关闭流

  • try-catch-finally
    finally: 先判断流对象是否为空(因为可能在创建流对象前就已经出异常)
  • try-with-resource(对 try-catch-finally的优化)
    格式:try(定义资源1,定义资源2,…){
    可能出现的异常代码
    }catch(exception e){
    }
    注: try(只可放置资源对象,何为资源对象,是指对象实现了AutoCloseable接口,资源使用完毕后,会自动调用其close接口,完成释放)
  try ( InputStream fileInputStream = new FileInputStream("f:" + File.separator + "a.txt");
              FileOutputStream fileOutputStream=new FileOutputStream(new File("f:" + File.separator + "b.txt"));){
            int available = fileInputStream.available(); // 数据量过大不可
            byte[] buff=new byte[available];
            int len=0;
            while ((len=fileInputStream.read(buff))!=-1){
                fileOutputStream.write(buff,0 ,len);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

缓冲流(解决读写性能)

字节缓冲流

包装原始数据,提升读写性能: 自带8KB的缓冲池,构造参数可自定义修改大小
本质:从磁盘那一次性读取缓冲区大小的数据到内存,从内存一次性读取缓冲区大的数据到磁盘

  • BufferedInputStream
  • BufferedOutputStream

字符缓冲流

包装原始数据,提升读写性能: 自带8KB的缓冲池,构造参数可自定义修改大小
本质:从磁盘那一次性读取缓冲区大小的数据到内存,从内存一次性读取缓冲区大的数据到磁盘

  • BufferedReader
    • readLine() :读取一行字符
 String line="";
    while ((line=bufferedReader.readLine())!=null){
         bufferedWriter.write(line);
    }
  • BufferedWriter
    • newLine() : 写入一个行分隔符。

读写推荐使用:缓冲流+数组(数组扩大到一个阀值,其效率不会在继续显著提高)

转换流(解决不同编码读取时的乱码)

本质:获取原始字节流,按照指定字符集编码转为输入或输出流。

  • InputStreamReader (字符输入转换流:按照指定字符集编码解析输入)
    • 构造函数:InputStreamReader(InputStream in, CharsetDecoder dec)
    • CharsetDecoder: 原始数据的字符集编码格式;字符编码格式不同其所占字节不同,根据指定编码解析为原始字节流。
  • OutputStreamWriter(字符输出转换流:按照指定字符集编码解析输出)

打印流

直接输出什么就直接打印什么(高性能)
System.out.println() :就是打印流

PrintStream 字节

  PrintStream printStream=new PrintStream("f:"+ File.separator+"aa.txt");
        printStream.println(97);
        printStream.println(‘a’);
        printStream.println("阿萨");

PrintWriter 字符

数据流

将数据和其数据类型一起输入输出

DataOutputStream 输出

    try(  DataOutputStream dataOutputStream=new DataOutputStream(new FileOutputStream("f:"+ File.separator+"date.txt"))) {
            dataOutputStream.writeInt(1);
            dataOutputStream.writeDouble(2.2);
            dataOutputStream.writeUTF("测试");
        }catch (Exception e){

        }

在这里插入图片描述

DataInputStream 输入

try(  DataInputStream dataInputStream=new DataInputStream(new FileInputStream("f:"+ File.separator+"date.txt"))) { 
            int i = dataInputStream.readInt();
         System.out.println(i);
         double v = dataInputStream.readDouble();
         System.out.println(v);
         String s = dataInputStream.readUTF();
         System.out.println(s);
         
        }catch (Exception e){

在这里插入图片描述

序列化流

序列化:把java对象导入到文件中去
反序列化:将文件中的java对象读出来

  • ObjectOutputStream:序列化的类必须实现Serializable(会标记此类特殊处理)
 try(  ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream("f:"+File.separator+"object.txt"))) {
            Emp emp=new Emp();
            emp.setEmpno(111);
            emp.setEname("xusx");
            emp.setJob("coder");
            objectOutputStream.writeObject(emp);
        }catch (Exception e){

        }

transient :标识此成员变量不参与序列化

    private transient String ename;
  • ObjectInputStream
try(ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream("f:"+File.separator+"object.txt"))) {
            Emp emp = (Emp) objectInputStream.readObject();
            System.out.println(emp);
        }catch (Exception e){

        }

多个对象如何序列化
是用ArryList集合中放入对象,ArryList已实现Serializable

特殊文件

Properties(属性集合key=value)

读取

 Properties properties=new Properties();
properties.load(new FileReader("a.properties"));
String name = properties.getProperty("name");

写入

将整个Properties 中key-value 全部重新写入文件

   Properties properties=new Properties();
   properties.setProperty("name","xusx");
   properties.store(new FileWriter("a.properties"),null);

XML 扩展标记语言

一种数据格式来存储复杂的数据格式和数据关系
jar:dom4j解析xml

读取

SAXReader saxReader=new SAXReader();
        Document document = saxReader.read("users.xml");
        Element rootElement = document.getRootElement();
        List<Element> elements = rootElement.elements();
        for (Element element:elements){
            Element name = element.element("name");
            System.out.println(name.getText());
            Attribute id = element.attribute("id");
            String value = id.getValue();
            System.out.println(value);
            System.out.println(element.getName());
        }

方法

  • public String getName()
  • public List elements()
  • public List elements(String name)
  • public Element element(String name)
  • public String attributterValue(String name)
  • public String elementText(子元素名)
  • public String getText()

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

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

相关文章

python: excel假期时间提取统计

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2023/9/3 7:04 # User : geovindu # Product : PyCharm # Proje…

Java从Tif中抽取最大的那张图进行裁剪成x*y份

之前我有一篇帖子《kfb格式文件转jpg格式》讲述到 kfb > tif > jpg&#xff0c;但是针对于超大tif中的大图是无法顺利提取的&#xff0c;就算是能顺利提取&#xff0c;试想一下&#xff0c;2G的tif文件&#xff0c;如果能提取处理最大的那张图&#xff0c;并且在不压缩的…

Java代码审计16之fastjson反序列化漏洞(1)

文章目录 1、简介fastjson2、fastjson的使用2.1、将类序列化为字符串2.2、将字符串还原为对象2.3、小结以上2.4、稍微扩展思路 3、fastjson漏洞利⽤原理与dnslog4、JdbcRowSetImpl利用链4.1、JdbcRowSetImpl的基本知识4.2、利用代码复现4.3、生成poc4.4、模拟真实场景4.5、利用…

03目标检测-传统方法与深度学习算法对比

目录 一、目标学习的检测方法变迁及对比 二、深度学习目标检测算法基本流程 三、传统目标检测算法VS深度学习目标检测算法 一、目标学习的检测方法变迁及对比 “目标检测“是当前计算机视觉和机器学习领域的研究热点。从Viola-Jones Detector、DPM等冷兵器时代的智…

jq弹窗拖动改变宽高

预览效果 <div classtishiMask><div class"tishiEm"><div id"coor"></div><div class"topNew ismove"><span class"ismove">提示</span><p onclick"closeTishi()"></p&…

Postman使用_什么是Postman

Postman 是一个用于构建和使用 API 的 API 平台&#xff0c;Postman 简化了 API 生命周期的每个步骤并简化了协作&#xff0c;可以更快地创建更好的 API。 Postman 包含一个基于Node.js的强大的运行时&#xff0c;允许您向请求&#xff08;request&#xff09;和分组&#xff…

Nginx 文件解析漏洞复现

一、漏洞说明 Nginx文件解析漏洞算是一个比较经典的漏洞&#xff0c;接下来我们就通过如下步骤进行漏洞复现&#xff0c;以及进行漏洞的修复。 版本条件&#xff1a;IIS 7.0/IIS 7.5/ Nginx <8.03 二、搭建环境 cd /vulhub/nginx/nginx_parsing_vulnerability docker-compos…

爬虫逆向实战(32)-某号店登录(RSA、补环境、混淆)

一、数据接口分析 主页地址&#xff1a;某号店 1、抓包 通过抓包可以发现登录接口是/publicPassport/login.do 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有三个加密参数&#xff1a;username、password、captchaTok…

day16-面向对象综合练习(上)

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位同学大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

猫头虎博主第四期赠书活动:《精通Go语言:(第2版) 》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

神经网络-pytorch版本

pytorch神经网络基础 torch简介 torch和numpy import torch import numpy as np np_datanp.arange(6).reshape((2,3)) torch_datatorch.from_numpy(np_data) tensor2arraytorch_data.numpy() print(np_data,"\n",torch_data,"\n",tensor2array)torch的数…

【循环冗余码检错示例】

接收方怎么看有错没有 余数为0就是无错&#xff01;

竞赛选题 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…

C++下标运算符详解

C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下: 返回值类型 & operator[ ] (参数); const 返回值类型 & operator[ ] (参数) const; 使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只…

点灯科技实现 “ESP8266-01/01s + 继电器” 远程开关

教程视频 ESP-01S继电器插座怎么使用&#xff1f; 所需硬件 继电器 ESP-01S继电器插座 WIFI模块 esp8266-01s wifi模块 烧录器 软件准备 Arduino IDE需安装好esp8266扩展 点击下载 下载并安装blinker APP Android下载&#xff1a; 点击下载 或 在android应用商店…

构建健壮的Spring MVC应用:JSON响应与异常处理

目录 1. 引言 2. JSON 1. 轻量级和可读性 2. 易于编写和解析 3. 自描述性 4. 支持多种数据类型 5. 平台无关性 6. 易于集成 7. 社区支持和标准化 3. 高效处理异常 综合案例 异常处理方式一 异常处理方式二 异常处理方式三 1. 引言 探讨Spring MVC中关键的JSON数据…

day18-API(常见API,对象克隆)

课程目标 能够熟练使用Math类中的常见方法 能够熟练使用System类中的常见方法 能够理解Object类的常见方法作用 能够熟练使用Objects类的常见方法 能够熟练使用BigInteger类的常见方法 能够熟练使用BigDecimal类的常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容…

nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(三)

因为这个版本的若依plus不支持本地文件上传&#xff0c;所以需要增加这些本地上传文件的后端代码 和前端代码修改。 1、后端部分 先配置跳过测试吧&#xff0c;平时编译也不需要这个 <!--添加配置跳过测试--><plugin><groupId>org.apache.maven.plugins<…

LVS负载均衡群集——LVS-NAT模式搭建和LVS-DR模式搭建

目录 lvs工作模式 1、NAT模式&#xff08;VS-NAT&#xff09; 2、直接路由模式&#xff08;VS-DR&#xff09; 3、IP隧道模式&#xff08;VS-TUN&#xff09; LVS调度算法 LVS群集类型 1&#xff09;负载均衡群集 LB 2&#xff09;高可用群集 HA 3&#xff09;高性能运…

分享篇:Canvas绘制简单图像

目录 Canvas绘制简单图形需要用到的基本知识&#xff1a; 1.moveTo() 2. lineTo() 3.stroke() 4.strokeStyle/lineWidth 5.beginPath() 6.closePath() 7.arc&#xff08;&#xff09; 8.createLinearGradient&#xff08;&#xff09; 9.createRadialGradient&#xf…