事实上,这是几天前提出的一个面试问题.
面试官要我表达之间的区别ArrayList和LinkedList,并要求以优化插入操作ArrayList,换句话说,重新实现add(int index, E element),当然还有复杂get(int index)的操作都可以牺牲.
我的答案是将数组分成k个子数组并更新一个计数数组,表示相应子数组中已有的元素数.并且每个子数组的内存都以预期的初始大小动态分配.当我需要将数据插入时ArrayList,我可以先找到一个子数组,然后在一个小数组中进行操作.如果插入不是太频繁或索引是均匀分布的,插入的时间复杂度可以是O(log(k) + n/k + k)平均的,这log(k)意味着我们应该首先在计数数组的和数组上使用二进制搜索来定位子数组,n/k用于数据移动甚至是内存重新分配,k代表sum数组的更新.
我相信有更好的解决方案.我确实需要一些建议,谢谢!
什么是@EnableTransactionManagementSpring 4中的XML等价物?
顺便说一句,作为Spring的新手,我不知道在哪里可以看到其他注释的XML等价物.
看来,JShell在另一个内部创建的对象JShell无法访问父级的JShell范围.例如:
jshell> int x = 1;
x ==> 1
jshell> x
x ==> 1
jshell> jdk.jshell.JShell js = jdk.jshell.JShell.create();
js ==> jdk.jshell.JShell@1a052a00
jshell> js.eval("x");
$4 ==> [SnippetEvent(snippet=Snippet:ErroneousKey#1-x,previousStatus=NONEXISTENT,status=REJECTED,isSignatureChange=false,causeSnippetnull)]
jshell> js.eval("int x = 2;");
$5 ==> [SnippetEvent(snippet=Snippet:VariableKey(x)#2-int x = 2;,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)]
jshell> js.eval("x");
$6 ==> [SnippetEvent(snippet=Snippet:ExpressionKey(x)#3-x,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)]
Run Code Online (Sandbox Code Playgroud)
是否有可能使父范围对子视图可见?
考虑我们有一个预定的执行者服务:
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(...);
Run Code Online (Sandbox Code Playgroud)
对于某些逻辑,我们想重试任务执行.以下方法对我来说似乎很有气味,但我不明白为什么:
threadPool.submit(new Runnable() {
@Override
public void run() {
// ...
if (needToBeScheduled()) {
threadPool.schedule(this, delay, TimeUnit.MINUTES);
} else if (needToBeResubmitted()) {
threadPool.submit(this);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我看到的一个明显问题是此代码无法转换为lambda:
threadPool.submit(()-> {
// ...
if (needToBeScheduled()) {
threadPool.schedule(this, delay, TimeUnit.MINUTES);
} else if (needToBeResubmitted()) {
threadPool.submit(this);
}
});
Run Code Online (Sandbox Code Playgroud)
^^这将无法编译,因为我们无法this从lambda 引用.虽然它可以通过引入一个产生这样一个实例的方法来解决,而不是提供它this.
但这只是我看到的一个缺点.这里还有什么可以导致任何问题吗?也许有更合适的方法?移动此逻辑ThreadPoolExecutor.afterExecute()(这会导致类型转换...)?
假设该对象是无状态的,即Runnable实例中没有对象变量.
PS执行操作的逻辑(重新安排任务或重新提交或不执行任何操作)基于从数据库(或任何外部源)检索的某些信息.所以Runnable仍然是无国籍的,但它根据其工作的一些结果计算结果.
java concurrency threadpool threadpoolexecutor scheduledexecutorservice
我想序列化一些EnumSet<FooType>,以String使用它的toString()方法.
例如:EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()会给[COMMON, MEDIUM].
问题是关于将这样的字符串反序列化为优雅的方法EnumSet<FooSet>.我正在寻找一些众所周知的库(可能是这样的apache-commons)或标准的Util-class来处理这类事情.
就像是: EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")
我用这样的方式实现了这个东西:
public static <E extends Enum<E>> EnumSet<E> valueOf(Class<E> eClass, String str) {
String[] arr = str.substring(1, str.length() - 1).split(",");
EnumSet<E> set = EnumSet.noneOf(eClass);
for (String e : arr) set.add(E.valueOf(eClass, e.trim()));
return set;
}
Run Code Online (Sandbox Code Playgroud)
但是,可能有现成的解决方案,或者这样做非常简单的方法.
我有点困惑.在填充循环的第一次迭代中,我在使用initial capacityfor ArrayListvs而不使用初始容量时看到填充时间的一些回归.
根据常识和这个问题:为什么要启动具有初始容量的ArrayList?
它必须完全相反.
它不是很好的基准测试,我想知道:为什么在第一次迭代时它总是在使用初始容量时消耗更多的时间和CPU ArrayList?
这是测试:
public class TestListGen {
public static final int TEST = 100_000_000;
public static void main(String[] args) {
test(false);
}
private static void test(boolean withInitCapacity) {
System.out.println("Init with capacity? " + withInitCapacity);
for (int i = 0; i < 5; i++)
av += fillAndTest(TEST, withInitCapacity ? new ArrayList<Integer>(TEST) : new ArrayList<Integer>());
System.out.println("Average: " + (av / 5));
}
private static long fillAndTest(int capacity, …Run Code Online (Sandbox Code Playgroud) 我正在学习Java,我发现有许多标准化的功能:
让我们看一下Sl4j示例:要正确使用log4j,我们必须导入sl4j api,sl4j/log4j桥和log4j实现.
问题:在我的课堂上,我只与Slf4j API进行通信.
我的应用程序如何知道log4j实现?有人可以解释一下究竟发生了什么吗?
问候
我在 Java 7 上工作。
我想知道该方法contains在 HashSet 对象上是否是线程安全的。
HashSet 由一个线程初始化。然后我们用不可修改的集合 ( Collections.unmodifiableSet)包装 HashSet 。初始化后,多个线程只调用方法contains。
当我阅读 Javadoc 时,我不清楚。
在HashSet Javadoc 上,我们可以阅读
这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。
...
请注意,此实现不是同步的。
在HashMap Javadoc 上,我们可以阅读:
请注意,此实现不是同步的。如果多个线程并发访问一个散列映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)
对我来说,这意味着该方法contains不是结构修改。
那么多次调用该方法contains是线程安全的吗?
如果是真的:它是否在所有 JVM 实现(如 IBM JVM)上都有保证?
在我的控制器中,我的控制器方法名称等于requestmapping url.例如,/list等于方法名称list.是否有一个通用的处理程序方法来缩短我的代码?我不想以这种方式编写每个控制器和方法.我记得.net mvc有一个简单的方法来配置它.关于Spring MVC怎么样?
@Controller
@RequestMapping(value = "/fooController ")
public class FooController {
@RequestMapping("/list") public String list(...) { ... }
@RequestMapping("/save") public String save(...) { ... }
@RequestMapping("/delete") public String delete(...) { ... }
}
@Controller
@RequestMapping(value = "/basketballController ")
public class BasketballController {
@RequestMapping("/list") public String list(...) { ... }
@RequestMapping("/save") public String save(...) { ... }
@RequestMapping("/delete") public String delete(...) { ... }
}
Run Code Online (Sandbox Code Playgroud) 我想知道我是否只能实例化javax.crypto.KeyGenerator一次,然后在多线程环境中使用此实例.
它的JavaDoc文档没有说明它的线程安全性.或者使用ThreadLocal<KeyGenerator>方法会更好?
更新:一个相关的问题是SecureRandom线程是否安全? 虽然JavaDoc没有声明该类是线程安全的,但是社区仍然认为它是线程安全的,从实际的角度来看这是非常重要的.我想知道KeyProvider的相同内容.
java ×10
concurrency ×2
spring ×2
algorithm ×1
arraylist ×1
collections ×1
cryptography ×1
enums ×1
enumset ×1
java-7 ×1
java-9 ×1
jshell ×1
logging ×1
performance ×1
slf4j ×1
spring-boot ×1
spring-mvc ×1
threadpool ×1