Fork me on GitHub
Wakaka

路漫漫其修远兮,吾将上下而求索


  • 首页

  • 关于

  • 标签

  • 归档

ListView工作机制

发表于 2018-04-13

ListView的用途

当你希望展示的内容很大量的时候,这个时候你应该使用ListView,它能够使你展示的内容随着屏幕的滑动进而得到展示。

使用方法

  • 在布局文件中添加ListView的控件
1
2
3
4
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
阅读全文 »

java集合类---部分源码

发表于 2018-04-12

HashMap

概述

  1. HashMap是基于哈希表的Map接口的非同步实现,Key值和value值都支持使用null值。HashMap不保证映射的顺序,而且不保证映射的顺序一直不变。
  2. 通常来说,普通的put和get操作都只需要O(1)的时间复杂度
  3. 特别注意的是:HashMap不是同步的,如果有多线程同时去访问一个HashMap,并且其中有至少一个线程会修改map的话,则需要进行同步操作(加锁)。

数据结构

  1. HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。当发生hash冲突的时候,就是用链表来处理冲突,同一个hash值的链表都存储在一个链表中。
  2. 但是当位于一个数组中的元素较多的时候,即hash值相等的元素较多时,通过key值依次查找的效率较低
  3. 在JDK1.8中,HashMap中采用数组+链表+红黑树实现,当长度超过阈值8时,将链表转换为红黑树,这样大大较少查找时间。
阅读全文 »

剑指offer---03

发表于 2018-04-12

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

解题思路

  1. 遍历给出的链表,直至结尾
  2. 将每次遍历的结果放在栈中
  3. 便利完成后,将栈中保存的链表节点pop出来
  4. 完成输出

编码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.Stack;
import java.util.ArrayList;

public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
ListNode head = listNode;
Stack stack = new Stack();
while (head != null){
stack.push(head.val);
head = head.next;
}
while (!stack.empty()){
list.add((Integer) stack.pop());
}
return list;
}
}

剑指offer---02

发表于 2018-04-12

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路

    • 首先查找字符串中的空格个数
    • 要替换的字符的长度
    • 扩充原字符串的长度
    • 进行替换
  1. 就是采用取巧的replaceAll

编程实现

1
2
3
4
5
6
(取巧,不要学我)
public class Solution {
public String replaceSpace(StringBuffer str) {
return(str.toString().replaceAll(" ","%20"));
}
}

剑指offer---01

发表于 2018-04-12

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

  1. 当然你愿意的话可以暴力去破解,但是一般不建议这样做

    • 我们可以去开始的点为左下或者右上
    • 这样我们比较的时候可以使用递归的思路
    • 左下(右下),大于所给的数就往上(左),小于的话就往右(下)
    • 一直递归,直至找到所给定的值
    • 若没有就返回false
    • 注意边界问题

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
public boolean Find(int target, int [][] array) {

int high = array.length;
int width = array[0].length;
int i = high-1,j=0;

for (;j< width && i>=0;){
if (array[i][j] > target){
i--;
}else if (array[i][j] < target){
j++;
}else if (array[i][j] == target){
return true;
}
}
return false;
}
}

Android消息机制

发表于 2018-04-10

概述

Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。

Hnadler:主要作用是讲一个任务切换到某个指定的线程中去执行
MessageQueue: 消息队列,内部实现以单链表的形式来存储消息列表,并对外提供插入和删除操作。
Looper:以无限循环的形式去查找是否有新的消息,如果有的话就处理消息,否则就一直等待着。
ThreadLocal:ThreadLocal可以再不同的线程中互不干扰地存储并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper.

Android中UI线程不安全,为什么不通过加锁解决?

  1. 加锁使得逻辑复杂
  2. 加锁使得效率降低

解决方案

  1. 创建一个Message对象,借助Handler发送出去
  2. 之后再handlerMessage()中获取到刚刚发送出去的Message对象

子线程创建Handler,加上Looper.prepare,主线程自动调用Looper.prepare,Looper.Loop开启循环

流程分析

  1. Handler利用send/post发送消息
  2. 调用MessageQueue的enqueueMessage将消息入列
  3. Looper发现有消息(MesssgaeQueue的next方法)到来,就会处理这个消息
  4. Looper交由Hnadler处理Handler的dispatchMeaasge方法调用
  5. Handler的handleMessage方法调用

View的事件分发机制

发表于 2018-04-10

点击事件的分发过程有三个重要的方法来共同完成

  1. dispatchTouchEvent(MotionEvent ev):负责进行事件的分发
  2. onInterceptTouchEvent(MotionEvent event):负责是否拦截某个事件
  3. onTouchEvent(MotionEvent event):用于处理点击事件

现在我们用类比的方式来讲解事件分发机制

假设你是一个公司的小职员,你的上司是部长,部长的上司是总经理。

  1. 公司接到一个业务(点击事件开始)
  2. 首先肯定是总经理先接单(根视图:ViewGroup),判断是否将这个业务派发给部长完成(触发了dispatchTouchEvent(MotionEvent ev)方法)
  3. 如果总经理觉得这单业务过于简单只需要自己就可以完成,于是便拦截下来,不往下分发了(触发了onInterceptTouchEvent(MotionEvent event))方法返回true
  4. 总经理就自己处理了这个事件(出发了onTouchEvent(MotionEvent event))
  5. 回到3,如果总经理觉得这个事情自己不愿意做,便将这个事情派发给了部长(触发了onInterceptTouchEvent(MotionEvent event))返回false
  6. 部长同时觉得很适合你来做(触发了onInterceptTouchEvent(MotionEvent event))返回false
  7. 现在任务就应该由你来完成了,你是不可以拦截的(没有onInterceptTouchEvent(MotionEvent event))

处理事件机制

  1. 设置OnTouchListener,那么OnTouchListener中的onTouch方法会被会调
  2. 如果OnTouch返回false,就调用当前View的onTouchEvent
  3. 如果返回true,那么onTouchEvent就不会被调用
  4. 在onTouchEvent方法中,如果设置了OnClickListener,那么它的onClick会被调用,所以OnClickListener优先级最低

Java基础---io类

发表于 2018-04-07

介绍

Java io是为了实现“文件、控制台、网络设备”等输入输出设备之间的通信。

IO框架分类

字节为单位的IO流

  1. OutputStream/InputStream:以字节为单位的IO流的超类
  2. ByteArrayOutputStream/ByteArrayInputStream:字节数组IO流
  3. PipedOutputStream/PipedInputStream:管道IO流,实现多线程间的管道通信
  4. FilterOutputStream/FilterInputStream:过滤IO流
  5. DataOutputStream/DataInputStream:数据IO流
  6. BufferedOutputStream/BufferedInputStream:缓冲IO流
  7. PrintStream:打印输出流
  8. FileOutputStream/FileInputStream:文件IO流
  9. ObjectOutputStream/ObjectInputStream:对象IO流

字符为单位的IO流

  1. Writer/Reader:以字符为单位的IO流的超类
  2. CharArrayWriter/CharArrayReader:字符数组的IO流
  3. PipedWriter/PopedReader:字符类型的管道IO流
  4. FliterWriter/FliterReader:字符类型的过滤IO流
  5. BufferedWriter/BufferedReader:字符缓冲IO流
  6. OutputStreamWriter/InputStreamReader:字节转字符的IO流
  7. FileWriter/FileReader:字符类型的IO流
  8. PrintWriter:字符类型的打印输出流

经典排序

发表于 2018-04-06
排序种类 最优时间复杂度 平均时间复杂度 最坏时间复杂度 稳定性
快速排序 nlogn nlogn n^2 稳定
冒泡排序 n n^2 n^2 稳定
插入排序 n n^2 n^2 稳定
归并排序 n nlogn nlogn 稳定
选择排序 n^2 n^2 n^2 不稳定
希尔排序 n nlog^2n 不稳定
堆排序 nlogn nlogn nlogn 不稳定

稳定性判断

如果在一个待排序的序列中,存在2个相等的数,在排序后这2个数的相对位置保持不变,那么该排序算法是稳定的;否则是不稳定的。

阅读全文 »

Java基础---Integer

发表于 2018-04-05

定义

Integer类将Java中的原始类型int的值包装在对象中。Integer类型的对象包含一个int类型的字段。

Integer类提供将int与string互相转换的方法,另外还提供有用在的处理int型时的常量和方法。

1
public final class More ...Integer extends Number implements Comparable<Integer> {}
  1. final修饰,不能被继承
  2. 继承Number
  3. 实现Comparable,可以利用comparable to进行比较(同类型之间)

属性

私有属性

1
2
private final int value;
private static final long serialVersionUID = 1360826667806852920L;

公有属性

1
2
3
4
5
public static final int   MAX_VALUE = 0x7fffffff;
public static final int MIN_VALUE = 0x80000000;
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;

方法

构造方法

1
2
3
4
//表示指定的 int 值
public More ...Integer(int value) {
this.value = value;
}
1
2
3
4
//表示指定的 string 值,利用parseInt
public More ...Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10);
}

byteValue()…

1
2
3
4
//Integer转化为byte返回
public byte More ...byteValue() {
return (byte)value;
}

toString()

1
2
3
4
//返带符号回十进制的数值并作为字符串返回
public String More ...toString() {
return toString(value);
}

hashcode()

1
2
3
public int More ...hashCode() {
return Integer.hashCode(value);
}

equals()

1
2
3
4
5
6
7
//与指定类型进行比较
public boolean More ...equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

…

Integer 和 int 的关系

  1. int是java提供的8种基本类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
  2. int的默认值是0,Integer的默认值是null
  3. 两者都可以表示一个数值
  4. 两者不可以互用,因为它们是两种不同的数据类型。
1…789

Wakaka

84 日志
25 标签

© 2018 Wakaka
本站访客数:
本站总访问量次 |
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.3