#使用Kotlin和java实现内存开销对比
文章目录
文章目录
##前言
前几天学习了一下kotlin,实现了listview,突发奇想,使用java编写一样的代码,它们的内存消耗,谁的多?带着这个问题编写了2套代码。使用kotlin实现的listview,这里就不在详述了,可以查看我的上一篇博客Kotlin学习之ListView,使用java编写的,我会放在下面作为参考。
##一、使用listview时内存消耗对比
###1.1java实现的listview
我们创建一个名为activity_main.xml,里面放一个listview控件,id为lvTodo
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
<ListView
android:id="@+id/lvTodo"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
创建ListView的adapter
这里我们自定义一个名为ToDoListAdapter的adapter,继承BaseAdapter
package com.fm.testandroid.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.fm.testandroid.R;
import java.util.ArrayList;
import java.util.List;
/**
* @author:fangming
* @date:Created on 2018/9/4
* @description:
*/
public class ToDoListAdapter extends BaseAdapter {
Context mContext;
List<String> todoList=new ArrayList<>();
MyViewHolder myViewHolder;
public ToDoListAdapter(List<String> todoList,Context mContext) {
this.mContext = mContext;
this.todoList = todoList;
}
@Override
public int getCount() {
return todoList!=null?todoList.size():0;
}
@Override
public Object getItem(int position) {
return todoList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String item = todoList.get(position);
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.todolist_item, null);
myViewHolder = new MyViewHolder(convertView);
convertView.setTag(myViewHolder);
} else {
myViewHolder = (MyViewHolder) convertView.getTag();
}
myViewHolder.mContentTv.setText(item);
return convertView;
}
class MyViewHolder{
TextView mContentTv;
MyViewHolder(View view){
this.mContentTv=view.findViewById(R.id.mContentTv);
}
}
}
在mainactivity中设置listview的adapter
package com.fm.testandroid.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import com.fm.testandroid.R;
import com.fm.testandroid.adapter.ToDoListAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<String> dataList=new ArrayList<String>();
ToDoListAdapter mAdapter=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData(){
ListView lvTodo=(ListView) findViewById(R.id.lvTodo);
for (int i = 0; i <=10; i++) {
dataList.add("hello");
}
mAdapter=new ToDoListAdapter(dataList,this.getBaseContext());
lvTodo.setAdapter(mAdapter);
}
}
运行一下,界面如下,和kotlin写的一样。代码思想也一样。
###1.2内存消耗对比
这里我们使用android自带的Android profiler进行查看
使用java时的内存消耗
这里可以看到使用java时内存消耗大概在18.07左右
使用kotlin时的内存消耗
这里可以看到使用kotlin时,内存消耗在21.04左右
语言 | 内存开销 |
---|---|
java | 18.07 |
kotlin | 21.04 |
从以上对比,可以看出kotlin在运行时,内存消耗要比java的高一点。
##二、编写helloworld进行对比
这里还有一点疑问,kotlin加了一个anko的插件包。我去掉kotlin的插件包,使用java和kotlin分别编写了一个TextView显示hello的程序,再次运行对比。这里就不展示代码了,比较简单。
语言 | 内存开销(第一次) | 内存开销(第二次) | 内存开销(第三次) |
---|---|---|---|
java | 16.54 | 18.36 | 18.4 |
kotlin | 19.81 | 17.88 | 19.92 |
从以上对比,可以看出kotlin在运行时内存消耗和java的有时高,有时低,有时高,和手机当前的环境有关。总体相差不大。
##三、总结
通过以上的一些实验对比,kotlin运行时内存消耗和java的消耗相差不多。不得不承认kotlin确实挺优秀的。期待它的进一步发展。对于android开发者来说,用哪个都可以。java也好,kotlin也好。只要思想不变就好。