暂无个人介绍
应该尽量避免在 finally 块中抛异常或者包含 return 语句。
可以
可以。使用volatile修饰的变量,线程在每次使用的时候,都会读取变量修改后最后的值。例如一个典型的例子实在类中有long类型的成员变量。如果该变量被多个线程访问好把该变量设置 为volatile,为什么,因为java读取long类型的变量,不是原子的,需要分两步如果一个线程正在修改long变量值,另一个线程可能看到该值的一半(32位),但是对volatile型的long或double变量的读写是原子。
Busy spin是一种在不释放CPU的基础上等待事件的技术。它经常用于避免丢失CPU的缓存中的数据(如果线程先暂停,之后再其他CPU上运行就会丢失)。所以,如果你的工作要求低延迟,并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法。它唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒。LMAX 分布式框架是一个高性能线程间通信的库,该库有一个BusySpinWaitStrategy 类就是基于这个概念实现的,使用 busy spin 循环EventProcessors 等待屏障。
线程局部变量高效地为每个使用它的线程提供单独的线程局部变量值的副本。每个线程只能看到与自己相联系的值,而不知道别的线程可能正在使用或修改它们自己的副本。
面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正是为解决这一类问题而诞生的。享元模式通过共享技术实现相同或相似对象的重用。
sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行;
sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
可以
都是32位
大端
java字节序
字节序分为两种:
BIG-ENDIAN—-大字节序
LITTLE-ENDIAN—-小字节序
BIG-ENDIAN就是最低地址存放最高有效字节。
LITTLE-ENDIAN是最低地址存放最低有效字节。
java字节序:JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。
java中转换字节序
ByteBuffer类中的order(ByteOrder bo) 方法可以设置 ByteBuffer 的字节序。
其中的ByteOrder是枚举:
ByteOrder BIG_ENDIAN 代表大字节序的 ByteOrder 。
ByteOrder LITTLE_ENDIAN 代表小字节序的 ByteOrder 。
作者:aloserbird
来源:CSDN
原文:https://blog.csdn.net/aloserbird/article/details/78089962
版权声明:本文为博主原创文章,转载请附上博文链接!
java字节序
字节序分为两种:
BIG-ENDIAN—-大字节序
LITTLE-ENDIAN—-小字节序
BIG-ENDIAN就是最低地址存放最高有效字节。
LITTLE-ENDIAN是最低地址存放最低有效字节。
java字节序:JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。
java中转换字节序
ByteBuffer类中的order(ByteOrder bo) 方法可以设置 ByteBuffer 的字节序。
其中的ByteOrder是枚举:
ByteOrder BIG_ENDIAN 代表大字节序的 ByteOrder 。
ByteOrder LITTLE_ENDIAN 代表小字节序的 ByteOrder 。
ByteOrder nativeOrder() 返回当前硬件平台的字节序。
a)给线程命名,这样可以帮助调试。
b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。
c)如果可以,更偏向于使用 volatile 而不是 synchronized。
d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。
作者:LYZ0907
来源:CSDN
原文:https://blog.csdn.net/liyazhou0215/article/details/77540299
版权声明:本文为博主原创文章,转载请附上博文链接!
a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。
b)使用 NIO 和 NIO2
c)在 finally 块中关闭流,或者使用 try-with-resource 语句。
d)使用内存映射文件获取更快的 IO。
a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。
b)不要重载参数数量一致,而只是参数顺序不同的方法。
c)如果重载的方法参数个数多于 5 个,采用可变参数。
`public String reverse5(String str) {
if (str == null || str.length() <= 1) {
return str;
}
String result = "";
char[] arr = str.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (char a : arr) {
stack.push(a);
}
int length = stack.size();
//注意这个地方必须要先把length暂存起来,因为在遍历的过程中,pop()堆的时候,会改变堆的大小。
for (int i = 0; i < length; i++) {
result += stack.pop();
}
return result;
} `
`public class MainClass {
public static void main(String[] args)
{
int[] my_array = {1, 2, 5, 5, 6, 6, 7, 2, 9, 2};
findDupicateInArray(my_array);
}
public static void findDupicateInArray(int[] a) {
int[] b = new int[10];
for(int j=0;j<a.length;j++) {
int value = a[j];
b[value] = b[value] + 1;
}
for(int j=0;j<b.length;j++) {
if (b[j] > 1) {
System.out.println("重复元素 : " + j);
}
}
}
}
`
`
public class MySocket {
public static void main(String[] args) {
String[] array = new String[]{"1","2","3","4"};
listAll(Arrays.asList(array), "");
}
public static void listAll(List candidate, String prefix) {
if(prefix.length()==4){
System.out.println(prefix);
}
for(int i=0;i<candidate.size();i++) {
List tmp = new LinkedList(candidate);
listAll(tmp, prefix + tmp.remove(i));//函数中的参数从右边开始解析
}
}
}
`
b & 0xFF
SAX与DOM之间有一些显著区别,包括:
DOM是复杂对象处理的首选,比如当XML比较复杂的时候,或者当你需要随机处理文档中数据的时候。SAX从文档的开始通过每一节点移动,以定位一个特定的节点。
DOM为载入到内存的文档节点建立类型描述。最终,这些描述呈现了可容易横向移动、潜在巨大、树型结构。如果XML很冗长,DOM就会显示出无法控制的胀 大。例如,一个300KB的XML文档可以导致RAM或者虚拟内存中的3,000,000KB的DOM树型结构。通过比较就会发现,一个SAX文档根本就 没有被解构,它也没有隐藏在内存空间中(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。SAX就是一种“更轻巧的”技术──它可以给你的系统 带来更轻的负担。SAX相当于观看一场马拉松比赛,而DOM就好比邀请所有的比赛选手到家里参加晚餐。
所以,你如何选择SAX和DOM?如果你处理复杂的东西,比如高级XSLT转换,或者Xpath过滤,请选择使用DOM。如果你建立或者更改XML文档,你也可以选择DOM。
相反,你可以使用SAX来查询或者阅读XML文档。SAX可以快速扫描一个大型的XML文档,当它找到查询标准时就会立即停止,然后再处理之。
在某些情况下,在一个方案中,最佳的选择是使用DOM和SAX处理不同的部分。例如,你可以使用DOM将XML载入到内存并改变它,然后通过从DOM树中发送一个SAX流而转移最后的结果。
原型模式中的原型管理器本质上就是一个工厂,当然这个工厂经过了改进,去掉了像抽象工厂模式或者工厂方法模式那样繁多的子类。
因此可以说原型模式就是在工厂模式的基础上加入了克隆方法。
工厂模式对新产品的适应能力比较弱:创建新的产品时,就必须修改或者增加工厂角色。而且为了创建产品对象要先额外的创建一个工厂对象。通过原型模式来创建对象,只需修改原型管理器维护的清单,不需要编码就可以实现系统的扩展。