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

java技术总结

1.java基本数据类型?

byte 1,short 2 ,int 4,long 8 ,float 4,double 8,boolean 1,char 2

2.java为什么要有包装类型?

前 6 个类派生于公共的超类 Number,而 Character 和 Boolean 是 Object 的直接子类。

被 final 修饰, Java 内置的包装类是无法被继承的。

包装类作用 

  • 对象化 - 将基本数据类型用对象封装起来,实现一些特色的方法。
  • 数据类型转换 - 通过包装类可以实现数据类型转换 
  • null值校验 - 例如如果基本数据类型没值的话,默认会给值,需要与数据库一致

装箱拆箱

  • 装箱:将基本数据类型转换成包装类
  • 拆箱:从包装类之中取出被包装的基本类型数据(使用包装类的 xxxValue 方法)

JDK 1.5 之后,Java 提供了自动装箱与自动拆箱的机制 , 主要依赖于valueOf和parseXXX方法实现。自动装箱和拆箱通常是由编译器在需要时自动进行的。

Integer obj = 10;  	// 自动装箱. 基本数据类型 int -> 包装类 Integer
int temp = obj;  	// 自动拆箱. Integer -> int
obj ++; // 直接利用包装类的对象进行数学计算
System.out.println(temp * obj); 

注意 - IntegerCache 内部类

Integer中有这个int缓存,当范围在-128 到 127之间,如果已经存在该对象,则之间复用,不新创建包装类。

 private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

Java自动装箱和自动拆箱_java自动拆箱和自动装箱-CSDN博客

浅析Java中为什么要设计包装类_java_脚本之家

3.string,stringbuilder,string buffer区别?

  • string被final修饰,不可变字符串。
  • stringbuilder可变字符串容器对象,线程不安全,效率比string高些
  • stringbuffer可变字符串,线程安全,效率低。

String

 1.8部分源码,类和变量value数组都是由final修饰,不可变。

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];****
}

StringBuilder

从以下部分源码可看出构造器调用父类方法进行扩容,说明操作的字符串在父类。然后继承的又只有一个,那就是AbstractStringBuilder类,线程不安全。

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{/** use serialVersionUID for interoperability */static final long serialVersionUID = 4383685877147921099L;/*** Constructs a string builder with no characters in it and an* initial capacity of 16 characters.*/public StringBuilder() {super(16);}
**************************
}

 然后发现这里操作的字符串没有用final修饰,那就是可变的。

abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** The value is used for character storage.*/char[] value;/*** The count is the number of characters used.*/int count;
****************************************************
}

StringBuffer 

 可以看到,他们所继承的类都一样,不一样的是stringbuffer它重写了继承的方法,并且加上了synchronized关键字,所以线程安全。

public final class StringBufferextends AbstractStringBuilderimplements java.io.Serializable, CharSequence
{private transient char[] toStringCache;/** use serialVersionUID from JDK 1.0.2 for interoperability */static final long serialVersionUID = 3388685877147921107L;public StringBuffer() {super(16);}public StringBuffer(int capacity) {super(capacity);}public StringBuffer(String str) {super(str.length() + 16);append(str);}public StringBuffer(CharSequence seq) {this(seq.length() + 16);append(seq);}@Overridepublic synchronized int length() {return count;}*******************************
}

String、StringBuilder、StringBuffer、StringJoiner类的常用方法,以及区别_stringjoiner fangfa-CSDN博客

4.如何理解面向对象和面向过程?

面向过程就是以函数为主体,通过函数间互相调用实现目的,强调过程。

而面向过程就是将进行的操作封装到一个类中,通过类与类之间的调用实现目的。

5.面向对象的三大特性?

  • 抽象,比如讲动物的名字封装成类变量,行为封装成动物方法。
  • 封装,将变量和方法封装到对象中。
  • 继承,类通过继承可以实现父类的方法,并使用。
  • 多态,多个类可以继承一个父类,通过重写方法,实现不同的行为。

6.为什么浮点数不能表示金额?

因为浮点数会丢失精度,而且存储效率不如整型,所以一般正常生产中用bigint,且bigint计算高效。

7.什么是反射,为什么需要反射?*

反射是java作为动态语言的重要标志,通过反射,可以动态修改类的状态,内容。

创建反射的几种方式

Class<?> class=MyClass.class;MyClass myClass=new MyClass();
Class<?> class=myClass.getClass();Class<?> class=Class.forName("com.yy.xxx");

利用反射对象操作类

 调用构造参数创建类对象,简单写一下吧,如果有需要去下面的博客里看看。

User user = userClass.newInstance();
System.out.println(user);
Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();
for (Constructor c:declaredConstructors) {System.out.println(c.getParameterTypes());
}
Method[] methods = userClass.getMethods();
for (Method m:methods) {System.out.println(m);
}
Field[] declaredFields = userClass.getDeclaredFields();
for (Field f:declaredFields) {System.out.println(f.getName());
}

java 反射操作详解_java反射修改方法-CSDN博客

Java 中反射的概念、作用和特点,在什么情况下使用反射及使用实例_java反射的作用及应用场景-CSDN博客

8.为什么需要克隆?如何实现克隆??深拷贝和浅拷贝的区别?

因为经常我们业务上需要复制一份数据。

浅拷贝就是只复制表层对象,并不复制对象内部的对象.

深拷贝是对象及其对象内部对象都复制成新的对象.

他们都可以通过类实现cloneable接口重写clone方法

 详情参考

Java深入理解深拷贝和浅拷贝区别_java深拷贝浅拷贝-CSDN博客

9.try-catch-finally 如果catch return了,那么还会执行finally嘛

会在return前执行finally。

10.String为什么被设计成不可变的?

  • 字符串复用
  • 线程安全
  • hashcode 因为不可变,所以hashcode不用重新计算,并且很适合做key

string被final修饰,不可变。这样的好处可以实现字符串复用和线程安全。

当我们改变一个字符串值的时候,他是去创建一个新的字符串,然后把指针更改到新的位置。

Java 中 String 类为什么要设计成不可变的?-腾讯云开发者社区-腾讯云

11.error与exception的区别?以及常见的runtime exception?*

error是一些不可避免的错误,一般不是由于代码错误。

而exception分为运行时异常和编译时异常。

编译时异常try catch。

而运行时异常需要检查代码,比如空指针等等。

java之异常(Exception)与错误(Error)的区别_java中error和exception的区别-CSDN博客

12.抽象类和接口的区别?**

  • 接口是定义一种规范,抽象类是定义一个模板。
  • 接口没有构造方法。抽象类有构造方法。
  • 接口成员变量默认由public static final修饰,必须赋初值,方法由public abstract修饰。抽象类成员变量么有限制,可以有构造方法,抽象方法或具体方法。
  • 接口多实现,抽象类单继承。

抽象类和接口的区别(通俗易理解)-CSDN博客

13.==与equals区别?

在判断字符串时,==会判断内容和地址,而equals只判断内容,因为string重写了equals方法。

14.super和this区别?*

super调用父类方法,this调用子类的方法。

15.java集合类,特点?

  • arraylist 基于数组实现,查找快,增删慢,线程不安全,默认长度为10,1.5倍扩容。
  • linkedlist基于链表实现,查找慢,增删快。线程不安全。
  • vector基于数组实现,线程安全,默认长度为10,2倍扩容。
  • hashmap线程不安全,键值对,两倍扩容。底层使用了数组加链表加红黑树。
  • concurrenthashmap线程安全。底层采用无冲突时采用乐观锁cas资源重试。冲突时采用synchronize锁代码块。需再看源码。

16.集合排序方案实现?***

Arrays类可以对数组排序

int[] arr = {1, 5, 2, 1, 4};
System.out.println("排序前:"+Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));

Collections可以对list排序

List<String> list = new ArrayList<>();
list.add("b");
list.add("d");
list.add("ca");
list.add("da");
System.out.println("排序前:"+list);
Collections.sort(list);
System.out.println("排序后:"+list);List<Person> list = new ArrayList<>();
list.add(new Person("李四1", 19));
list.add(new Person("张三1", 59));
list.add(new Person("张三2", 69));
list.add(new Person("张三3", 79));
list.add(new Person("张三4", 89));
System.out.println("按名字排序前:" + list);
Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {//按名字排序return o1.getName().compareTo(o2.getName());}
});
System.out.println("按名字排序后:" + list);System.out.println("按年龄排序前:" + list);
Collections.sort(list, new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();}
});
System.out.println("按年龄排序后:" + list);

实现comparable接口,重写compareTo方法

static class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "[" + name + "," + age + "]";}@Overridepublic int compareTo(Person o) {return Integer.compare(this.getAge(), o.getAge());}
}
list.sort((o1, o2) -> o1.compareTo(o2));

参考

一篇文章搞定Java中常用集合的排序方法_java 集合排序-CSDN博客

Java 中如何对集合进行排序_java集合排序-CSDN博客

17.arraylist,linkedlist,vector区别?*

  • arraylist 基于数组实现,查找快,增删慢,线程不安全,默认长度为10,1.5倍扩容。
  • linkedlist基于链表实现,查找慢,增删快。线程不安全。
  • vector基于数组实现,线程安全,默认长度为10,2倍扩容。

ArrayList(1.8)

初始化

    //默认容量
    private static final int DEFAULT_CAPACITY = 10;
    //用于空实例的共享空数组实例。
    private static final Object[] EMPTY_ELEMENTDATA = {};
    //用于默认大小空实例的共享空数组实例。我们区分它和EMPTY_ELEMENTDATA,  
    //以便在添加第一个元素时知道要扩展多少。
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    //用于存储ArrayList元素的数组缓冲区。  
    //ArrayList的容量是这个数组缓冲区的长度。任何  
    //elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList  
    //在添加第一个元素时,都会扩展到DEFAULT_CAPACITY。  
    transient Object[] elementData; 
    //数组长度
    private int size;

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{public ArrayList(int initialCapacity) {if (initialCapacity > 0) {//初始化容量this.elementData =

相关文章:

java技术总结

1.java基本数据类型? byte 1,short 2 ,int 4,long 8 ,float 4,double 8,boolean 1,char 2 2.java为什么要有包装类型? 前 6 个类派生于公共的超类 Number,而 Character 和 Boolean 是 Object 的直接子类。 被 final 修饰, Java 内置的包装类是无法被继承的。 包装…...

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时&#xff0c;避免窗体闪烁的方法&#xff1a; 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先&#xff0c;右键项目&#xff0c;添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…...

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…...

powershell@管道符过滤的顺序问题@powershell管道符如何工作

文章目录 select 和 where谁先执行powershell管道符stop-service 为例查看文档中的典型参数介绍stop-process为例介绍管道符传参是怎么工作的Id参数InputObject 参数Name参数额外的试验反面例子应用:get-process 和stop-process配合 select 和 where谁先执行 在执行筛选时&…...

SMI接口

目录 SMI 接口帧格式读时序写时序 IP 设计IP 例化界面IP 接口IP 验证 SMI 接口 SMI&#xff08;Serial Management Interface&#xff09;串行管理接口&#xff0c;也被称作 MII 管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括 MDC 和 MDIO 两条信…...

【C++】转换构造函数和类型转换函数

目录 转换构造函数转换构造函数调用 类型转换函数类型转换函数定义形式应用 转换构造函数 转换构造函数就是一种构造函数&#xff0c;将一个其他类型的数据转换成一个类的对象的构造函数。 类型->类对象 转换构造函数调用 &#xff08;1&#xff09;显式强制类型转换&…...

全栈开发之路——前端篇(5)组件间通讯和接口等知识补充

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 辅助文档&…...

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器&#xff08;signal、setitimer&#xff09;&#xff0c;软件PWM驱动舵机&#xff08;SG90&#xff09; signalsetitimer示例 软件PWM驱动舵机&#xff08;SG90&#xff09; signal 详情请看Linux 3.进程间通信&#xff08;shmget shmat shmdt shmctl 共享内存、si…...

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec&#xff1a; kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 通过一个 deployment来 演示 apiVersion: apps/v1 kind: Deployment metadata:name: deploylabels: app: deploy spec: replicas: 1selector: matchLabels:app: deploy-podt…...

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…...

电商大数据的采集||电商大数据关键技术【基于Python】

.电商大数据采集API 什么是大数据&#xff1f; 1.大数据的概念 大数据即字面意思&#xff0c;大量数据。那么这个数据量大到多少才算大数据喃&#xff1f;通常&#xff0c;当数据量达到TB乃至PB级别时&#xff0c;传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…...

H264 SP帧等知识笔记

H.264是一种广泛使用的视频编码标准&#xff0c;它使用多种类型的帧来实现高效的视频压缩。在H.264中&#xff0c;参考帧和重建帧是两个重要的概念&#xff0c;它们之间既有区别又有联系。 参考帧&#xff1a; 参考帧是用于预测其他帧的帧。在H.264中&#xff0c;编码器会利用…...

流量印钞机:每日稳定收入1500+

标题&#xff1a;“流量印钞机&#xff1a;每日稳定收入1500” 随着互联网的迅速发展&#xff0c;越来越多的人开始利用网络平台来赚取稳定的收入。在这个信息爆炸的时代&#xff0c;拥有了一定的流量就意味着拥有了一台“印钞机”&#xff0c;可以每日稳定地创造超过1500元的…...

Tomcat中服务启动失败,如何查看启动失败日志?

1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误&#xff1a; sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期&#xff0c;或选择最近的日志文件日…...

React19学习-初体验

升级react19版本 安装 npm install reactbeta react-dombeta如果使用ts则需要在package.json中添加。等正式版发布直接可以使用types/react了 "overrides": {"types/react": "npm:types-reactbeta","types/react-dom": "npm:ty…...

【UE5】数字人基础

这里主要记录一下自己在实现数字人得过程中涉及导XSens惯性动捕&#xff0c;视频动捕&#xff0c;LiveLinkFace表捕&#xff0c;GRoom物理头发等。 一、导入骨骼网格体 骨骼网格体即模型要在模型雕刻阶段就要雕刻好表捕所需的表情体(blendshape)&#xff0c;后面表捕的效果直…...

OSTEP Projects:KV

本文将介绍操作系统导论&#xff08;Operating Systems: Three Easy Pieces&#xff09;作者所开源的操作系统相关课程项目 的 KV 部分&#xff0c;包含个人的代码实现和设计思路。 思路 题目要求实现一个最简单的数据库&#xff0c;以支持数据的持久化。 每个操作由格式为 o…...

JAVA学习笔记(第三周)

文章目录 继承概述使用场景继承的特点子类继承的内容成员变量访问特点成员方法访问特点方法的重写构造方法this super 多态多态的表现形式多态的前提成员变量和方法调用instanceof优势弊端 包包名的规则全类名final常量 权限修饰符代码块 继承 概述 继承就是子类继承父类的特征…...

linux 内核驱动 -- reboot -f 导致内核死机 而 reboot则不会引起问题

问题描述&#xff0c;定于与解决&#xff1a;...

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…...

MySQL慢查询SQL优化

一、慢查询日志 描述&#xff1a;通过慢查询日志等定位那些执行效率较低的SQL语句 查看 # 慢查询是否开启 show variables like slow_query_log%; # 慢查询超时时间 show variables like long_query_time%;执行SQL 开启慢查询日志 set global slow_query_log ON;设置慢查…...

【嵌入式DIY实例】-DDS信号生成器

DDS信号生成器 文章目录 DDS信号生成器1、AD9805介绍2、硬件准备与接线3、代码实现在本文中,将详细介绍如何使用AD9850来搭建一个简易的DDS(Direct Digital signal )信号生成器。 1、AD9805介绍 AD9850是一款高度集成的器件,采用先进的DDS技术,内置一个高速、高性能数模转…...

java设计模式四 桥接模式

桥接模式关注于将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。它通过在抽象和实现之间建立一个桥梁来实现这一目的。这种设计模式属于结构型模式。 假设我们要设计一个图形编辑器&#xff0c;其中图形&#xff08;如圆形、正方形&#xff09;可以有不同的颜色填充…...

《Python编程从入门到实践》day24

# 昨日知识点学习 创建外星人从一个到一行 # 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien Alien(self)alien_width alien.rect.widthavailable_sp…...

【hackmyvm】 Animetronic靶机

靶机测试 arp-scanporturl枚举exiftool套中套passwordsudo 提权 arp-scan arp-scan 检测局域网中活动的主机 192.168.9.203 靶机IP地址port 通过nmap扫描&#xff0c;获取目标主机的端口信息 ┌──(root㉿kali)-[/usr/share/seclists] └─# nmap -sT -sV -O 192.16…...

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…...

RS2255XN功能和参数介绍及PDF资料

RS2255XN是一款由Runic&#xff08;润石&#xff09;公司生产的模拟开关。以下是关于RS2255XN的一些技术参数和特点&#xff1a; 封装&#xff1a;MSOP-10 电源电压范围&#xff1a;2.5V至5.5V 工作温度范围&#xff1a;-40C至125C 类型&#xff1a;模拟开关 品牌&#xff1a;R…...

设计模式——外观模式(Facade)

外观模式&#xff08;Facade Pattern&#xff09; 是一种结构型设计模式&#xff0c;它为一个子系统中的一组接口提供一个统一的高层接口&#xff0c;使得子系统更加容易使用。这种类型的设计模式属于结构型模式&#xff0c;它向客户端提供了一个接口&#xff0c;隐藏了子系统的…...

【linux软件基础知识】Linux 中的普通进程的调度机制

活动集Active processes和过期集Expired processes 为了实现静态优先级较低的进程没有完全锁定并有机会运行,Linux 调度程序维护两个不相交的可运行进程集:活动集和过期集。 此机制是完全公平调度程序 (CFS) 算法的一部分。 以下是这两组的工作原理: 活动集Active proces…...

keil5软件安装教程(MDKv5.39)

keil5软件安装分为三部分&#xff1a; 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码&#xff1a;gt3s 1、下载keil5的压缩包并解压&#xff0c;鼠…...