精华内容
下载资源
问答
  • C++11 右值引用&&

    万次阅读 多人点赞 2017-11-13 14:43:33
    右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两方面: 1. 消除两对象交互时...

    一、 新特性的目的

    右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:

    1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
    2. 能够更简洁明确地定义泛型函数。

    二、 何为右值

    C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。 所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。 右值是指临时的对象,它们只在当前的语句中有效。

    int i = 0;  // 在这条语句中,i 是左值,0 是临时值,就是右值。
    

    在C++11之前,右值是不能被引用的,如:

    int &a = 1;   // error C2440: “初始化”: 无法从“int”转换为“int &”
    

    我们最多只能用常量引用来绑定一个右值,如:

    const int &a = 1;
    

    在C++11中,我们可以引用右值,使用&&来实现:

    int &&a = 1;
    

    三、 应用场景

    有如下string类,实现了拷贝构造函数和赋值运算符重载。

    class MyString {
    private:
    	char* _data;
    	size_t   _len;
    	void _init_data(const char *s) {
    		_data = new char[_len + 1];
    		memcpy(_data, s, _len);
    		_data[_len] = '\0';
    	}
    public:
    	MyString() {
    		_data = NULL;
    		_len = 0;
    	}
    
    	MyString(const char* p) {
    		_len = strlen(p);
    		_init_data(p);
    	}
    
    	MyString(const MyString& str) {
    		_len = str._len;
    		_init_data(str._data);
    		std::cout << "Copy Constructor is called! source: " << str._data << std::endl;
    	}
    
    	MyString& operator=(const MyString& str) {
    		if (this != &str) {
    			_len = str._len;
    			_init_data(str._data);
    		}
    		std::cout << "Copy Assignment is called! source: " << str._data << std::endl;
    		return *this;
    	}
    
    	virtual ~MyString() {
    		if (_data != NULL) {
    			std::cout << "Destructor is called! " << std::endl; 
    			free(_data);
    		}
    	}
    };
    
    int main() { 
    	MyString a; 
    	a = MyString("Hello"); 
    	std::vector<MyString> vec; 
    	vec.push_back(MyString("World")); 
    }
    

    运行结果:

    Copy Assignment is called! source: Hello
    Destructor is called!
    Copy Constructor is called! source: World
    Destructor is called!
    Destructor is called!
    Destructor is called!
    

    总共执行了2次拷贝,MyString("Hello")MyString("World")都是临时对象,临时对象被使用完之后会被立即析构,在析构函数中free掉申请的内存资源。 如果能够直接使用临时对象已经申请的资源,并在其析构函数中取消对资源的释放,这样既能节省资源,有能节省资源申请和释放的时间。 这正是定义转移语义的目的。

    通过加入定义转移构造函数转移赋值操作符重载来实现右值引用(即复用临时对象):

    	MyString(MyString&& str) { 
    		std::cout << "Move Constructor is called! source: " << str._data << std::endl; 
    		_len = str._len; 
    		_data = str._data; 
    		str._len = 0; 
    		str._data = NULL;   // ! 防止在析构函数中将内存释放掉
    	}
    
    	MyString& operator=(MyString&& str) { 
    		std::cout << "Move Assignment is called! source: " << str._data << std::endl; 
    		if (this != &str) { 
    			_len = str._len; 
    			_data = str._data; 
    			str._len = 0; 
    			str._data = NULL;  // ! 防止在析构函数中将内存释放掉
    		} 
    		return *this; 
    	}
    

    运行结果:

    Move Assignment is called! source: Hello
    Move Constructor is called! source: World
    Destructor is called!
    Destructor is called!
    

    需要注意的是:右值引用并不能阻止编译器在临时对象使用完之后将其释放掉的事实,所以转移构造函数转移赋值操作符重载函数 中都将_data赋值为了NULL,而且析构函数中保证了_data != NULL才会释放。

    四、 标准库函数 std::move

    既然编译器只对右值引用才能调用转移构造函数转移赋值函数,又因为所有命名对象都只能是左值引用。 在这样的条件了,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。

    void ProcessValue(int& i) { 
    	std::cout << "LValue processed: " << i << std::endl; 
    } 
    
    void ProcessValue(int&& i) { 
    	std::cout << "RValue processed: " << i << std::endl; 
    } 
    
    int main() { 
    	int a = 0; 
    	ProcessValue(a); 
    	ProcessValue(std::move(a)); 
    }
    

    运行结果:

    LValue processed: 0 
    RValue processed: 0
    

    std::move在提高 swap 函数的的性能上非常有帮助,一般来说,swap函数的通用定义如下:

    template <class T> 
    void swap(T& a, T& b) 
    { 
    	T tmp(a);   // copy a to tmp 
    	a = b;      // copy b to a 
    	b = tmp;    // copy tmp to b 
    }
    

    有了std::move,再结合右值引用,就可以避免不必要的拷贝了。 swap函数的定义变为 :

    template <class T>
    void swap(T& a, T& b) 
    { 
    	T tmp(std::move(a)); // move a to tmp 
    	a = std::move(b);    // move b to a 
    	b = std::move(tmp);  // move tmp to b 
    }
    

    可以使用第三节中的MyString类进行测试:

    int main() { 
    	MyString a("a");
    	MyString b("b");
    
    	swap(a, b);
    
    	return 0;
    }
    

    五、 精确传递(Perfect Forwarding)

    精确传递就是在参数传递过程中,所有这些属性和参数值都不能改变。在泛型函数中,这样的需求非常普遍。 举例说明比较好理解。

    forward_value函数只有一个参数val,定义如下:

    template <typename T> 
    void forward_value(const T& val) { 
    	process_value(val); 
    } 
    
    template <typename T> 
    void forward_value(T& val) { 
    	process_value(val); 
    }
    

    函数 forward_value 为每一个参数必须重载两种类型,T& 和 const T&,否则,下面四种不同类型参数的调用中就不能同时满足:

    int a = 0; 
    const int &b = 1; 
    forward_value(a); // int& 
    forward_value(b); // const int& 
    forward_value(2); // const int&
    

    对于一个参数就要重载两次,也就是函数重载的次数和参数的个数是一个正比的关系。这个函数的定义次数对于程序员来说,是非常低效的。我们看看右值引用如何帮助我们解决这个问题:

    template <typename T> 
    void forward_value(T&& val) { 
    	process_value(val); 
    }
    

    只需要定义一次,接受一个右值引用的参数,就能够将所有的参数类型原封不动的传递给目标函数。

    经测试,VS2015已经支持右值引用&&。

    参考:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/index.html

    展开全文
  • 条件引用表中的数据、表达式、SQL SERVER内置村量函数。Where条件还可以利用几种可能的比较运算符和通配符,如下表。此外,使用布尔AND、OR和NOT运算符可以组合多Where条件标准的比较运算符 说明 ...

            Where条件各筛选FROM子句输出结果并限制结果集中返回的行。条件可引用表中的数据、表达式、SQL SERVER内置标量函数。Where条件还可以利用几种可能的比较运算符和通配符,如下表。此外,使用布尔AND、OR和NOT运算符可以组合多个Where条件。

    标准的比较运算符

    说明

    运算符

    示例

    等于

    =

    Age=30

    大于

    >

    Age>30

    大于等于

    >=

    Age>=30

    小于

    <

    Age<30

    关于等于

    <=

    Age<=30

    不等于

    <>或者!=

    Age<>30或Age!=30

    不小于

    !<

    Age!<30

    不大于

    !>

    Age!>30

    忠告:为提高客户端/服务器性能,让数据库引擎限制返回的行数,而不是使客户端读取不必要的数据。

    警告:包括!号的比较运算符不是ANSI标准的SQL。<>运算符可移植到SQL Server数据库以外的数据库系统,而!=运算符不可移植。

    除了标准的比较运算符外,SQL还提供了4种特殊的比较运算符:BETWEEN、IN、LIKE和IS。IS 关键字主要用来测试null值和null值。

    一般来说(但不总是),将否定的Where条件声明为肯定的条件可改善性能。

    一、使用BETWEEN搜索条件

    BETWEEN搜索条件查询范围内的值。但是该范围可能具有欺骗性,因为它是包含性的。例如1和10符合BETWEEN 1 and 10条件。当使用BETWEEN搜索条件时,第一个条件必须小于后面的值,因为BETWEEN搜索条件实际上是“大于等于第一个值,且小于第二个值”的简短表达方式。

    在下面的例子中,BETWEEN用来选择所有的数量大于10小于21的数据。

    Use WorkData  --选择数据库

    SELECT OrderID

    FROM WorkOrder

    Where  OrderID BETWEEN 11 and 20

     

    警告:BETWEEN 搜索条件通常和日期一起使用。不过,没有时间的BETWEEN运算符将查找最后一天的起始时间,而带有时间的BETWEEN运算符将向上舍入最后的毫秒以包括第二天的12:00:00:000。解决办法如下:

    Where col>=StartDate and col<Ending Date+1

    或者

    Where col>= @StartDate+' 00:00:00' and col<=@EndDate+' 23:59:59'

    (@StartDate、@EndDate为存储过程的字符型参数)

    例如:where SalesDate>=’2017-9-1’ and SalesDate<’2017-10-1’

    或者:where SalesDate>=’2017-9-1 00:00:00’ and SalesDate<’2017-9-30 23:59:59’

    二、与列表比较

    使用IN、SOME、ANY或ALL条件,WHERE条件可以比较测试值与列表中的值。每个运算符也可使用NOT来反转条件。

    IN类似于“=”运算符,因为它搜索列表中的的精确匹配。如果该值在列表中,那么比较结果为真。例如:

    Use Db1

    SELECT TABLE1

    FROM Name

    Where Name IN (’张三’,’李四’)

    以上语句等同于以下语句:

    Use Db1

    SELECT TABLE1

    FROM Name

    Where Name=’张三’OR Name=’李四

    IN运算符也搜索一系列列中的值。下面的例子就是搜索Name、City、Region或Country列中的文本“NC”:

    Use db2

    Select Name

    From dbo.table2

    Where ‘NC’IN (Name,City,Region,Country)

    IN运算符可以和NOT一起使用,以排除某些行。证明否定命题是很难的,尤其是空值包括在内时。因为空值的意思是“未知的”,正在搜索的值可能存在于列表中。下面的代码示例说明了列表中的空值如何使得无法证明’A’不在列表中:

    Select ‘Ab’ where ‘A’ Not IN (‘B’,null)

    这里没有结果,因为的空值可能是“A”。由于SQL不能从逻辑上证明“A”不在列表中,因此Where子句返回假。对于NOT IN条件来说,如果列表中有空(null)值,则每行都将被判定为假。

    三、使用LIKE搜索条件

    LIKE搜索条件使用通配符搜索字符串内的模式。但是,该项通配符与您熟悉的MS-DOS的通配符有很大区别。

     

    SQL通配符与MS-DOS通配符的区别

    说明

    SQL通配符

    MS-DOS通配符

    示例

    任意数量(0或更多)的任意字符

    %

    *

    Col like ‘A%’

    Col like ‘%A%’

    一个任意字符

    _

    ?

    Col like ‘ABD_’

    所附的字符中的一个

    []

    n/a

    Col like ‘[a-g]’

    匹配不在字符范围内

    [^]

    n/a

    Col like ‘[^w-z]’

    Col like ‘[^wxyz]’

    查找包含通配符的模式有两种可能的方法:将该通配符放入方括号内或在其之前放一个转义字符。后一种方法的技巧是,在like表达式中定义转义字符。

    当使用LIKE运算符时,要知道数据库排序规则的排序决定区分大小写及一系列字符的排列顺序。可以使用关键字COLLATE来指定LIKE选自符使用的排序规则的排序顺序。

    虽然LIKE运算可能非常有用,但它也会影响性能。索引基于列的开头部分,而不是列中的短语,如果您发现应用程序需要频繁使用LIKE运算符,则应该启用全文索引——一个强大的索引方法,该方法甚至考虑到了加权词和词尾变化,并且可以以表的形式返回结果集以供联结。

    四、多个WHERE条件

    使用布尔逻辑运算符AND、OR和NOT ,可以将多个WHERE条件组合在WHERE子句内。和乘、除自述运算符一样,布尔逻辑运算符存在俦顺序:首先是NOT,其次是AND,最后是OR,但注意用括号改变优先顺序:

    如语句:

    Select * from table1 where proname like ‘a%’ or price=10 and spec like ‘%25%’

    与语句

    Select * from table1 where (proname like ‘a%’ or price=10) and spec like ‘%25%’

    的查询结果是完全不一样的!!

     




    展开全文
  • Java弱引用最精彩的解释

    千次阅读 2019-03-26 11:54:35
    原文出自:...这解释是关于弱引用最精彩的 public class EmployeeVal { public EmployeeVal(String ...

    原文出自:https://stackoverflow.com/questions/299659/whats-the-difference-between-softreference-and-weakreference-in-java

    这个解释是关于弱引用最精彩的 

     

    public class EmployeeVal {
      public EmployeeVal(String userName) {
        this.userName = userName;
      }
    
    
      public String getUserName() {
        return userName;
      }
    
      public void setUserName(String userName) {
        this.userName = userName;
      }
    
    
      private String userName;
    
    }
        public static void main(String args[]) {
            HashMap<Employee, EmployeeVal> aMap = new HashMap<Employee, EmployeeVal>();
            Employee emp = new Employee("Vinoth");
            EmployeeVal val = new EmployeeVal("Programmer");
            aMap.put(emp, val);
            emp = null;
            System.gc();
            System.out.println("Size of Map: " + aMap.size());
        }

    输出:Size of Map: 1

      public static void main(String args[]) {
        WeakHashMap<Employee, EmployeeVal> aMap = new WeakHashMap<Employee, EmployeeVal>();
    
        Employee emp = new Employee("Vinoth");
        EmployeeVal val = new EmployeeVal("Programmer");
        aMap.put(emp, val);
        emp = null;
    
        System.gc();
        int count = 0;
    
        while (0 != aMap.size()) {
          ++count;
          System.gc();
        }
        System.out.println("Took " + count+ " calls to System.gc() to result in weakHashMap size of : "+ aMap.size());
      }

    随机每次不确定的一个count值:

    Took 3 calls to System.gc() to result in weakHashMap size of : 0

    Took 22 calls to System.gc() to result in weakHashMap size of : 0

    Took 0 calls to System.gc() to result in weakHashMap size of : 0

     

    ----------------

    Understanding Weak References Blog

    强引用

    强引用是一种普通的Java引用,是您每天使用的类型。例如,代码:

    StringBuffer buffer = new StringBuffer();

    创建一个新的StringBuffer()并在变量缓冲区中存储对它的强引用。强引用的重要部分 - 使它们变得“强大”的部分 - 是它们与垃圾收集器交互的方式。具体来说,如果一个对象可以通过一系列强引用(强烈可访问)访问,则它不符合垃圾回收的条件。由于您不希望垃圾收集器销毁您正在处理的对象,因此这通常正是您想要的。

    当强引用过于强烈时

    应用程序使用无法合理扩展的类并不罕见。该类可能只是标记为最终的,或者它可能更复杂,例如由未知(甚至可能是不可知)的具体实现支持的工厂方法返回的接口。假设您必须使用类Widget,并且无论出于何种原因,extendWidget都不可能或不实际添加新功能。

    当您需要跟踪有关对象的额外信息时会发生什么?在这种情况下,假设我们发现自己需要跟踪每个Widget的序列号,但是Widget类实际上没有序列号属性 - 并且由于Widget不可扩展,我们无法添加一个。没问题,这就是HashMaps所代表的:

    serialNumberMap.put(widget,widgetSerialNumber);

    我们必须知道(100%确定)何时不再需要特定的Widget序列号,因此我们可以从Map中删除其条目。否则我们将会发生内存泄漏(如果我们不应该删除Widgets)或者我们会莫名其妙地发现自己缺少序列号(如果我们删除了我们仍在使用的Widgets)。如果这些问题听起来很熟悉,那么它们应该是:它们正是非垃圾收集语言的用户在尝试管理内存时所面临的问题,我们不应该用像Java这样的文明语言来担心这个问题。

    强引用的另一个常见问题是缓存,特别是对于像图像这样的非常大的结构。假设您有一个必须使用用户提供的图像的应用程序,例如我工作的网站设计工具。当然,您希望缓存这些图像,因为从磁盘加载它们非常昂贵,并且您希望避免在内存中同时存储两个(可能是巨大的)图像副本的可能性。

    因为当我们不绝对需要时,图像缓存应该阻止我们重新加载图像,你会很快意识到缓存应该总是包含对已经在内存中的任何图像的引用。但是,对于普通的强引用,该引用本身将强制图像保留在内存中,这需要您(如上所述)以某种方式确定何时在内存中不再需要该图像并将其从缓存中删除,以便它变为有资格进行垃圾收集。您再次被迫复制垃圾收集器的行为并手动确定对象是否应该在内存中。

    弱引用

    简单地说,弱引用是一个不足以强迫对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己执行此操作。你创建一个像这样的弱引用:

    WeakReference <Widget> weakWidget = new WeakReference <Widget>(widget);

    然后在代码的其他地方你可以使用wewWidget.get()来获取实际的Widgetobject。当然,弱引用不足以阻止垃圾收集,因此您可能会发现(如果没有对小部件的强引用)weakWidget.get()突然开始返回null。

    要解决上面的“小部件序列号”问题,最简单的方法是使用内置的WeakHashMap类.

    WeakHashMap的工作原理与HashMap完全相同,只是使用弱引用引用键(而不是值!)。如果WeakHashMap键变为垃圾,则会自动删除其条目。这避免了我描述的陷阱,并且除了从HashMap切换到WeakHashMap之外不需要任何更改。如果您遵循通过Map接口引用地图的标准惯例,则其他代码甚至不需要知道更改。

    Reference queues

    一旦WeakReference开始返回null,它指向的对象就变成了垃圾,WeakReference对象几乎没用。这通常意味着需要进行某种清理;例如,WeakHashMap必须删除这些已经过时的条目,以避免持有越来越多的deadWeakReferences。

    ReferenceQueue类可以轻松跟踪死引用。如果将ReferenceQueue传递给弱引用的构造函数,则当引用它的对象变为垃圾时,引用对象将自动插入引用队列。然后,您可以按照一定的时间间隔处理ReferenceQueue并执行死引用所需的任何清理。

    不同程度的弱引用

    到目前为止,我刚刚提到“弱引用”,但实际上有四种不同程度的参考强度:强,弱,弱和幻像,从最强到最弱。我们已经讨论过强弱参考,所以让我们来看看另外两个。

    软引用

    软引用与弱引用完全相同,只是它不太愿意丢弃它引用的对象。一个只能弱到达的对象(对它的最强引用是WeakReferences)将在下一个垃圾收集周期被丢弃,但是一个可以轻松到达的对象通常会暂停一段时间。

    SoftReferences不需要与WeakReferences有任何不同的行为,但实际上,只要内存供应充足,就可以保留软可访问对象。这使得它们成为缓存的良好基础,例如上面描述的图像缓存,因为您可以让垃圾收集器担心对象的可达性(永远不会从缓存中移除强可达对象)以及它有多糟糕需要他们消耗的记忆。

     

    幻影引用

    幻像引用与软引用或WeakReference完全不同。它对它的对象的抓握是如此脆弱,你甚至无法检索对象 - 它的get()方法总是返回null。这种引用的唯一用途是跟踪它何时被引入ReferenceQueue,因为在那时你知道它指向的对象已经死了。但是,与WeakReference有何不同?

    区别在于排队发生的时间。一旦他们指向的对象变得微弱,WeakReferences就会排队。这实际上发生在最终化或垃圾收集之前;理论上,对象甚至可以通过非正统的finalize()方法“复活”,但WeakReference仍然会死亡。只有在从内存中物理移除对象时才会将幻像引用排队,并且get()方法始终返回null,以防止您“复活”几乎死亡的对象。

    幻像引用有什么用?我只知道它们有两个严重的情况:首先,它们允许您确定何时从内存中删除对象。事实上,它们是确定这一点的唯一方法。这通常不是很有用,但在某些非常特殊的情况下可能会派上用场,例如操作大图像:如果你确定图像应该被垃圾收集,你可以等到它实际上是在尝试加载下一个图像之前,因此不太可能使可怕的OutOfMemoryError。

    其次,幻像引用避免了最终化的基本问题:f​​inalize()方法可以通过创建对它们的新的强引用来“复活”对象。那么,你说什么?好吧,问题是现在必须确定一个覆盖最终化()的对象至少在两个单独的垃圾收集周期中是垃圾才能被收集。当第一个周期确定它是垃圾时,它有资格完成。由于在完成期间对象被“复活”的(微小的,但不幸的是真实的)可能性,垃圾收集器必须在实际移除对象之前再次运行。并且由于最终确定可能没有及时发生,因此在对象等待最终确定时可能会发生任意数量的垃圾收集周期。这可能意味着实际清理垃圾对象的严重延迟,这就是为什么即使大多数堆都是垃圾也可以getOutOfMemoryErrors。

    使用PhantomReference,这种情况是不可能的 - 当PhantomReference入队时,绝对没有办法获得指向现在死对象的指针(这很好,因为它不再存在于内存中)。因为PhntomReference不能用于复活对象,所以可以在第一个垃圾收集周期中立即清理该对象,在该周期中可以发现该对象是幻象可达的。然后,您可以在方便时处置所需的任何资源。

    可以说,应该首先提供finalize()方法。 PhantomReferences肯定更安全,使用效率更高,而且甚至最大化()会使虚拟机的某些部分变得更加简单。但是,它们也需要更多的工作来实现,所以我承认在大多数时候仍然使用finalize()。好消息是,至少你有一个选择。

    ---------------

    ReferenceQueue的使用

    我们希望当一个对象被gc掉的时候通知用户线程,进行额外的处理时,就需要使用引用队列了。ReferenceQueue即这样的一个对象,当一个obj被gc掉之后,其相应的包装类,即ref对象会被放入queue中。我们可以从queue中获取到相应的对象信息,同时进行额外的处理。比如反向操作,数据清理等。

     

    在这次处理中,map并没有因为不断加入的1M对象由产生OOM异常,并且最终运行结果之后map中的确有1万个对象。表示确实被放入了相应的对象信息。不过其中的key(即weakReference)对象中的byte[]对象却被回收了。即不断new出来的1M数组被gc掉了。

    从命令行中,我们看到有9995个对象被gc,即意味着在map的key中,除了weakReference之外,没有我们想要的业务对象。那么在这样的情况下,是否意味着这9995个entry,我们认为就是没有任何意义的对象,那么是否可以将其移除掉呢。同时还期望size值可以打印出5,而不是10000.
    WeakHashMap就是这样的一个类似实现。

     这个也可以理解为就是一个类似cache的实现。
    在cache中,key不重要并且通常都很少,value才是需要对待的。这里通过监控value变化,反向修改map,以达到控制kv的目的,避免出现无用的kv映射。

    -----------------

    利用虚引用PhantomReference实现对象被回收时收到一个系统通知

    虚引用PhantomReference, 在<<深入理解Java虚拟机>>一文中,它唯一的目的就是为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

    import java.lang.ref.PhantomReference;
    import java.lang.ref.Reference;
    import java.lang.ref.ReferenceQueue;
    import java.lang.reflect.Field;
     
    public class Test {
        public static boolean isRun = true;
        @SuppressWarnings("static-access")
        public static void main(String[] args) throws Exception {
            String abc = new String("abc");
            System.out.println(abc.getClass() + "@" + abc.hashCode());
            final ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>();
            new Thread() {
                public void run() {
                    while (isRun) {
                        Object obj = referenceQueue.poll();
                        if (obj != null) {
                            try {
                                Field rereferent = Reference.class
                                        .getDeclaredField("referent");
                                rereferent.setAccessible(true);
                                Object result = rereferent.get(obj);
                                System.out.println("gc will collect:"
                                        + result.getClass() + "@"
                                        + result.hashCode() + "\t"
                                        + (String) result);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }.start();
            PhantomReference<String> abcWeakRef = new PhantomReference<String>(abc, referenceQueue);
            abc = null;
            Thread.currentThread().sleep(3000);
            System.gc();
            Thread.currentThread().sleep(3000);
            isRun = false;
        }
    }

     

    展开全文
  • 第一步:登录“掌桥科研”,掌桥科研是专业检索下载论文的网站,能找到各个学科专业的...第步:在论文题名的下方靠右有一引用”字样的选项按钮,点击将它打开,进入引用页。 第五步:引用页中有显示需要引用的.

    在这里插入图片描述

    第一步:登录“掌桥科研”,掌桥科研是专业检索下载论文的网站,能找到各个学科专业的中外学术期刊和论文(1.3亿多篇)地址:zhangqiaokeyan.com/LSDN-2020081102(复制打开)

    在这里插入图片描述

    第二步:在网站首页的检索框中输入你要检索的论文名称,条件选择题名,然后进行检索,如图:
    在这里插入图片描述

    第三步:通过检索到所需的论文后,将该论文打开,进行论文的详情页,查看论文的基本信息,确认无误。

    第四步:在论文题名的下方靠右有一个“引用”字样的选项按钮,点击将它打开,进入引用页。
    在这里插入图片描述

    第五步:引用页中有显示需要引用的格式文字,在文字右边有一个“一键复制”的按钮,点击它,就会复制要引用的参考文献。
    在这里插入图片描述

    第六步,打开你写论文的Word,然后将复制的内容粘贴到论文中就可以了。

    word引用标准方法:

    1、首先,写好自己的论文,以及要添加的引用内容。
    在这里插入图片描述

    2、在要引用的内容前,添加编号(复制过来后已有编号[1],可不用添加,引用时就会有)
    在这里插入图片描述
    3、将鼠标放在论文中引用参考文献的段落后,然后选择引用,点击交叉引用,就可以看到引用了这时候,鼠标放在引用的部分,会发现有一个超链接的标志。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 一、JPA通用策略生成器  ...JPA提供标准用法,由@GeneratedValue的源代码: @Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ GenerationType strategy() default AUTO
  • C++知识点41.Struct和union在内存中占用空间大小的计算2.final 和override3.STL4.C++11新特性5.C++编译的四个过程6.C++中的strict和class的区别7.枚举8.std::initialize_list9.线程池的实现10.函数11.const和define...
  • 一、JPA通用策略生成器  通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,  ...JPA提供标准用法,由@GeneratedValue的源代码可以明显看出.  Java代码 
  • c 标准和c++标准

    万次阅读 多人点赞 2018-08-29 10:16:49
    C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,...
  • AlexNet结构详解(引用MrGiovanni博士)

    千次阅读 2017-04-18 23:25:02
    @Feifei Li真是厉害呀,弄了一免费的ImageNet,又开始弄分类比赛,省了一大笔广告费就把自己的团队推到研究的最前沿,第一时间掌握到最新的科研动态,而且自己的引用率又急剧飙升,你看现在哪个图像分类研究团队...
  • 条件语句: If-then: (if) ? (then) If-then-else: (if) ? (then) : (else) Default: (value) ?: (defaultvalue) 所有上面算法都可以随意组合和嵌套: ' User is of type ' + (${ user . ...
  • 关于这问题,从不同的切入点,出发点,都有比较不同的深入的解释,但是这些都是等价的。找了4比较好的解释一、作者:杨军链接:...适用的方法也蛮多,有标准的Ordinary Lea...
  • 现代C++之万能引用、完美转发、引用折叠0.导语1.问题引入2.引入万能引用3.万能引用出现场合4.理解左值与右值4.1 精简版4.2 完整版4.3 生命周期延长4.4 生命周期延长应用...
  • Shell if 条件判断

    万次阅读 多人点赞 2018-05-21 22:39:14
    then 符合该条件执行的语句else 符合该条件执行的语句fi二、文件/文件夹(目录)判断[ -b FILE ] 如果 FILE 存在且是一块特殊文件则为真。[ -c FILE ] 如果 FILE 存在且是一字特殊文件则为真。[ -d D...
  • 如何理解c++的左值引用与右值引用

    千次阅读 2019-03-09 12:22:46
    通过上述代码,我们还可以发现,在上述的程序中-0x4(%ebp)存放着右值引用iii,-0x8(%ebp)存放着左值引用,-0xc(%ebp)存放着10,而-0x10(%ebp)存放着1,左值引用和右值引用同int一样是四个字节(因为都是地址) 同时...
  • OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同。使用OR关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。OR...
  • 【Java8】 方法引用 讲解

    万次阅读 多人点赞 2019-11-21 19:24:06
    然而,有时候我们仅仅是调用了一已存在的方法。如下: Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); 在Java8中,我们可以直接通过方法引用来简写lambda 表达式中已经存在的方法。 ...
  • 数据接口标准规范

    万次阅读 2019-08-09 16:24:21
    下列文件中的条款通过本标准引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研究是否可使用这些文件的最新...
  • C++11新标准

    万次阅读 2016-02-20 10:43:45
    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百科不是知道是台湾还是香港人翻译...
  • 点赞再看,养成习惯,微信搜索【三太子敖丙】关注这互联网苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 前言 前段时间敖丙不是在复习...
  • makefile中条件判断与函数

    万次阅读 2016-04-27 20:23:14
    1. 条件判断 1.1 语法 ...这个关键字有四个。 (1)第一个是我们前面所见过的“ifeq”: ifeq (, )  ifeq '' ''  ifeq "" ""  ifeq "" ''  ifeq '' ""  比较参数“arg1”和“arg2”的
  • 47-引用计数与写时复制

    千次阅读 2016-04-26 12:28:30
    47-引用计数与写时复制对于PHP这种需要同时处理多请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要...
  • C++多线程并发(三)---线程同步之条件变量

    千次阅读 多人点赞 2019-05-03 12:43:12
    一、何为条件变量 在前一篇文章《C++多线程并发编程(二)—线程同步之互斥锁》中解释了线程同步的原理和实现,使用互斥锁解决数据竞争访问问题,算是线程同步的加锁原语,用于排他性的访问共享数据。我们在使用...
  • 三调数据库标准和输出表格

    千次阅读 2020-05-10 21:21:52
    TD ...2规范性引用文件 1 3术语和定义 1 4数据库内容和要素分类编码 ,2 5数据库结构定义 5 6数据交换文件命名规则 25 7数据交换内容与格式 ,.霆* . … . 28 8 元数据 28 -* t —1— 刖 s 本标准按照
  • 全面采用最新 C++ 11标准) 【美】Stanley B.Lippman( 斯坦利 李普曼)  Josee Lajoie(约瑟 拉乔伊 )  Barbara E. Moo (芭芭拉 默)  著 王刚  杨巨峰 译 ISBN 978-7-121-15535-2 2013年9月...
  • 看蓝鲸标准运维如何编排一切

    千次阅读 2018-08-14 11:15:32
    它是一套基于 PaaS 的企业研发运营一体化技术解决方案,提供了一完整的研发、运维、运营的PaaS技术平台。平台提供了完善的前后台开发框架、调度引擎、公共组件等模块,帮助业务的产品和技术人员快速构建低成本、免...
  • mongoTemplate通过Query条件指定查询条件和返回字段

    万次阅读 多人点赞 2017-12-19 11:38:12
     Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来,方便我们操作查询语句。  例如: 查询条件onumber="002"  mongo...
  • RFC6020 - YANG语言标准中文

    万次阅读 多人点赞 2016-08-05 14:49:04
    ,该草案从2008年5月开始,先后经历了13草案版本,最终于2010年8月成为建议标准(Proposed Standard)。本文档的翻译时间开始于2016年5月12日。 本文档有 勘误表 存在。 摘要 YANG是一种数据建模...
  • 条件编译#ifdef的妙用详解

    万次阅读 多人点赞 2018-12-09 21:08:39
    本文主要介绍c语言中条件编译相关的预编译指令,包括 #define、#undef、#ifdef、#ifndef、#if、#elif...#define 定义一预处理宏 #undef 取消宏的定义 #if 编译预处理中的条件命令,相当于C语法中的if语句 #ifdef ...
  • 通用引用不是一种新的引用类型,实际上它是右值引用——在满足了下面两个条件的上下文中: 根据左值和右值来进行类型推断。T类型的左值使T被推断为T&,T类型的右值使T被推断为T。 发生引用折叠 通用引用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,965
精华内容 56,386
关键字:

引用标准的四个条件