Java进阶 创建和销毁对象

最近准备写点Javase的东西,希望可以帮助大家写出更好的代码。

1、给不可实例化的类提供私有构造器

比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代码:

TextUtils textUtils = new TextUtils();if(textUtils.isDigitsOnly("123")){//doSometing}else{//doSomething}
自己写个工具类,总有人喜欢先初始化个实例在调用方法,然后还附带一个警告:The static method isDigitsOnly(CharSequence) from the type TextUtils should be accessed in a static way 。 你建议他使用类名.方法,人家还不乐意,我又没出错,干嘛要改,错了你负责么。所以最好的方式,让他没办法new实例。

为工具类添加私有构造器:

public class TextUtils {private TextUtils() { /* cannot be instantiated */ }

这是android的TextUtils的源码,这样就可以了,让他妹的初始化实例~,当然你也可以在私有方法里面扔个异常。

	public class TextUtils{private TextUtils() { /* cannot be instantiated */ throw new UnsupportedOperationException("cannot be instantiated");}}

对于异常的使用,一尽量使用Java提供的异常类,这样可以使你的API比较易读和易懂。


2、正确使用String,避免创建不必要的对象

很多人面试的时候都遇到过这样的问题:String s = new String("abc");请问创建了几个对象。也从侧面说明了这是个反面的代码写法:

a、String s = new String("abc");“abc”本身就是一个String的实例,所以new String创建了不必要的String实例

b、如果改写成 String s = "abc",不仅只创建了一个实例,而且在同一台VM中,对于“abc”(字符串的字面常量)还会重用。


3、优先使用基本类型,Java提供了8种基本类型,以及对应的装箱基本类型,且在Java1.5 提供了自动装箱和解箱操作,虽然方便了代码的编写,但是如果不注意,可能带来不好的效果。

看下面的代码:

long start = System.nanoTime();Long sum = 0L;for (long i = 0; i < Integer.MAX_VALUE; i++){sum += i;}System.out.println(sum);System.out.println(System.nanoTime() - start);//20995956735

如果你观察了内存,会发现,一直GC一直在内存回收,并且计算时间需要20多秒,如果我说这段代码有个bug,导致代码运行很慢,以及耗费内存,你能找到吗?

下面我修改下代码:

long start = System.nanoTime();long sum = 0l;for (long i = 0; i < Integer.MAX_VALUE; i++){sum += i;}System.out.println(sum);System.out.println(System.nanoTime() - start);//5029758632

这次运行不会出现GC一直回收内存,且速度也只需要5秒左右,可能眼神不好的,没有发现哪个地方修改了。

问题就出在自动装箱、解箱上。第一次的程序sum为Long类型,在计算sum+=i;时会把sum自动解箱成long sum 然后运算,运算完成后,再装箱成Long sum,导致程序构造了大约2的32次方个多余Long实例。所以各位且用且严谨。


4、对于自己管理内存的类,一定要清除不必要的对象引用,防止内存泄漏

看下面的代码:

package com.zhy._01;import java.util.Arrays;/** 使用数组模拟栈*/
public class MyStack
{private static final int DEFAULT_INIT_SIZE = 10;private Object[] eles = new Object[DEFAULT_INIT_SIZE];/*** 当前栈顶索引*/private int currentIndex;/*** 弹栈* * @return*/public Object pop(){if (currentIndex == 0)throw new ArrayIndexOutOfBoundsException("stack is empty");return eles[--currentIndex];}/*** 压栈* * @param o*/public void push(Object o){ensureCapacity();eles[currentIndex++] = o;}private void ensureCapacity(){if (eles.length == currentIndex){eles = Arrays.copyOf(eles, currentIndex * 2 + 1);}}}

代码中存在一个地方,导致了内存泄漏,你可以发现不?

return eles[--currentIndex];

这行代码导致,如果栈增长了特别大,然后调用多次pop弹栈,虽然currentIndex小了,但是栈始终保持中之前pop出的过期对象的引用,这就导致了内存泄漏。如果不注意甚至最终造成OOM。

应该改为:

/*** 弹栈* * @return*/public Object pop(){if (currentIndex == 0)throw new ArrayIndexOutOfBoundsException("stack is empty");Object tmp = eles[--currentIndex];eles[currentIndex] = null ; return tmp ; }

当然了,不要因为担心内存泄漏,在每个变量使用完成后都添加xxx=null,对于消除过期引用的最好方法,就是让包含该引用的变量结束生命周期,而不是显示的清空。一般情况下,对于类自己管理的内存,应当警惕。



好了,就到这里,这些内容都是我个人觉得值得知道,且在项目中会常遇到的,希望可以帮助到大家,嘿嘿,求评论,求赞。







转载于:https://www.cnblogs.com/oversea201405/p/3752027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美爆!《自然》公布2018年19张最震撼的科学图片

来源&#xff1a;前瞻网 摘要&#xff1a;2018年注定将载入科学史册&#xff1a;气候上&#xff0c;从加利福尼亚烧到开普敦的致命野火和极端干旱、历史罕见;医学上&#xff0c;克隆和成像技术的进步既带来希望&#xff0c;也产生了争议;生物上&#xff0c;一系列事件让人们意识…

python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

一.trie树应用&#xff1a; 相应leetcode 常用于搜索提示&#xff0c;如当输入一个网址&#xff0c;可以自动搜索出可能的选择。当没有完全匹配的搜索结果&#xff0c;可以返回前缀最相似的可能。 例如三个单词app, apple, add,我们按照以下规则创建了一颗Trie树.对于从树的根…

天才也勤奋!DeepMind哈萨比斯自述:领导400名博士向前,每天工作至凌晨4点

来源&#xff1a;量子位你见过凌晨4点的伦敦吗&#xff1f;哈萨比斯天天见。这位DeepMind创始人、AlphaGo之父&#xff0c;一直是全球赞颂的当世天才&#xff0c;但每天要到凌晨4点&#xff0c;才能睡下。这是哈萨比斯最新采访中透露的作息时间&#xff0c;他告诉《星期日泰晤士…

如何学好PPT设计

一般来说&#xff0c;学习PPT大致要经过三个阶段&#xff1a; 1、基础技能&#xff1a;基本的PPT软件学习、基础设计理论的学习、相关辅助软件的掌握(例如图片处理的photoshop&#xff0c;绘制矢量图形的coreldraw、illustrator等)&#xff1b; 2、讲故事的能力&#xff08;就是…

RNN知识+LSTM知识+encoder-decoder+ctc+基于pytorch的crnn网络结构

一&#xff0e;基础知识&#xff1a; 下图是一个循环神经网络实现语言模型的示例&#xff0c;可以看出其是基于当前的输入与过去的输入序列&#xff0c;预测序列的下一个字符&#xff0e; 序列特点就是某一步的输出不仅依赖于这一步的输入&#xff0c;还依赖于其他步的输入或输…

编程模式如何结束未响应的程序

有时要编程结束一个程序的运行。比如说 hWnd 是你要操作的那个窗口的句柄。如果是一般的情况::PostMessage(hWnd,WM_CLOSE,0,0);就可以了。&#xff08;注意不要发送 WM_DESTROY消息。这两者有什么区别呢&#xff1f;WM_CLOSE&#xff0c;会正常关闭程序&#xff0c;比如说&am…

利用flask写的接口(base64, 二进制, 上传视频流)+异步+gunicorn部署Flask服务+多gpu卡部署

一.flask写的接口 1.1 manage.py启动服务(发送图片base64版) 这里要注意的是用docker的话,记得端口映射 #coding:utf-8 import base64 import io import logging import picklefrom flask import Flask, jsonify, request from PIL import Image from sklearn import metric…

2018中国自动驾驶市场专题分析

来源&#xff1a;智车科技未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#…

Ant步步为营(4)ant启动tomcat

前序&#xff1a; 最近产品要release&#xff0c;一直忙着测试&#xff0c;没有时间学习ant了&#xff0c;今天终于没什么事了赶紧写点东西。这个启动tomcat是好些天之前写的了。在这里跟大家分享一下。 build.xml <?xml version"1.0"?> <project name…

python写日志

需要再加入按照日期生成日志 #coding:utf-8 import logging import logging.handlers class Logger:logFile def __init__(self, logFile):self.logFile logFileself.logger logging.getLogger(mylogger)self.logger.setLevel(logging.INFO)rf_handler logging.handlers.…

MIT科学家Dimitri P. Bertsekas最新2019出版《强化学习与最优控制》(附书稿PDF讲义)...

来源&#xff1a;专知摘要&#xff1a;MIT科学家Dimitri P. Bertsekas今日发布了一份2019即将出版的《强化学习与最优控制》书稿及讲义&#xff0c;该专著目的在于探索这人工智能与最优控制的共同边界&#xff0c;形成一个可以在任一领域具有背景的人员都可以访问的桥梁。REINF…

PHP中的中文截取乱码问题_gb2312_utf-8

一、字符串编码为gb2312&#xff0c;一个中文占俩字节 public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置&#xff0c;$len指字符串长度$strlen $start $len; // 用$strlen存储字符串的总长度&#xff0c;即从字符串的起…

yolov3 anchors用kmeans聚类出先验框+anchor宽高比分析

一&#xff0e;yolov v3聚类出框 # -*- coding: utf-8 -*- import numpy as np import random import argparse import os# # 参数名称 # parser argparse.ArgumentParser(description使用该脚本生成YOLO-V3的anchor boxes\n) # parser.add_argument(--input_annotation_txt…

Geoff Hinton:全新的想法将比微小的改进更有影响力

来源&#xff1a;AI科技评论摘要&#xff1a;日前&#xff0c;WIRED 对 Hinton 进行了一次专访&#xff0c;在访谈中&#xff0c;WIRED 针对人工智能带来的道德挑战和面临的挑战等问题进行了提问&#xff0c;以下为谈话内容。“作为一名谷歌高管&#xff0c;我认为在公开场合抱…

修改TOMCAT服务器图标为应用LOGO

在tomcat下部署应用程序&#xff0c;运行后&#xff0c;发现在地址栏中会显示tomcat的小猫咪图标。有时候&#xff0c;我们自己不想显示这个图标&#xff0c;想换成自己定义的的图标&#xff0c;那么按如下方法操作即可&#xff1a; 参考网上的解决方案&#xff1a;1、将$TOMCA…

python连接mysql的一些基础知识+安装Navicat可视化数据库+flask_sqlalchemy写数据库

一&#xff0e;mysql基础知识 &#xff11;&#xff0e;connect连接数据库 import pymysqldef get_conn():conn pymysql.connect(hostxxx.xxx.xxx.xxx, port3306, userroot, passwd, dbnewspaper_rest) # db:表示数据库名称return conn &#xff12;&#xff0e;创建表 im…

工业互联网平台创新发展白皮书(2018)

来源&#xff1a;走向智能论坛摘要&#xff1a;近日&#xff0c;在“2018年产业互联网与数据经济大会——首届工业互联网平台创新发展暨两化融合推进会”上&#xff0c;国家工业信息安全发展研究中心尹丽波主任发布并解读了《工业互联网平台创新发展白皮书&#xff08;2018&…

迭代器模式和组合模式混用

迭代器模式和组合模式混用 前言 园子里说设计模式的文章算得上是海量了&#xff0c;所以本篇文章所用到的迭代器设计模式和组合模式不提供原理解析&#xff0c;有兴趣的朋友可以到一些前辈的设计模式文章上学学&#xff0c;很多很有意思的。在Head First 设计模式这本书中&…

python实现可扩容队列

#coding:utf-8 """ fzh created on 2019/10/15 构建一个队列 """ import datetimeclass LoopQueue(object):def __init__(self, n10):self.arr [None] * (n1) # 由于特意浪费了一个空间&#xff0c;所以arr的实际大小应该是用户传入的容量1sel…

5G 产业链重要投资节点

来源&#xff1a;兴业证券 ▌5G:大通信容量及超低延时&#xff0c;未来多项应用的基础5G:高工作频率以及频谱带宽带来高通信容量5G(5thgeneration)是指第五代移动电话通信标准。3GPP(第三代合作伙伴计划&#xff0c;电信标准化机构)将5G标准分为了NSA(非独立组网)和SA(独立组网…