Amy's Blog

这是副标题

  • 首页
  • 归档
  • 分类
  • 标签

线程学习

发表于 2020-05-28 | 分类于 Java | 阅读次数

零、概念

在计算机中,我们把一个任务称为一个进程。浏览器是一个进程,word是另一个进程。

一个Java程序实际上是一个JVM进程,JVM用一个主线程来执行main()方法,在main()内部,又可以启动多个线程。另外,还有垃圾回收其他工作线程。

当所有非守护线程执行完毕后,JVM进程退出。

线程是操作系统调度的最小任务单位。

进程和线程的关系:包含关系。一个进程可以包含一个或多个线程,但至少一个线程。

进程间通信比线程间通信慢,因为线程间通信是读取同一变量。

一、创建新线程

Java用Thread对象表示一个线程,线程执行代码写在run()方法中,一个线程对象只能调用一次start()方法。

创建新线程:

阅读全文 »

从put()分析HashMap

发表于 2020-05-23 | 分类于 Java | 阅读次数

数据结构:数组+链表。Node<K,V>[] table。(源码参考put()方法),允许null键/值。

数组+链表有什么优点:

  • 若是数组,数组缺点:需要连续内存空间;删除需要移动其他元素位置
  • 若是链表,链表缺点:查找复杂度高。
  • 时间复杂度:O(1)。常量时间(假设能正确分散)。

一、如何确定key的数组索引位置,为什么?

1、得到混合key.hashCode()高低位的hash值。

阅读全文 »

继承、多态、接口、抽象类

发表于 2020-05-10 | 分类于 Java | 阅读次数

一、继承:

  • 表示is-a的关系。将多个类的相同功能部分抽出放到父类,extends父类。
  • 继承是is关系,组合是has关系(组合:通过持有实例)。
    1
    2
    3
    4
    5
    6
    7
    public class BaseMessage{
    //...
    }
    public class TextMessage extends BaseMessage{
    //...
    //在子类中想调用父类哪个方法就调用哪个
    }

一个类有且仅有一个父类(若没有明确写extends的类,编译器会自动加上 extends Object)。Object特殊,它没有父类。

子类不会继承父类的任何构造方法。

1、protected

子类无法访问父类的private方法或private字段。父类的字段需要用protected或public修饰。

阅读全文 »

原码反码补码

发表于 2020-04-21 | 分类于 Java | 阅读次数

关于原码、反码和补码

首先了解机器数和机器数的真值。

机器数和机器数的真值

1、机器数

数字在计算机中的二进制表现形式。

  • 符号数值化:数据的正负号,在机器里用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位(称符号位),用0代表符号“+”,用1代表符号“-”。
  • 二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器字长。一台机器的字长是固定的(如8位、16位、32位、64位)。
    1
    2
    3
    比如在字长为8的计算机中。
    十进制的+5,其机器数为:00000101
    十进制的-5,其机器数为:10000101

2、机器数的真值

机器数有符号占据一位,所以机器数的形式值就不等于真值。

1
2
3
例如机器数:10000101
最高位1表示“-”,则真值数为-0000101,十进制真值为-5。
真值是不计算符号位的(第一位不表示值,只表示正负)。

机器数的三种形式

阅读全文 »

位运算符

发表于 2020-04-20 | 分类于 Java | 阅读次数

位运算符

java定义了位运算符,应用于short(短整型)、int(整数类型)、long(长整型)、byte(字节型)、char(字符型)。位运算表示对每个二进制位(bit)进行计算,其操作数和运算结果都是整数型。

位运算符主要针对二进制(补码),按照低位到高位一一对齐运算。

  • 位逻辑运算符包括:&(与)、|(或)、~(非)、^(异或)。除了~为单目运算符外,其余都为双目运算符。
  • 位移运算符包括<<(左移运算符)、>>(右移运算符)、>>>(无符号右移运算符)。
    阅读全文 »

5.回文数-判断

发表于 2019-08-20 | 分类于 Algorithms/DataStructure | 阅读次数

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例:121 -> true,-121 -> false

题解

一、字符串的反转

1
2
3
4
5
6
7
8
public boolean isPalindrome(int x) {
String str = String.valueOf(x);
String reserveStr = new StringBuilder(str).reverse().toString();
if (str.equals(reserveStr)) {
return true;
}
return false;
}

二、数学:去首去尾,首尾比较

例:x = 12321

  • 得到首位left: 12321 / 10000 = 1; (此处div=10000为计算得出)
  • 得到末位right:12321 % 10 =1; (此处10为定值,用来取个位上的数)
  • 若left=right,去首尾缩减,x -> 232 :(12321 % 10000) / 10 。即(x % div) / 10。
  • x已缩减两位数-> div减小。div -> div / 100。

代码实现

阅读全文 »

4.整数反转

发表于 2019-08-15 | 分类于 Algorithms/DataStructure | 阅读次数

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。如果反转后整数溢出那么就返回 0。

如123->321 , 120->21 , -123->-321

题解

算法思路:除运算(/)+模运算(%)

除数10 (1)相除取整x (2)取余pop (3)对取模结果累计 result
第一次循环-> 1234/10=123 1234%10=4 0*10+4=4
第二次循环-> 123/10=12 123%10=3 4*10+3=43
第三次循环-> 12/10=1 12%10=2 43*10+2=432
第四次循环-> 1/10=0 1%10=1 432*10+1=4321
0—>不再循环

关键点:除数是10,当算出一位数字pop,就会将当前result * 10+pop,并不是对4、3、2、1最后来计算(不是4 * 1000+3*100···)

阅读全文 »

3.无重复字符的最长子串

发表于 2019-08-08 | 分类于 Algorithms/DataStructure | 阅读次数

题目

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。如”abcabcbb”->3。

题解

1、使用List

  • list.contains()
  • list.add():遍历每个字符,若list中不存在,加入进列表。
  • list.indexOf():若list中已存在此字符,获取此字符的index,需要将<=该index的字符们从list中移除。
  • list.subList(int fromIndex, int toIndex)
  • list.removeAll()

示例

  • s=”advdf”;
  • list变化:(a)->(a,d)->(a,d,v)->(v,d)->(v,d,f)

代码实现

阅读全文 »

2.两数相加(链表)

发表于 2019-08-01 | 分类于 Algorithms/DataStructure | 阅读次数

题目:

给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

题解

测试用例分析

2+5=7;

4+6=10->记0进1,0=10%10(除10取余),1=10/10(整除运算,除10取整);

3+4=7->7+1(上个和运算的进位y)=8。

两位数相加,进位y为0或1(因为最大情况为:个位9+9->进1;十位9+9+1->进1)。

特殊情况考虑

阅读全文 »

1.由两数之和找加数

发表于 2019-07-26 | 分类于 Algorithms/DataStructure | 阅读次数

两数之和

给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

1、双重循环

阅读全文 »
123…5
Amy

Amy

42 日志
9 分类
25 标签
GitHub
Links
  • 阿里中间件团队博客
  • Jark's Blog
  • 廖雪峰个人网站
© 2020 Amy
由 Hexo 强力驱动
主题 - NexT.Mist
本站总访问量 次    本站访客数人次

Hosted by Coding Pages