java String(一)—— Java中的String类型

2023-11-16

一、需要理解的代码:

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;

class Test{
	public static String appendStr(String s) {
		s+="bbb";
		return s;
	}
	public static StringBuilder appendSb(StringBuilder sb) {
		
		return sb.append("bbb");
	}
	
	public static void main(String[] args) {
		String s = new String("aaa");
		String ns = Test.appendStr(s);
		System.out.println(s);  //aaa
		System.out.println(ns);  //aaabbb
		
		StringBuilder sb = new StringBuilder("ccc");
		StringBuilder nsb = Test.appendSb(sb);
		System.out.println(sb);  //cccbbb
		System.out.println(nsb);    //cccbbb
	}
}

//public class Test {
//    public static void main(String[] args) {
//        String s1 = "hello";
//        String s2 = "world";
//        change(s1,s2);
//        System.out.println("111:::" + s1+"  "+s2);//hello---world
//        
//        
//        String s3 = new String("hello");
//        String s4 = new String("world");
//        change(s3,s4);
//        System.out.println("222:::" + s3+"  "+s4);//hello--world
//        
//        
//        StringBuilder sb1 = new StringBuilder("hello");
//        StringBuilder sb2 =new StringBuilder("world");
//        change(sb1,sb2);
//        System.out.println("333:::" + sb1+"  "+sb2); //hello--worldworldhuan
//    }
//
//    private static void change(String s1, String s2) {
//        s1=s2;
//        s1=s1+s2;
//        System.out.println("444:::" + s1+"  "+s2);  
//    }
//    private static void change(StringBuilder sb1, StringBuilder sb2) {
//        sb1=sb2;
//        sb1=sb1.append(sb2).append("huan");
//        System.out.println("555:::" + sb1+"  "+sb2);
//        
//    }
//}

444:::hello world
111:::hello world
444:::helloworld world
111:::hello world

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

StringBuilder改变常量池中的内容了吗?

答:没有,参考 https://blog.csdn.net/aaqian1/article/details/113766231
常量池:

在堆中分配出来的一块存储区域,用于存储显式的String、float 或者 Integer。例如 String str = “abc”,"abc"这个字面量是显式声明,所以存储在常量池。

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

堆区:

1、存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)
2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

1、每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2、每个栈中的数据(原始类型和对象引用)都是私有的,其它栈不能访问
3、栈分为三个部分:
图1:
在这里插入图片描述
图2:
在这里插入图片描述
图3:JVM中堆、栈、方法区、字符串常量池的关系
在这里插入图片描述
在图3中,在栈中

1、String类是通过char数组来保存字符串的。

String str = "hahaha";

对应源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
	 private final char value[];
	 ··· ···
}

2 构造函数

String str = new String("abc");

1)先创建一个空的String对象
2)常量池中创建一个abc,并赋值给第二个String
3) 将第二个String的引用传递给第一个String
注意:如果常量池中有abc,则不用创建,直接把引用传递给第一个String

对应源码:

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

2、String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响原对象,相关的任何change操作都会生成新的对象。

二、字符串常量池

JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池

每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串。

Java中的常量池,实际上分为两种形态:静态常量池运行时常量池。

  • 静态常量池:*.class文件中的常量池,class文件中的不仅仅包含字符串字面量,还包含类、方法的信息,占用class文件绝大部分空间。
  • 运行时常量池:jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池
String a = "chenssy";
String b = "chenssy";

a、b都指向JVM字符串常量池中的“chenssy”,它们指向同一个对象

String c = new String("chenssy");

new关键字产生的对象是存储在堆中的,所以上面应该产生了两个对象:保存在栈中的 c 和保存在堆中的 chenssy 。但是在Java中根本就不存在两个完全一模一样的字符串对象,所以堆中的 chenssy ,应该是引用字符串常量池中的 chenssy 。所以栈中的变量c、堆中的变量 chenssy 、JVM字符串常量池中的 chenssy 的关系如下:
在这里插入图片描述

总结:

String c = new String(“chenssy”); 虽然 c 的内容是创建在堆中的,但是它的内部 value 还是指向JVM常量池中的 chenssy 的value。

例1:

/**
 * 采用字面值的方式赋值
 */
public void test1(){
    String str1="aaa";
    String str2="aaa";
    System.out.println("===========test1============");
    System.out.println(str1==str2);//true 可以看出str1跟str2是指向同一个对象 
}

结果为:true
分析:
当执行String str1="aaa"时,JVM首先会去字符串池中查找是否存在"aaa"这个对象,如果不存在,则在字符串池中创建"aaa"这个对象,然后将池中"aaa"这个对象的引用地址返回给字符串常量str1,这样str1会指向池中"aaa"这个字符串对象;如果存在,则不创建任何对象,直接将池中"aaa"这个对象的地址返回,赋给字符串常量。当创建字符串对象str2时,字符串池中已经存在"aaa"这个对象,直接把对象"aaa"的引用地址返回给str2,这样str2指向了池中"aaa"这个对象,也就是说str1和str2指向了同一个对象,因此语句System.out.println(str1 == str2)输出:true。

例2:

/**
 * 采用new关键字新建一个字符串对象
 */
public void test2(){
    String str3=new String("aaa");
    String str4=new String("aaa");
    System.out.println("===========test2============");
    System.out.println(str3==str4);//false 可以看出用new的方式是生成不同的对象 
}

结果为:false
分析:
采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"aaa"这个字符串对象,如果有,则不在池中再去创建"aaa"这个对象了,直接在堆中创建一个"aaa"字符串对象,然后将堆中的这个"aaa"对象的地址返回赋给引用str3,这样,str3就指向了堆中创建的这个"aaa"字符串对象;如果没有,则首先在字符串池中创建一个"aaa"字符串对象,然后再在堆中创建一个"aaa"字符串对象,然后将堆中这个"aaa"字符串对象的地址返回赋给str3引用,这样,str3指向了堆中创建的这个"aaa"字符串对象。当执行String str4=new String(“aaa”)时, 因为采用new关键字创建对象时,每次new出来的都是一个新的对象,也即是说引用str3和str4指向的是两个不同的对象,因此语句System.out.println(str3 == str4)输出:false。

例3:

public void test5(){
    String str1="abc";   
    String str2="def";   
    String str3=str1+str2;
    System.out.println("===========test5============");
    System.out.println(str3=="abcdef"); //false
}

结果为:false
分析:
因为str3指向堆中的 “abcdef” 对象,而 “abcdef” 是字符串池中的对象,所以结果为fasle。

这段代码总共创建了5个对象,字符串池中2个、堆中3个(abc、def、adbdef)。“+” 运算符会在堆中建立两个String对象,这两个对象的值分别是 “abc” 和 “def”,也就是说从字符串池中复制这两个值,然后在堆中创建两个对象, 然后再建立对象 str3,然后将 “abcdef” 的堆地址赋给 str3。
1: 栈中开辟一块空间存放引用str1,str1指向常量池中的"abc"
2: 栈中开辟一块空间存放引用str2,str2指向常量池中的"def"
3: 栈中开辟一块空间存放引用str3。
4:str1 + str2通过StringBuilder的最后一步toString()方法还原一个新的String对象"abcdef",因此堆中开辟一块空间存放此对象
5:引用str3指向堆中(str1 + str2)所还原的新的String对象
6:str3指向的对象在堆中,而常量"abcdef"在池中,输出为false。

例4:

/**
 * 编译期优化
 */
public void test6(){
    String s0 = "a1"; 
    String s1 = "a" + 1; 
    String s6 = "1";
    String s7 = "a" + s6;
    System.out.println("===========test6============");
    System.out.println((s0 == s1)); //result = true  
     System.out.println((s0 == s7)); //result = false
    String s2 = "atrue"; 
    String s3= "a" + "true"; 
    System.out.println((s2 == s3)); //result = true  
    String s4 = "a3.4"; 
    String s5 = "a" + 3.4; 
    System.out.println((s4 == s5)); //result = true
    
}

结果为:true、true、true
分析:
在程序编译期,JVM就将常量字符串“+”连接优化为连接后的值,比如"a"+1,在编译期优化后,在class中就已经是"a1"。在编译期其字符串常量的值就确定下来。而对于" s7 = “a” + s6 “来说,在”+" 连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + s6 无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给s7,所以上面程序的结果为false。

例5:

/**
 * 比较字符串常量的“+”和字符串引用的“+”的区别
 */
public void test8(){
    String test="javalanguagespecification";
    String str="java";
    String str1="language";
    String str2="specification";
    System.out.println("===========test8============");
    System.out.println(test == "java" + "language" + "specification");
    System.out.println(test == str + str1 + str2);
}

结果为:true、false
分析:
在编译器编译时,直接把"java"、“language"和"specification"这三个字面量进行”+“操作得到一个"javalanguagespecification"常量,并且直接将这个常量放入字符串池中。而字符串引用的”+“运算是在Java运行期间执行的,即str + str1 + str2在程序执行期间才会进行计算,它会在堆内存中重新创建一个拼接后的字符串对象。总结来说,就是字面量的”+“拼接是在编译期间进行的,拼接后的字符串存放在字符串池中;而字符串引用的”+"拼接运算是在运行时进行的,新创建的字符串存放在堆中。

对于直接相加的字符串,效率很高,因为在编译期便确定了它的值,即形如"I" + “love” + “java” 的字符串相加,在编译期间便被优化成了"Ilovejava"。对于间接相加(即包含字符串引用),形如 s1+s2+s3,效率要比直接相加低,因为在编译期不会对引用变量进行优化。

例6:

/**
 * 编译期确定
 */
public void test9(){
    String s0 = "ab"; 
    final String s1 = "b"; 
    String s2 = "a" + s1;  
    System.out.println("===========test9============");
    System.out.println((s0 == s2)); //result = true
}

结果为:true
分析:这里的s1字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中,所以此时的 “a” + s1 和 “a” + “b” 效果是一样的。

例7:

/**
 * 编译期无法确定
 */
public void test10(){
    String s0 = "ab"; 
    final String s1 = getS1(); 
    String s2 = "a" + s1; 
    System.out.println("===========test10============");
    System.out.println((s0 == s2)); //result = false 
    
}

private static String getS1() {  
    return "b";   
}

结果:false
分析:虽然这里的s1用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,因此s0和s2指向的不是同一个对象,故上面的程序结果为false。

总结:

1、String类初始化后是不变的

String使用private final char value[] 来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,所以说String类型是不可变的。String类对象确实有编辑字符串的功能,比如replace(),但是这些编辑功能是通过创建一个新的对象来实现的,而不是对原有对象进行修改。

s = s.replace("World", "Universe");

在这里插入图片描述

2、引用变量与对象

A aa;
aa仅仅是一个引用变量,它不是对象,对象一般通过new创建。

3、创建字符串的方式

创建字符串的方式归纳起来有两类:(1)使用""引号创建字符串(2)使用new关键字创建字符串

使用引用创建的字符串都是常量,在编译期就已经存储到String Pool中;使用new String("")创建的对象会存储到heap中,是运行期创建的;使用只包含常量的字符串连接如"aa" + “bb” 创建的也是常量,编译期就能确定,已经确定存储到String Pool中;使用包含变量的字符串连接符,如"aa" + s1创建的对象是运行期才创建的,存储在heap中。

new创建字符串时,首先查看池中是否有相同值的字符串,如果有,则copy一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间!!)

4、使用String不一定创建对象

在执行双引号包含字符串的语句时,如String a = “123”,JVM会先到常量池里查找,如果有的话,返回常量池里的这个实例的引用,否则的话,创建一个新实例并置入常量池。所以,当使用String a = "123"时,对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。 只有通过new()方法才能保证每次都创建一个新的对象。

5、关于equals和==

(1)对于 “==”, 如果作用于基本数据类型的变量(byte、short、char、int、long、float、double、boolean),则直接比较其存储的“值”是否相等;如果作用于引用类型的变量(String),则比较的是所指向的对象的地址(即判断其是否指向同一个对象)
(2)equals方法,是基类Object中的方法,因此对于所有的

参考:

https://www.cnblogs.com/xiaoxi/p/6036701.html
https://blog.csdn.net/qq_43012792/article/details/107372191
https://blog.csdn.net/aaqian1/article/details/113766231

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java String(一)—— Java中的String类型 的相关文章

  • 如何获取枚举的子集

    大多数情况下 包含所有元素的枚举显示在用户界面的下拉列表中 我们只需要在用户界面中显示 5 个字段中的 2 个 通过某种方式利用可用于枚举的相同函数来获取此数据的更简单方法是什么 enum Color RED GREEN BLACK BLU
  • java替代Thread.stop()来中断特定调用

    我正在寻找一种方法来告诉这个调用 大约需要 20 120 秒 final Area image final AffineTransform transform new AffineTransform transform scale imag
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • 总结二维数组

    鉴于我当前的程序 我希望它在用户输入所有值后计算每列和每行的总和 我当前的代码似乎只是将数组的值加倍 这不是我想要做的 例如 如果用户输入具有以下值 1 2 3 2 3 4 3 4 5 的 3x3 矩阵 则看起来就像我在下面的程序中对其进行
  • 确定代码是否在 App Engine 运行时 (Java) 上运行

    如何确定某些代码 Serv let 或简单的类 是否正在 Google App Engine 运行时 Java 上运行 以便决定是否使用 App Engine 的特定库 是否有一些可靠的运行时环境 ID 您可以检查com google ap
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • 使用 include 进行 JAXB 剧集编译不起作用

    我有 2 个模式 A B 我在 B 中重用了一些 A 元素 我不使用命名空间 我在用着
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜
  • 将带有时区的 Joda-Time `DateTime` 转换为没有时区的 DateTime?

    Given a DateTime http www joda org joda time apidocs org joda time DateTime html例如2015 07 09T05 10 00 02 00 using 乔达时间 h
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服

随机推荐

  • ES搜索引擎入门+最佳实践(一)

    ES在搜索和数据分析中的应用越来越广泛 在之前项目中对ES的使用有些心得 最近有不少朋友和同事都问到了ES 刚好最近也有些时间 所以打算通过8 10篇文章介绍下ES 其实我也不知道最终会写下多少篇 一 概述 本篇文章计划给大家介绍什么ES
  • CVPR2022 |小红书首创多图交互建模挑战热门研究课题,大幅提升行人重识别性能

    在CVPR2022上 小红书多模态算法组提出一种新颖的用于行人重识别的网络Neighbor Transformer NFormer 区别于传统的行人重识别网络仅仅对单张图片进行建模 NFormer对通过transformer对多张输入图像进
  • PWN保护机制以及编译方法

    0x00 声明 以下内容 来自先知社区的作者逆向萌新原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责任 0x01前言 Ctf中的pwn题 在利用gcc编译的
  • 调试不方便?我直接把公众号网页线上环境搬到本地

    在开发微信公众号网页时 我们最关心的一个问题就是调试 怎么调试线上环境 调试是否足够方便 本文分享一种能够极大提高效率的微信公众号网页开发调试技巧 可以实现在本地开发时直连线上生产环境 如果你还不清楚这种场景下的调试技巧 不妨花几分钟阅读本
  • 判断是否有统计意义/差异具有显著性/具有显著差异/零假设(希望证明为错误的假设)/卡方检验

    目录 1 有统计学意义 2 差异具有显著性 3 具有显著差异 4 统计学中的假设 4 1 零假设 4 2 备择假设 5 卡方检验 6 有统计学意义 和 差异显著 的区别 参考资料 1 有统计学意义 统计学意义是指在研究组和对照组间出现疗效差
  • Django-42-ORM多对多查询(ManyToManyField自动创建)

    前提 初始表数据 手动创建与自动创建的区别主要在于自动创建的表没有第三张可操作的表 其他没区别 此篇仅以自动创建为例说明 book表 author表 book authors表 关系表 django study app01 views py
  • 渗压计特性特点计算方法应用

    渗压计是一种测量渗流水或静力压力的传感器 适用于回填或原位孔隙水压力的测定 扬压力的测定 水位或容器中流体压力的测定 具有抗干扰能力强 长期稳定 密封可靠等特点 广泛应用于建筑 铁路 交通 水电大 坝 隧道等土木工程领域 特性 结构简单 紧
  • 软件工程:(四)概要设计

    一 定义 概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程 其结果往往以反映交互控件布置 界面元素分组以及界面整体板式的页面框架图的形式来呈现 这是一个在用户研究和设计之间架起桥梁 使用户研究和设计无缝结合 将对
  • KNN实现手写数字识别

    其他实现手写数字识别的方法 1 聚类 K means 实现手写数字识别 2 卷积神经网络 CNN 实现手写数字识别 3 全连接神经网络实现手写数字识别 4 聚类 K means 实现手写数字识别 2 实验数据是老师收集了所有人的手写数字图片
  • jeesite快速开发平台(一)----简介

    以下内容来自官网 一 平台简介 JeeSite是基于多个优秀的开源项目 高度整合封装而成的高效 高性能 强安全性的开源Java EE快速开发平台 JeeSite是您快速完成项目的最佳基础平台解决方案 JeeSite是您想学习Java平台的最
  • 寄存器的基本原理

    参考大神博客 https blog csdn net qq 37340753 article details 80935423 https blog csdn net u012493828 article details 53439226
  • kali工具的使用

    一 netcat简介与使用 nc的全称为NetCat 它能够建立并接受传输控制协议 TCP 和用户数据报协议 UDP 的连接 Netcat可在这些连接上读写数据 直到连接关闭为止 它可以通过手工或者脚本与应用层的网络应用程序或服务进行交互
  • openblas 第二弹: openblas Android版调用和编译

    1 编译 如果需要在Android下使用openblas 则需要编译Android版本的openblas a文件进行调用 1 openblas的编译时主要参考链接 参考链接一 参考链接二 具体细节太久了 已经忘了 下面是编译好的时候的环境变
  • Linux中普通用户和ROOT用户对Java JDK的配置

    Linux中对对各种工具文件不需要想Windows中似的 还要先一步一步的安装 有的还需要配置环境变量 比如Windows对Java的安装过程 在Linux中 使用指令 tar zxvf 文件名 注意空格 解压完 tar gz 文件 或使用
  • Spring事务实现原理

    Spring事务的原理是基于AOP实现的 所以流程也可以理解为与AOP一样分为3步 解析切面 织入通知和运行时增强 1 解析切面 Srping事务的是通过 EnableTransactionManagement注解开启的 该注解往IoC容器
  • 【逆向】使用CE查找Android中变量的偏移

    0x00 准备工作下载Cheat Engine以及调试器服务端 https www cheatengine org index php 夜神模拟器 https www yeshen com 下载安装贪婪洞窟 梦境模式 http a 4399
  • 【华为OD机试】路灯照明问题 (C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 在一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间间距固定为100米 每个路灯都有
  • oracle修改块大小设置,oracle性能调整(1)

    1调整数据库服务器的性能Oracle数据库服务器是整个系统的核心 它的性能高低直接影响整个系统的性能 为了调整Oracle数据库服务器的性能 主要从以下几个方面考虑 1 1Oracle 调整操作系统以适合Oracle数据库服务器运行数据库服
  • 利用PicGo+Gitee配置图床

    引言 配置图床 方便我们的使用 比如 我们利用typora写的笔记 直接把发送给别人也可以正常使用 不再会有由于本地图片 而加载不出来图片的情况 此外 图片文件遗失亦可以正常加载出来 因为图片已上传 这里已 Typora Gitee Pic
  • java String(一)—— Java中的String类型

    一 需要理解的代码 import java lang reflect Array import java util ArrayList import java util Arrays import java util HashMap imp