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 =

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

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

相关文章

从头理解transformer,注意力机制(上)

深入理解注意力机制和Transformer架构&#xff0c;及其在NLP和其他领域的突破。 要想理解transformer&#xff0c;先从编码器解码器结构开始理解 基于transformer发展起来的llm 右边&#xff1a;只有解码器&#xff0c;强项是生成内容 左边&#xff1a;只有编码器&#xff0…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

NSS刷题

1、[SWPUCTF 2021 新生赛]gift_f12 打开题目后查看源码无发现&#xff0c;用f12发现flag 2、[GDOUCTF 2023]hate eat snake 打开链接是一个贪吃蛇小游戏&#xff0c;f12找到js文件中有一个speed的语句&#xff0c;该语句的作用是使速度增加&#xff0c;因此&#xff0c;将该语…

Linux虚拟机运行“yum install gcc-c++”报错“Loading mirror speeds from cached hostfile”

目录 一、在Linux上安装Redis时&#xff0c;在终端执行命令“yum install gcc-c”时&#xff0c;报错&#xff1a; 二、然后发现linux的网络不通&#xff0c;什么网站都访问不了 三、连上网后&#xff0c;再变换yum源 四、重新运行yum install gcc 一、在Linux上安装Redis时…

分布式与一致性协议之MySQL XA协议

MySQL XA协议 概述 相信很多人都知道MySQL支持单机事务&#xff0c;那么在分布式系统中&#xff0c;涉及多个节点&#xff0c;MySQL又是怎样实现分布式事务的呢&#xff1f; 举个例子&#xff0c;一个业务系统需要接收来自外部的指令&#xff0c;然后访问多个内部其他系统来执…

机器学习算法应用——神经网络回归任务、神经网络分类任务

神经网络回归任务&#xff08;4-3&#xff09; 神经网络回归任务&#xff0c;通常指的是使用神经网络模型进行回归分析。回归分析是一种统计学方法&#xff0c;用于研究一个或多个自变量&#xff08;预测变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关…

【北京迅为】《iTOP-3588开发板从零搭建ubuntu环境手册》-第2章 获取并安装Ubuntu操作系统

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

使用2G内存求20亿个数字中出现次数最多的N个

又是一个TOP -N的题目 我看了一下CSDN上大多数人的回答和GPT说的差不多&#xff0c;都是说使用哈希之类的&#xff1b; 我今天说一下我的解法&#xff0c;首先说一下不太快的基础解法 20亿数字使用uint32需要80GB&#xff0c; &#xff08;1&#xff09;分为40块读取&#…

Apinto下载安装以及集群部署总结

下载 下载官方提供的安装包安装&#xff08;推荐&#xff09; wget https://github.com/eolinker/apinto/releases/download/v0.13.3/apinto_v0.13.3_linux_amd64.tar.gz && tar -zxvf apinto_v0.13.3_linux_amd64.tar.gz && cd apinto 安装 先确保已经入解…

3d如何同时贴两个图在模型上?---模大狮模型网

在3D设计中&#xff0c;为模型贴上纹理或图案是常见的操作&#xff0c;可以使模型更加逼真和生动。然而&#xff0c;有时候我们需要在同一个模型上同时贴上两个不同的图案&#xff0c;这可能会对初学者构成一定的挑战。在本文中&#xff0c;我们将分享一些简单而有效的方法&…

【数学】泰勒公式

目录 引言 一、泰勒公式 1.泰勒公式及推导 &#xff08;1&#xff09;推导 &#xff08;2&#xff09;公式 2.泰勒中值定理 &#xff08;1&#xff09;定理1&#xff08;佩亚诺余项&#xff09; &#xff08;2&#xff09;定理2&#xff08;拉格朗日余项&#xff09; …

【系统架构师】-选择题(十一)操作系统与嵌入式

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络&#xff08;名称随便一个&#xff09; 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关&#xff0c;等下要用&#xff1b; 5.打开虚拟机&#xff0c;右上角&#xff0c;下标点…

操作系统实战(三)(linux+C语言实现)

实验目的 加深对进程调度概念的理解&#xff0c;体验进程调度机制的功能&#xff0c;了解Linux系统中进程调度策略的使用方法。 练习进程调度算法的编程和调试技术。 实验说明 1.在linux系统中调度策略分为3种 SCHED_OTHER&#xff1a;默认的分时调度策略&#xff0c;值为0…

Keycloak实战+spring boot

标题 前言项目搭建前言 最近项目中使用keycloak,为了更好的上手,我先本地Windows搭建一套demo 项目搭建 我本地jdk版本号为: 通过网上查询一些资料查看,jdk1.8对应的keycloak版本为:15的版本,但是没有找到,我只能下载如下: 通过码云我找到了具体的版本号,开始下…

国内注册Claude 3流程

国内注册Claude 3流程 Claude 3是什么注册过程准备国外IP节点准备谷歌账号或者邮箱准备接码平台接码平台WildCard输入验证码继续注册 使用聊天功能识图功能文件解析编码能力 Cloud 3 已经推出两个月了&#xff0c;当时可是轰动一时&#xff0c;但是其并不对国内开放&#xff0c…

Go 语言并发编程初体验:简洁高效

文章目录 前言GoLang 并发编程基本概念进程与线程线程和协程并行与并发GoLang的协程机制 GoLang 并发实践案例需求传统方式实现使用 goroutines 实现并发goroutine 如何通信channel 使用注意事项 总结 前言 Go语言是谷歌推出的一种的编程语言&#xff0c;可以在不损失应用程序…

Java通过百度地图API获取定位-普通IP定位

项目中有一个登录邮箱提醒的功能&#xff0c;需要根据IP地址获取定位信息&#xff0c;从而更好地提示用户账号登录的所在地。为此&#xff0c;花费了一些时间来实现这个功能。 在CSDN搜索了一下&#xff0c;发现关于获取定位的文章说明都不够详细&#xff0c;于是决定自己创作一…

【C++ 内存管理】深拷贝和浅拷贝你了解吗?

文章目录 1.深拷贝2.浅拷贝3.深拷贝和浅拷贝 1.深拷贝 &#x1f34e; 深拷⻉: 是对对象的完全独⽴复制&#xff0c;包括对象内部动态分配的资源。在深拷⻉中&#xff0c;不仅复制对象的值&#xff0c;还会复制对象所指向的堆上的数据。 特点&#xff1a; &#x1f427;① 复制对…

1.理解机器学习

本文参考于&#xff1a;https://hands1ml.apachecn.org/1/ 大多数人听到“机器学习”&#xff0c;往往会在脑海中勾勒出一个机器人&#xff1a;一个可靠的管家&#xff0c;或是一个可怕的终结者&#xff0c;这取决于你问的是谁。但是机器学习并不是未来的幻想&#xff0c;它已经…