德普王

Draft, Edit, Proofread, Publish

  • 首页
  • 技术
  • 生活
  • 装修
  • 工具
  • 关于
  • 搜索

String 的两种实例化方式

发表于 2017-07-24 | 更新于 2023-05-01 | | 阅读次数

String 的两种实例化方式

隐式实例化:直接赋值

public class Demo {
public static void main(String[] args) {
String s = "hello";
String s2 = "hello";
System.out.println(s == s2);
}
}
true
阅读全文 »

Object 的常用方法

发表于 2017-07-21 | 更新于 2020-06-15 | | 阅读次数

所有的类都默认继承 Object 这个基类。

基本数据类型不是类,所以不继承,但它们的封装类继承,使用基本数据类型时会自动封箱为其封装类。equals()、hashCode()、getClass() 和 toString() 是 Object 常用的方法。

equals(Object obj) 方法

API,源码:

public boolean equals(Object obj) {
return (this == obj);
}

== 用于比较两个数值是否相等。

== 比较基本数据类型时,用来判断两个基本数据类型数值是否相等;引用变量存放的是对象在堆中的地址,== 比较两个引用时,比较两个地址的数值是否相等,即判断两个引用是否指向同一个对象。

int a = 1;
int a1 = 2;
a == a1; // false

Dog d = new Dog();
Cat c = new Cat();
Cat c2 = new Cat();
Dog d2 = d;
d == c; // false; 因为两个实例对象不同
c == c2; // false; 因为引用 c 和 c2 指向不同实例
d == d2; // true; 因为引用 d 和 d2 指向同一实例

所以 equals 方法用于判断两个对象是否在意义上相等,即这两个对象是否是同一个对象。

d.equals(c); // false
c.equals(c2); // false
d.equals(d2); // true

String 重写了 equals 方法,比较两个 String(匿名)对象是否带有相同的字节组合:

public boolean equals(Object anObject) {
// 比较两个引用是否指向字符串常量池中同一个字符串常量(匿名对象)
if (this == anObject) {
return true;
}
// 比较两个 String 对象是否带有相同的字节组合
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) // 比较每一个字符是否相同
return false;
i++;
}
return true;
}
}
return false;
}
阅读全文 »

算法:数据结构之反转字符串

发表于 2017-07-18 | 更新于 2020-05-31 | | 阅读次数

反转字符串

题目描述:将字符串 "##We###Are###Family!###" 反转为 "###!ylimaF###erA###eW##"。

分析与解答:这题我们的解答方法有很多,常见的方法是使用数组,下面来介绍用数据结构中的 Stack(栈)来完成反转。

Stack 的特点是 FILO(First In,Last Out)— 先进后出。此特点用于将字符串反转非常合适,以下是代码实现:

import java.util.Stack;

public class Demo {
public static void main(String[] args) {
System.out.println(ReverseAllStringWithStack("##We###Are###Family!###"));
}

public static String ReverseAllStringWithStack(String string) {
// 如果 string 等于 null 或等于 "" 时,返回 string。
if (string == null || string.length() == 0)
return string;
// 新建一个 Stack,用于存放 Character 类型。为什么存放 Character 而不是 char,
// 因为泛型只能指定是类或接口类型,而不能是 primitive 主(基本)数据类型。
Stack<Character> stringStack = new Stack<>();

char[] array = string.toCharArray();//toCharArray() 将字符串转换成 char 类型数组
// 使用 for-each 将数组中的元素 push(推)进 Stack
for (Character c : array) {
stringStack.push(c);
}
int length = string.length();// 数组的长度 length; 字符串的长度 length(); 集合的长度 size()
// 利用 for 循环将元素从栈顶开始,依次弹出
for (int i = 0; i < length; i++) {
array[i] = stringStack.pop();
}

return new String(array);//String 的重载构造方法将 char[] 数组转换,返回一个实例化 String 对象
}
}
阅读全文 »

从字节码(ByteCode)角度理解 String 的连接

发表于 2017-07-15 | 更新于 2020-06-14 | | 阅读次数

首先来看一道题。

题目描述

问下面两种赋值方式有何区别?

public class Demo {
public static void main(String[] args) {

String s = "1" + "2" + "3";

String s1 = "1";
String s2 = s1 + "2";
String s3 = s2 + "3";

System.out.println(s);
System.out.println(s3);
}
}

分析与解答

从表面其实看不出什么,我们可以通过 Class 文件反编译成的字节码(Byte Code)来分析。

如果你在使用 IDEA,请先在 IDEA 中安装 ASMified Bytecode Outline 插件,点击 安装详细教程,如果是其他集成环境,请自行 Google 安装插件教程。

阅读全文 »

Java 虚拟机运行时数据区域

发表于 2017-07-13 | 更新于 2020-06-15 | | 阅读次数

JVM 对于是每个 Java 程序员掌握一定 Java 基础后,都需要学习的。因为很多代码问题,只能了解了 JVM 底层原理后才能解决。大多数 Java 后端开发者都知道堆(Heap)和栈(Stack)的概念,却没有真正理解其原理。推荐 《深入理解 Java 虚拟机(第二版)》— 周志明著 学习 JVM。

进程和线程

学习 JVM 前要了解进程和线程的概念。

以下是一个类比,来自 阮一峰 — 进程与线程的一个简单解释。

  1. 计算机的 CPU 是像一座工厂,时刻在运行。
  2. 因工厂电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个 CPU 一次只能运行一个任务。
  3. 进程就好比工厂的车间,它代表 CPU 所能处理的单个任务。任一时刻,CPU 总是运行一个进程,其他进程处于非运行状态。
  4. 一个车间里,可以有很多工人。他们协同完成一个任务。
  5. 线程就好比车间里的工人。一个进程可以包括多个线程。
阅读全文 »

我奶奶人很胖,但心很美

发表于 2017-07-09 | 更新于 2024-06-19 | | 阅读次数

我奶奶生在一个重男轻女的家庭中,她小时候被她的亲生母亲虐待,让她的右脚落下了隐疾。但奶奶不以此为芥蒂,始终性格开朗,特别爱笑。

起雾了

阅读全文 »

Effective Java(二):如何消除过期的对象引用

发表于 2017-07-05 | 更新于 2019-09-23 | | 阅读次数

前言

你能看出以下代码哪里内存泄漏吗?

// Can you spot the "memory leak"?
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}

public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}

/**
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
*/
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}

分析与解答

答案是:

阅读全文 »

关于帽子的逻辑题

发表于 2017-07-04 | 更新于 2019-09-22 | | 阅读次数

几道 “脑筋急转弯”(逻辑题)。

五顶帽子

问:有五顶帽子,三红两蓝,给 A、B、C 三人每人戴一个,各自不准看自己帽子的颜色,可以看到另外两人帽子颜色。问 A 戴的什么颜色的帽子,他说不知道。然后又问 B 戴的什么颜色的帽子,他想了一会儿,同样说不知道。又问 C 戴的是什么颜色的帽子,他说虽然我不知道我的帽子是什么颜色的,但听你们这样一说,我知道了。问 C 戴的是什么颜色帽子?

答案是:

阅读全文 »

计算机名词解释

发表于 2017-06-26 | 更新于 2020-05-26 | | 阅读次数

总结于 鸟哥的 Linux 私房菜:基础学习篇(第四版)

CPU 的架构

CPU 架构, 分为精简指令集 (RISC) 与复杂指令集 (CISC)

  • 精简指令集 (Reduced Instruction Set Computer, RISC)

主要应用于手机、路由器等上。

  • 复杂指令集(Complex Instruction Set Computer, CISC)

主要应用于电脑上。

阅读全文 »

单例模式的几种实现方式

发表于 2017-06-24 | 更新于 2019-10-11 | | 阅读次数

单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。单例模式也叫单态模式。

通常单例模式在 Java 语言中,有两种构建方式:

  • 懒汉式。指全局的单例实例在第一次被使用时构建。
  • 饿汉式。指全局的单例实例在类装载时构建。

以下方式均线程安全:

懒汉式 (static)

不高效,因为在任何时候只能有一个线程调用 getInstance() 方法。但是同步操作只需要在 instance == null 调用时才被需要,即第一次创建单例实例对象时。双重检验锁改进。

public class Singleton {
private static Singleton instance;

private Singleton() {
}

public synchronized static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
阅读全文 »

浅析七种经典排序算法

发表于 2017-06-18 | 更新于 2020-06-21 | | 阅读次数

本文分析冒泡、快速、选择、插入、希尔、归并和堆排序,为了对以下各个算法进行方便的测试,测试主方法体如下(Java 实现):

public class Sort {
public static void main(String[] args) {
int[] input = {5, 4, 7, 1, 6, 2, 8, 9, 10};
// 此处调用方法,以调用冒泡排序为例
bubbleSort(input);
for (int i = 1; i <= input.length; i++) {
System.out.println(input[i - 1]);
}
}
}

本篇博文所有排序实现均默认 从小到大。

阅读全文 »

Hexo 添加 Disqus 评论

发表于 2017-06-15 | 更新于 2020-03-12 | | 阅读次数

Disqus 配置使用

Disqus 网址:https://disqus.com/

打开链接后, 可以直接用 Facebook,Twitter 以及 Google 登录;也可以用邮箱注册后登录。

配置 Disqus

登录后,点击首页的 GET STARTED 按钮,点击图示按钮。

images

Create a new site

images

Website Name 是 主题配置文件(_config.yml) 的 short name 。比如我的是 deppwang

阅读全文 »

Hexo 添加不蒜子和 LeanCloud 统计

发表于 2017-06-14 | 更新于 2024-06-19 | | 阅读次数

前置提示:Hexo 版本为 3.9.0,NexT 版本为 5.1.1(不是最新版)

LeanCloud 统计单篇博文的阅读量,即统计单篇博文的阅读量是多少。

不蒜子 统计站点的总访问量,即统计浏览了多少次;有多少人访问,在 footer 显示。 因为统计不准,现已弃用

阅读全文 »

购买域名与域名配置使用

发表于 2017-06-13 | 更新于 2020-03-12 | | 阅读次数

拥有一个自己独一无二的域名,是一件很酷的事。以下是在万网购买域名教程。

购买域名

购买域名,可以通过国外的 GoDaddy 购买。
购买 GoDaddy 域名教程:http://Godaddy.idcspy.com/domain-regist

我通过阿里的万网注册的。
网址:https://www.aliyun.com/

可以通过淘宝账号直接登录,登陆后跳转 购买域名网址 。
输入你想购买的域名(如:depp),选择域名后缀,建议.me(代表自己),点击查询看你想购买的域名是否被购买。

image

阅读全文 »

Hexo 安装与添加 NexT 主题

发表于 2017-06-11 | 更新于 2020-03-12 | | 阅读次数

原来发了一个关于 Hexo 搭建博客系列的总纲,想要搭建个人博客的同学,建议直接根据官方文档 (https://hexo.io/zh-cn/docs/) 搭建博客,本文针对 Windows 系统补充讲解一些个人设置。

Hexo 是一个开源的博客框架,是一位台湾小哥 (tommy351) 在大学时开发出来的。我们可以直接基于这个框架,选择一个自己喜欢的主题,修改一些配置,就搭建出一个博客了。我使用的是 NexT 主题,最终效果可看我的博客:https://depp.wang。个人博客是也通过 Jekyll 和 WordPress 搭建,但是 Hexo 简单免费,建议使用 Hexo。

Hexo 搭建的博客是静态的,没有后台代码,所以速度很快。

安装 Git+NodeJS 环境

Hexo 是基于 Node.js 的静态博客生成器,所有需要提前安装 Node.js,可使用命令行下载 (详见官方文档教程),最好下载长期维护版,地址:

https://nodejs.org/zh-cn/

Hexo 是在本地使用 MarkDown 语法写博客,再使用 Git 发布到远程代码托管平台上,如 GitHub。

需要安装 Git,一个代码管理工具。以下所有命令均是在 Git Bash(Git 命令行窗口) 中执行的。下载地址:

https://git-scm.com/downloads  // 官方地址,速度应该比较慢
https://github.com/waylau/git-for-win//github 下载地址

推荐一个廖雪峰大神的 Git 经典入门教程,讲得非常好,学完肯定对 git 原理了然于胸。

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
阅读全文 »
1…67
deppwang

deppwang

每个人都需要有自己的哈姆雷特

135 文章
319 标签
RSS
GitHub Twitter BiliBili YouTube 豆瓣
Links
  • 廖雪峰的官方网站
  • CoolShell
  • 阮一峰的网络日志
  • 1byte
  • 程序员的喵
  • 椒盐豆豉
  • 胡涂说
© 2025 deppwang
由 Hexo 强力驱动
主题 - NexT.Pisces