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 property
            int 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_VALUE
                    h = 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 String
    implements 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 StringBuffer
    extends AbstractStringBuilder
    implements 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);
    }

    @Override
    public 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>() {
    @Override
    public 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>() {
    @Override
    public 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;
    }
 
    @Override
    public String toString() {
        return "[" + name + "," + age + "]";
    }
 
    @Override
    public 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 =

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

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

相关文章

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…

腾讯云coding代码托管平台配置问题公钥拉取失败提示 Permission denied(publickey)

前言 最近在学校有个课设多人开发一个游戏&#xff0c;要团队协作&#xff0c;选用了腾讯云的coding作为代码管理仓库&#xff0c;但在配置的时候遇到了一些问题&#xff0c;相比于github&#xff0c;发现腾讯的coding更难用&#xff0c;&#xff0c;&#xff0c;这里记录一下…

【进程替换】进程程序替换函数execl | 单进程程序替换原理

目录 直接看现象&#xff08;单进程&#xff09; 单进程程序替换原理 替换函数 直接看现象&#xff08;单进程&#xff09; 我们先使用execl来直接看现象man 3 execlexecute a file执行一个程序int execl(const char *path, const char *arg, ...);execl函数的返回值&#x…

使用GitLab自带的CI/CD功能在K8S集群里部署项目(四)

前置内容&#xff1a; 通过Docker Compose部署GitLab和GitLab Runner&#xff08;一&#xff09; 使用GitLab自带的CI/CD功能在本地部署项目&#xff08;二&#xff09; 使用GitLab自带的CI/CD功能在远程服务器部署项目&#xff08;三&#xff09; 一、K8S集群信息 节点名称…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…

马斯克:脑机接口迎来首例植入者,芯片接线发生故障。

马斯克旗下的脑机接口公司Neuralink近日传出关于首例植入者诺兰阿博脑机接口芯片故障的消息。根据Neuralink发布的文章&#xff0c;诺兰阿博的脑机设备发生了故障&#xff0c;多根植入他大脑的接线已经脱落&#xff0c;导致获取数据量减少。目前该公司正在研究导致接线脱落的原…

Java进阶08 集合(续)Stream流

Java进阶08 集合&#xff08;续&#xff09;&Stream流 一、HashSet集合类&#xff08;续&#xff09; 1、JDK7(-)HashSet原理解析 1.1 底层结构 数组链表 1.2 执行过程 ①创建一个默认长度为16的数组&#xff0c;数组名为table ②根据元素的哈希值跟数组的长度求余计…

灰狼优化算法(Grey Wolf Optimizer)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法引言 灰狼算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种受自然界灰狼行为启发的优化算法。它模拟了灰狼的社会层次和狩猎策…

JS实现初始化、动态点击切换激活样式

食用须知&#xff0c;不懂得把代码交给AI解释一下&#xff0c;明白流程就会用了&#xff0c;本文只有js与html&#xff0c;样式代码一概没有&#xff1a; 效果展示 1、点击显示的盒子代码 <div data-v-e1dd37c4"" class"news-container main-width-contain…

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

通义千问2.5中文能力地表最强

随着人工智能技术的不断进步&#xff0c;智能问答系统已成为人们日常生活中不可或缺的一部分。阿里巴巴集团作为全球领先的科技公司&#xff0c;一直致力于AI领域的研发和创新。最近&#xff0c;阿里巴巴发布了其最新的智能问答系统——通义千问2.5。 通义千问2.5在AI问答领域…

抖音新店怎么对接达人?对接达人秘籍流程分享,让你学会找达人

大家好&#xff0c;我是电商花花。 新手怎么对接达人带货&#xff1f;这是我们新手商家 要考虑的问题。 很多新手抱怨自己新店铺不出单&#xff0c;没有销量&#xff0c;对接达人又怕达人看不上&#xff0c;没有达人愿意帮我带货&#xff0c;在面临这样的情况下不知道该怎么办…

基于自我对弈框架的偏好优化算法SPPO

传统的从人类反馈中进行强化学习&#xff08;RLHF&#xff09;的方法仰赖如Bradley-Terry模型等参数模型,但这样的模型难以充分捕捉人类偏好中的非递移性和非理性。最新的研究进展显示,直接使用偏好机率可以更准确地反映人类偏好,从而实现更灵活、更精确的语言模型对齐。本文提…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

Go语言系统学习笔记(一):基础篇

1. 写在前面 公司的新业务开发需要用到go语言&#xff0c;虽然之前没接触过这门语言&#xff0c;但在大模型的帮助下&#xff0c;边看项目边写代码也能进行go的项目开发&#xff0c;不过&#xff0c;写了一段时间代码之后&#xff0c;总感觉对go语言本身&#xff0c;我的知识体…

Python尝试安装 pyaudio 时遇到的错误信息表示安装过程失败,原因是找不到 Python.h 头文件

环境&#xff1a; Python 3.8.10 WSL2 问题描述&#xff1a; 尝试安装 pyaudio 时遇到的错误信息表示安装过程失败&#xff0c;原因是找不到 Python.h 头文件 error: subprocess-exited-with-error Building wheel for pyaudio (pyproject.toml) did not run successfully…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

Ubuntu 安装 samba 实现文件共享

1. samba的安装: sudo apt-get install samba sudo apt-get install smbfs2. 创建共享目录 mkdir /home/share sudo chmod -R 777 /home/share3. 创建Samba配置文件: 3.1 保存现有的配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak3.2 打开现有的文件 sudo…

基于小波交叉谱分析的地震波走时变化测量(MATLAB)

地震波在地球介质中传播&#xff0c;带来了丰富的地下介质物性的信息&#xff0c;为了解地球内部结构及运动变化提供了可能。地球内部地震波速度的差异是人们确定地球圈层结构和横向不均匀性的重要物理参数&#xff0c;地下介质应力的变化和积累是地震的孕育和发生的原因&#…