JAVA学习笔迹1

上周一和周二参加了Best Practise for WAS的培训,获益匪浅,不过手中的资料太杂乱了,现在对其中的JAVA编程优化注意事项进行一下整理,全文如下:

1.         对象产生过程中的一些优化技巧:

不要在循环中产生对象;

尽量用原数据类型而避免使用包装类对象;

对象使用完后要将引用地址赋值为空;

尽量避免定义和使用类变量,而应该尽力使用局部变量;

LazeObjectCreation,在对象需要使用时再产生,然后赋值为NULL

类的继承链不要太长,因为在类构造时将会调用父类的构造方法并对父类的变量进行初始化,如果继承链太长将会增加类的生成开销。

2.         StringStringBuffer的选择策略:

String(Immutable不可变)StringBuffer(mutable可变的),这样当出现String += “append”;这种代码时一共出现了三个String对象,首先”append”literal[j1] ,因此它是一个String对象,而StringImmutable类型的,因此它必须生成一个新的String对象来包含旧的String内容和”append”的值;而StringBufferappend方法则不需要产生一个新的StringBuffer对象,直接在原有StringBuffer对象后增加新的内容;

String(Immutable)CompileTimeResolution,而StringBuffer(mutable)RunTimeResolution的,这样String = “aa”+”bb”+”cc”+”dd”这样的赋值并不会产生三个新的String对象来保存中间运算结果,它将被JAVA编译器优化为String=”aabbccdd”

StringBuffer在创建时最好指定容量,如果未指定容量则在当前默认容量满了之后将会分配新的内存并将旧的和新的内容拷贝到新内存中,这样将开销很大。

3.          异常优化的处理:

JAVA中最基本的错误处理类为:java.lang.Throwable,其派生子类为ErrorException,而Error的处理一般是由JVM来完成的,例如:Example of Error is OutOfMemoryError.

不要用异常来做除程序异常外的任何事,例如用来执行程序逻辑,这是因为异常处理在JAVA中是非常耗费资源,开销很大的操作;

尽量避免使用“Exception e”这种参数来捕捉异常,在可以的情况下尽量用可预期的异常类型来作为catch捕捉的类型参数;

将资源释放的操作放在finally中,这样即时异常发生也能避免资源泄漏和空转的情况;

如无设计上的考虑,尽量将异常处理操作放在发现异常的类中,避免向外层抛出,异常抛出处理的代价是很高的;

不要在循环内部使用trycatch,而应该将循环放在try中;

4.         循环处理的优化;

使用局部变量int类型作为循环的index变量,如果使用函数作为判断条件,由于函数的开销因素这是很不恰当的做法,如果使用byteshort型,这两种类型都会被隐式的转换为int型;

使用System.arraycopy()而避免使用循环来完成数组的拷贝;

在循环中使用局部变量来代替直接使用数组元素;

如果有多个逻辑表达式作为循环的判断条件,在&&操作时考虑将为true可能性较大的表达式放置在左边,如果||操作,则将得到false可能性大的表达式至于左边;


 [j1]JVM maintains an internal list of references for interned Strings ( pool of unique Strings) .  When JVM loads String literal from class file and executes, it

checks whether that String exists in the internal list or not.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java笔迹中提取相似笔迹可以通过计算笔迹的相似度来实现。以下是一个基于笔迹点集的相似度计算示例: ```java public class Stroke { private List<Point> points; public Stroke(List<Point> points) { this.points = points; } public List<Point> getPoints() { return points; } // 计算笔迹的相似度 public double similarity(Stroke other) { double similarity = 0; List<Point> otherPoints = other.getPoints(); int n = Math.min(points.size(), otherPoints.size()); // 计算笔迹点集的欧几里得距离 for (int i = 0; i < n; i++) { Point p1 = points.get(i); Point p2 = otherPoints.get(i); similarity += Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } return similarity; } } ``` 在这个示例中,我们定义了一个 Stroke 类来表示笔迹。Stroke 类中包含了一个点集,我们可以通过计算点集的欧几里得距离来计算笔迹之间的相似度。假设我们有多个笔迹,我们可以先选定一个参考笔迹,然后计算其他笔迹与参考笔迹的相似度,最后选取相似度最高的几个笔迹作为相似笔迹。具体实现步骤如下: ```java public class SimilarityDetection { private List<Stroke> strokes; public SimilarityDetection(List<Stroke> strokes) { this.strokes = strokes; } // 从笔迹集合中提取相似笔迹 public List<Stroke> extractSimilarStrokes(Stroke reference, int k) { List<Stroke> similarStrokes = new ArrayList<>(); List<Double> similarities = new ArrayList<>(); for (Stroke stroke : strokes) { double similarity = stroke.similarity(reference); similarities.add(similarity); } // 找到相似度最高的 k 个笔迹 for (int i = 0; i < k; i++) { int index = maxIndex(similarities); similarStrokes.add(strokes.get(index)); similarities.remove(index); strokes.remove(index); } return similarStrokes; } // 找到最大值的下标 private int maxIndex(List<Double> list) { int index = 0; double max = Double.MIN_VALUE; for (int i = 0; i < list.size(); i++) { if (list.get(i) > max) { max = list.get(i); index = i; } } return index; } } ``` 在这个示例中,我们定义了一个 SimilarityDetection 类来表示相似度检测。SimilarityDetection 类中包含了一个笔迹集合,我们可以通过 extractSimilarStrokes 方法来提取相似笔迹。在 extractSimilarStrokes 方法中,我们先计算每个笔迹与参考笔迹的相似度,然后找到相似度最高的 k 个笔迹,最后返回这 k 个笔迹作为相似笔迹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值