精华内容
下载资源
问答
  • 字符串缓冲池public class TestString {public static void main(String[] args){String str1 = "string";System.out.println(System.identityHashCode(str1));String str2 = "string";System.out.println(System....

    字符串缓冲池

    public class TestString {

    public static void main(String[] args){

    String str1 = "string";

    System.out.println(System.identityHashCode(str1));

    String str2 = "string";

    System.out.println(System.identityHashCode(str2));

    }

    }

    ​System.identityHashCode()是根据内存地址算Hash值,运行上面代码两次输出的结果一致,这说明str1与str2指向的内存地址是一样的。因为JVM将字符串常量放在了一个叫字符串缓冲区的,因为str1和str2的值一样,所以在缓冲区放一份就可以,同时str1和str2都指向这个地方。

    ​ 当然str1="testString"、str2="test" + "String",str1与str2也会指向相同的区域。因为在编译java文件时,会将str2的值合为"testString"。但是如果str3="String",str2 = "test"+ str3时,str2将和str1虽然内是相等的,但是str1和str2指向的内存地址不同,因为编译器不会将变量str3转换为“String",不过也有下面的特例

    public class TestString {

    public static void main(String[] args){

    String str1 = "TestString";

    System.out.println(System.identityHashCode(str1));

    final String str3 = "Test";

    String str2 = str3 + "String";

    System.out.println(System.identityHashCode(str2));

    }

    }

    ​执行上面的代码会发现输出的值是相等的,这是因为我们在变量str3前加了关键字final,该关键字相当于C中宏替换,告诉编译器编译的时候将str3都替换成"Test",所以才会有str1与str2相等(指向同一内存区)。

    String类不可变字符串

    String类的底层是用数组实现的,我们知道数组的长度确定好后是不能更改的

    str = "abc";

    str = str + ”defg“;

    Java中对于上面的处理过程是重新创建一个对象,并将内容初始化为”abcdefg“,再让str指向这个新的对象。而“abc”依然在字符串缓冲区,如果在后面不会用到,并且垃圾回收器不回收字符串缓冲区的数据的话,就会发生内存泄露问题。

    字符串动态扩展

    如果字符串要动态扩展的话建议使用StringBuilder或者是StringBuffer,前者非线程安全,后者线程安全,用法如下:

    public class TestString {

    public static void main(String[] args){

    StringBuilder sb = new StringBuilder("TestString");

    System.out.println(System.identityHashCode(sb));

    sb.append("String");

    System.out.println(System.identityHashCode(sb));

    System.out.println(sb);

    StringBuffer sb2 = new StringBuffer("TestString");

    System.out.println(System.identityHashCode(sb2));

    sb2.append("String");

    System.out.println(System.identityHashCode(sb2));

    System.out.println(sb2);

    }

    }

    + 的重载与 StringBuilder

    public class Concatenation {

    public static void main(String[] args) {

    String mango = "mango";

    String s = "abc" + mango + "def" + 47;

    System.out.println(s);

    }

    }

    上面的代码在给字符串s赋值时,Java编译器会对其优化,采用StringBuilder将"abc"、mango、"def"以及47拼接起来,然后转换为String对象赋值给s。这样避免生成多个String对象从而浪费内存。

    展开全文
  • } } } public void loadClass(){ try { // 例如/usr/java/classes下有一个test.App类,则/usr/java/classes即这个类的根路径,而.class文件的实际位置是/usr/java/classes/test/App.class File clazzPath = new ...

    javaFileObjects = fileMgr.getJavaFileObjects(pathname);

    //编译

    compiler.getTask(null, fileMgr, null, null, null, javaFileObjects).call();

    }catch (Exception e) {

    throw new RuntimeException("编译失败");

    }finally{

    if(fileMgr!=null)

    try {

    fileMgr.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    public void loadClass(){

    try {

    // 例如/usr/java/classes下有一个test.App类,则/usr/java/classes即这个类的根路径,而.class文件的实际位置是/usr/java/classes/test/App.class

    File clazzPath = new File(basePath);

    // 记录加载.class文件的数量

    int clazzCount = 0;

    if (clazzPath.exists() && clazzPath.isDirectory()) {

    // 获取路径长度

    int clazzPathLen = clazzPath.getAbsolutePath().length() + 1;

    Stackstack = new Stack<>();

    stack.push(clazzPath);

    // 遍历类路径

    while (stack.isEmpty() == false) {

    File path = stack.pop();

    File[] classFiles = path.listFiles(new FileFilter() {

    public boolean accept(File pathname) {

    return pathname.isDirectory() || pathname.getName().endsWith(".class");

    }

    });

    for (File subFile : classFiles) {

    if (subFile.isDirectory()) {

    stack.push(subFile);

    } else {

    if (clazzCount++ == 0) {

    Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);

    boolean accessible = method.isAccessible();

    try {

    if (accessible == false) {

    method.setAccessible(true);

    }

    // 设置类加载器

    URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();

    // 将当前类路径加入到类加载器 强制将累加入当前classpath中

    method.invoke(classLoader, clazzPath.toURI().toURL());

    } finally {

    method.setAccessible(accessible);

    }

    }

    // 文件名称

    String className = subFile.getAbsolutePath();

    className = className.substring(clazzPathLen, className.length() - 6);

    className = className.replace(File.separatorChar, '.');

    // 加载Class类

    SoaLogger.debug(QuartzManger.class,"动态加载[class:{"+className+"}]");

    }

    }

    }

    }

    } catch (Exception e) {

    }

    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, JobExecutionException {

    String src = "package org.soa.quartz.api.job;"+

    "public class Job5 implements org.quartz.Job {"+

    "public void execute(org.quartz.JobExecutionContext context)"+

    "throws org.quartz.JobExecutionException {"+

    "System.out.println(\"我是动态添加的jobss\");"+

    "}"+

    "}";

    String src2 = "package liuyi.soa.quartz.api.job;"+

    "public class Job5 implements org.quartz.Job {"+

    "public void execute(org.quartz.JobExecutionContext context)"+

    "throws org.quartz.JobExecutionException {"+

    "System.out.println(\"我是动态添加的jobss\");"+

    "}"+

    "}";

    final JdkCompiler jdkCompiler = JdkCompiler.INSTA;

    jdkCompiler.compile(Arrays.asList(src,src2),Arrays.asList("org.soa.quartz.api.job.Job5","liuyi.soa.quartz.api.job.Job5") );

    jdkCompiler.compile(Arrays.asList(src,src2),Arrays.asList("org.soa.quartz.api.job.Job5","liuyi.soa.quartz.api.job.Job5") );

    jdkCompiler.loadClass();

    final Job job = (Job)Class.forName("liuyi.soa.quartz.api.job.Job5").newInstance();

    final Job job5 = (Job)Class.forName("liuyi.soa.quartz.api.job.Job5").newInstance();

    job.execute(null);

    job5.execute(null);

    //new JdkCompiler().loadClass();

    }

    }

    展开全文
  • Javascript里的eval函数能动态执行一js脚本。那Java里怎么做到呢。有两种方法:一种是使用可以执行js脚本的Java类ScriptEngineManagerpublicstaticvoidmain(Stringargs[]){ScriptEngineManagermanager=...

    Javascript里的eval函数能动态执行一串js脚本。

    那Java里怎么做到呢。

    有两种方法:

    一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic static void main(String args[]){

    ScriptEngineManager manager = new ScriptEngineManager();

    ScriptEngine se = manager.getEngineByName("js");

    String str = "13>12&&'张三1'=='张三'";

    boolean result;

    try {

    result = ( Boolean)se.eval(str);

    System.out.println(result);

    } catch (ScriptException e) {

    e.printStackTrace();

    }

    }

    另一种复杂点 写一个eval()方法,可以执行System.out.println("Hello, " + str);这行代码:

    aa907ebc483f8c5e1c2d93a363f37c42.png

    Eval.java:package com.darrenchan;

    import java.lang.reflect.Method;

    import java.util.ArrayList;

    import java.util.Arrays;

    import java.util.List;

    import javax.tools.JavaCompiler;

    import javax.tools.JavaFileObject;

    import javax.tools.SimpleJavaFileObject;

    import javax.tools.StandardJavaFileManager;

    import javax.tools.ToolProvider;

    public class Eval {

    /*

    * 从java6版本开始,已经支持动态编译了,你可以在运行期直接编译.java文件,执行.class文件,并且能够获得相关的输入输出,

    * 甚至还能监听相关的事件。

    * java的动态编译提供了多种渠道,比如,可以动态编译一个字符串,也可以是文本文件,也可以是编译过的字节码文件(.class文件),

    * 甚至可以是存放在数据库中的明文代码或字节码,只要是符合java规范的就都可以在运行期动态加载,其实现方式就是实现JavaFileObject

    * 接口,重写getCharContent、openInputStream、openOutputStream,或者实现JDK

    * 已经提供的两个SimpleJavaFileObject、ForwardingJavaFileObject。下面我演示一下,如何动态编译一个字符串。

    */

    /**

    * Java动态编译演示

    */

    public static void main(String[] args) throws Exception {

    // Java源代码

    String sourceStr = "public class Hello{public String sayHello(String name){return \"Hello, \"+name;}}";

    // 类及文件名

    String clsName = "Hello";

    // 方法名

    String methodName = "sayHello";

    /**

    * 当前编译器:注意,如果是用的jdk1.6的版本(建议使用jdk1.7,1.7是没有任何问题的),ToolProvider.

    * getSystemJavaCompiler()拿到的对象将会为null,

    * 原因是需要加载的Tools.jar不在jdk安装目录的jre目录下,需要手动将lib目录下的该jar包拷贝到jre下去,详情请参考:

    * http://www.cnblogs.com/fangwenyu/archive/2011/10/12/2209051.html

    */

    JavaCompiler cmp = ToolProvider.getSystemJavaCompiler();

    // Java标准文件管理器

    StandardJavaFileManager fm = cmp.getStandardFileManager(null, null,

    null);

    // Java文件对象

    JavaFileObject jfo = new StringJavaObject(clsName, sourceStr);

    // 编译参数,类似于javac  中的options

    List optionsList = new ArrayList();

    // 编译文件的存放地方,注意:此处是为Eclipse工具特设的

    optionsList.addAll(Arrays.asList(new String[] { "-d", "./bin" }));

    // 要编译的单元

    List jfos = Arrays.asList(new JavaFileObject[] { jfo });

    // 设置编译环境

    JavaCompiler.CompilationTask task = cmp.getTask(null, fm, null,

    optionsList, null, jfos);

    // 编译成功

    if (task.call()) {

    // 生成对象

    Object obj = Class.forName(clsName).newInstance();

    Class extends Object> cls = obj.getClass();

    // 调用sayHello方法

    Method m = cls.getMethod(methodName, String.class);

    // 第一个参数是执行该方法的主调,后面若干个参数是执行该方法时传入该方法的实参

    String str = (String) m.invoke(obj, "陈驰");

    System.out.println(str);

    }

    }

    }

    StringJavaObject.java:package com.darrenchan;

    import java.io.IOException;

    import java.net.URI;

    import javax.tools.SimpleJavaFileObject;

    public class StringJavaObject extends SimpleJavaFileObject {

    /**

    * 源代码

    */

    private String content = "";

    /**

    * 遵循Java规范的类名及文件

    */

    public StringJavaObject(String javaFileName, String content){

    super(_createStringJavaObjectUri(javaFileName), Kind.SOURCE);

    this.content = content;

    }

    /**

    * 产生一个URL资源路径

    */

    private static URI _createStringJavaObjectUri(String javaFileName) {

    //注意此处未设置包名

    return URI.create("String:///" + javaFileName + Kind.SOURCE.extension);

    }

    /**

    * 文本文件代码

    */

    @Override

    public CharSequence getCharContent(boolean ignoreEncodingErrors)

    throws IOException {

    return content;

    }

    }

    经过测试,最终的运行结果符合预期,如下所示:

    e38b3f4a63fb7fbed5d0ffcc93357e59.png

    展开全文
  • 不得不说,动态规划一直以来...题意给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。(2). 样例比如 s1 = "aabcc" s2 = "dbbca"- 当 s3 = "aadbbcbcac",返回 true.- 当 s3 = "aadbbbaccc", 返回 false.(...

    不得不说,动态规划一直以来就是我的弱项,所以解决一个动态规划的问题都得记录一下!

    1. 概览

    在展示思路之前,还是先来看看题。

    (1).题意

    给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

    (2). 样例

    比如 s1 = "aabcc" s2 = "dbbca"

    - 当 s3 = "aadbbcbcac",返回 true.

    - 当 s3 = "aadbbbaccc", 返回 false.

    (3).挑战

    要求时间复杂度为O(n^2)或者更好

    2.解题思路

    这个题一看题意就知道用动态规划的方法来解决。求解动态规划的题,关键是在于推出动态规划的方程。

    这里我先贴出动态规划的方程,然后在解释它的意思:

    dp[i][j] = (s1.charAt(i - 1) == s3.charAt(i + j - 1) && dp[i - 1][j]) ||(s2.charAt(j - 1) == s3.charAt(i + j -1) && dp[i][j - 1]);

    其中dp数组就是方程需要填的表。记录的是s1字符串的字符和s2的字符是否符合要求,如果符合,为true,否则为false。例如,dp[i][j],表示的意思就是说,如果s3的前i + j个字符由s1的前i个字符和s2的前j个字符组成的话,就为true,反之为false。

    其次再来解释一下上面方程的意思(其实这个方程非常好理解)。我们将i换成s1.length, j换成s2.length,方程就变成了

    dp[s1.length()][s2.length()] = (s1.charAt(s1.length() - 1) == s3.charAt(s1.length() + s2.length() - 1) && dp[s1.length() - 1][s2.length()])||(s2.charAt(s2.length() - 1) == s3.charAt(s1.length() +s2.length() -1) && dp[s1.length()][s2.length() - 1])

    从上面变换的方程中,我们可以看出,要使dp[s1.length()][s2.length()] = true。要么使s3的最后一个字符等于s1的最后一个字符,并且s1前length - 1个字符都在s3中,也就是说dp[i - 1][j] = true;要么使s3的最后一个字符等于s2的最后一个字符,并且s2前length - 1个字符都在s3中,也就是说dp[i][j - 1] = true。如果能理解这个东西,就很好的理解之前使用ij表示的动态规划方程。

    3.代码

    public boolean isInterleave(String s1, String s2, String s3) {

    // write your code here

    if(s3.length() != s1.length() + s2.length()) {

    return false;

    }

    if(s1.equals("") && s2.equals(s3)) {

    return true;

    }

    if(s2.equals("") && s1.equals(s3)) {

    return true;

    }

    boolean [][]dp = new boolean[s1.length() + 1][s2.length() + 1];

    //边界条件

    dp[0][0] = true;

    //初始化dp[i][0]

    for(int i = 1; i <= s1.length(); i++) {

    dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);

    }

    //初始化dp[0][i]

    for(int i = 1; i <= s2.length() ; i++) {

    dp[0][i - 1] = dp[0][i - 1] && s2.charAt(i - 1) == s3.charAt(i - 1);

    }

    for(int i = 1; i <= s1.length(); i++) {

    for(int j = 1; j <= s2.length(); j++) {

    dp[i][j] = (s1.charAt(i - 1) == s3.charAt(i + j - 1) && dp[i - 1][j]) ||(s2.charAt(j - 1) == s3.charAt(i + j -1) && dp[i][j - 1]);

    }

    }

    return dp[s1.length()][s2.length()];

    }

    我们从代码中,看到了一些情况。在正式使用动态规划方程之前,我们必须初始化dp[i][0]和dp[0][i]这种情况,因为下面循环是从i = 1和 j = 1开始的,至于为什么dp[i][0] = true和dp[0][i] = true,非常容易理解,与之前写的方程理解类似

    展开全文
  • JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null); StringSourceJavaObject sourceObject = new Test....
  • 动态编译字符串java,并且添加class到jvm
  • 刚从java转过来感觉c的字符串操作太麻烦了所以自己写了一个类似java的StringBuilder类的头文件 它支持java的StringBuilder支持的很多操作大大方便了对字符串的操作 能力所限如有bug请指出</h1>
  • 代码:BASIC-22 题目名称:FJ的字符串 关键字:字符串 递归 上传日期:2013-11-03 页面链接:http://lx.lanqiao.org/problem.page?gpid=T63 资源限制:时间限制:1.0s 内存限制:512.0MB 问题描述 FJ在沙盘上写了这样一...
  • Table of Contents generated with DocToc一、使用场景在做某些项目的时候,有时会遇到如下情景:用户需要传入某个JAVA 表达式,然后后台将这个表达式当作JAVA代码执行二、市面上表达式引擎比较我们有许多表达式引擎...
  • java中字符串的有三种String ---称为静态字符串,一经定义就长度和内容不在改变,...则没有问题StringBuffer ---动态字符串,长度和内容都可以改变的字符串,但因为stringbuffer中大量方法都是线程同步的,该类一般...
  • 如果StringReader字符用完,则会加载并转换BufferedReader的下一行,以继续为read(…)提供输入. abstract public class TranslatingReader extends Reader { private BufferedReader input; private StringReader ...
  • 通过字符串动态创建类对象功能的需求是 不需要使用IOC 框架 来对创建指定对象。.NET 中 要想动态的 创建对象 做耦合 好像只能做到 将类生成DLL 后 然后 加载DLL 接着创建对象。JAVA 当个类文件 就可以运行。希望做到...
  • Java字符串

    2018-08-20 14:18:00
    目录 Java字符串 Java字符串内存管理 问题 总结 Java字符串 Java字符串是不可变的,也就是说不能对...Java字符串可能存在于两个地方,第一个是编译时已经存在的常量池,另外一个是运行时动态管理的字符...
  • 1,动态规划思想的介绍---参照《算法导论》中关于动态规划的分析来分析此问题 ①最优子结构 要判断整个字符串 s[0..length] 能否被分割,可先判断 s[0...length -1] 能否被分割;而判断 s[0...length -1] 能否被...
  • java字符串数组中动态添加字符串

    万次阅读 2013-11-08 15:23:32
    在向字符串数组中动态添加字符串中遇到了错误。 我已开始是这样做的 String [] result; int n=5; for(int i=0;i { result[0]=String.valueOf(i); }; 最后发现这样确实是有错的。修改成 int n=5; String [] ...
  • JAVA-程序动态执行字符串公式 问题背景描述 在实际开发过程中,需要通过配置表动态配置计算公式以及动态传入值,当前java会自动将字符串公式转义无法直接计算其结果。 例如:有公式:(A+B)/C 分别传入动态参数A=1,B...
  • 1、牛客网题目:题目描述对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的...
  • 交叉字符串 Java实现

    2017-05-25 15:09:58
    题目:给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。样例: s1 = “aabcc” s2 = “dbbca” - 当 s3 = “aadbbcbcac”,返回 true. - 当 s3 = “aadbbbaccc”, 返回 false.挑战:要求时间复杂度...
  • java字符串学习记录public class StringDemo {public static void main(String[] args) {//静态初始化字符串String s1 = "hello china!";String s3 = "Hello China!";System.out.println(s1);//动态初始化字符串...
  • 我想根据特定的输入动态生成字符串如果输入= 1,则字符串输出= 00000如果它= 10,则输出= 0000a输入= 16,输出= 00010等等 。生成的字符串是从0到9的数字和从a到f的字母并且所有生成的字符串字符串长度都是恒定的...
  • 我正在尝试通过将类名称作为字符串发送来动态创建类的对象.我已经搜索了所有的java论坛,但我无法得到我想要的答案.这是我的要求,我有一个名为Agent的班级,package somePack;public class Agent{private String Id;...
  • 问题,给你一个字符串,要求循环左移n位。比如对"abcdefg"循环左移2位,我们要得到"cdefgab"。附加条件,不能使用连续辅助空间(包括动态分配),只能使用若干单个变量(即O(1)空间)。首先,我们知道,反转一个字符串...
  • 注意:java中只要是字符串,就是一个对象 public class Demo01String { public static void main(String[] args) { //动态初始化一个数组,这就是创建了一个对象。数组就是一个对象 in...
  • 如何解析动态字符串值以创建URL实例?我需要用空格,重音符号,非ASCII字符替换空格……?我试图使用URLEncoder,但它也编码/字符,如果我将一个用URLEncoder编码的字符串给URL构造函数,我得到一个MalformedURLException...
  • java动态执行字符串表达式

    千次阅读 2020-01-12 12:06:49
    环境:idea+jdk1.8 直接使用groovy引擎: public static void main(String args[]) { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineMa...
  • 题目描述: ...比如,abxdba,删去x,可以得到abdba,是一个回文字符串,你的任务就是求出给定的字符串删去若干字符后可以得到的最长回文字符串的长度。字符串长度不超过1000,字符范围从'a'到'z'。...
  • JAVA 动态执行字符串代码

    千次阅读 2019-08-05 19:17:24
    用到的相关类: import org.springframework.context.expression.MapAccessor; import org.springframework.expression...要执行的方法时要有new才能够执行,如执行上面的字符串: new Test().exec(name) 方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,357
精华内容 1,342
关键字:

动态字符串java

java 订阅