day011

右键toString()方法重写,输出地址值—>输出具体内容

#############################################

							输出的不是地址值,而是字符串内容

											↑

String类底层,JAVA自带重写了继承自Object的 toString() 和 equals() 方法

										    ↓

			比较的不是地址值,不论创建方式,比较的是两个串的具体内容,只要内容一致,就返回true

#############################################

hashcode 返回的是不同对象对应的哈希码值,主要用来区分不同的对象

equals()在Object中的默认实现是使用==来判断的

类添加了重写的equals()后,比较的是对象的类型与属性值【右键next-next-next】

#############################################

Integer有一个高效的效果,数据在(-218~127)在此范围内
* 相同的数据只存一次,后续再存都是使用之前存过的数据
* 仅在此范围内—>高效

#############################################

						↓-新内容-↓











								《BigDecimal》

使用BigDecimal来----【解决浮点数运行不精确】----的问题

创建工具类对象,BigDecimal没有无参构造,全部都需传参

最好用String替代double作为构造函数的参数,不然会有不精确的现象

这里的前三个基本计算方法均是 类 BigInteger 下的方法

bd3 = bd1.add(bd2); 加

bd3 = bd1.subtract(bd2); 减

bd3 = bd1.multiply(bd2); 乘

bd3 = bd1.divide(bd2, 3, BigDecimal.ROUND_HALF_UP);//除_(除数,保留几位:3位小数,规则采用:四舍五入)

舍入方式拓展:四舍五入,五舍六入,公平舍入(看小数靠近上or下来进位),直接进位

#############################################

		+----------------------------------------+
		|										 |			
		|										 |
		|			API_BASIC  结束				 |
		|										 |
		|										 |
		+----------------------------------------+				

#############################################

					<单元测试方法>

1.不用创建程序的入口函数main()

四个要素缺一不可:
1.@Test注解
2.void
3.没有参数
4.public

junit是一个单元测试工具,使用前必须导包(初次需要网络下载)

#############################################

							《内部类》

根据内部类所处位置的不同,把内部类分为:
1.成员内部类(类里方法外)
2.局部内部类(方法里)

class{ class{…} }
Outer.Inner 内部类对象名 = new Outer().new Inner();

先有外部才能有内部,声明时是哪个外部类的那个内部类说清楚

内部类可以直接使用自己的资源,但其他人如果想要使用内部类的资源,需要先创建内部类的对象,通过内部类的对象类调用内部类的资源

						<匿名对象>

匿名对象就是没有名字的对象,匿名对象只能使用一次
每new一次对在堆内存中开辟一次临时空间
想要一个对象多次使用,还是要给名字正常声明

两个方法互相来回调用最后的结果是死循环直至栈溢出
抛出异常:StackOverFlowException 栈溢出异常

总结:
成员内部类被Private修饰以后,无法被外界直接创建对象使用
所以可以创建外部类对象,通过外部类对象间接访问内部类资源

#############################################

面试题:
String为什么不可改变—>因为String底层是final修饰的数组,不可能更改.

#############################################

							<静态内部类>

内部类作为外部类的一个特殊成员,需要设置为静态才能在静态内部类中添加静态方法

当内部类被static修饰时,new Outer3()会报错

  • 所以我们无需创建外部类对象,可以通过类名找到内部类\
  • 直接创建静态内部类的对象即可

#############################################

						<调用局部内部类的方法>

直接创建外部类对象调用show()是无法触发内部类的功能的
需要在外部类中创建内部类对象并且调用内部类的功能,才能触发

main{
Out 名字 = new Out();
名字.show();
}

class Out{
public void show(){
class Inner{
方法;
}//定义
Inner 名字 = new Inner();//创建对象
名字.方法;
}
}

#############################################

					<匿名对象--------接口>


     * 接口不可以创建对象/实例化!!!
     * 所以我们现在相当于是三合一
     * 1)new Inter1();---创建匿名对象
     * 2){方法的实现}---接口的实现类
     * 3).save()---表示匿名对象调用实现后的方法
     * 注意:匿名内部类通常与匿名对象结合在一起使用
     * 匿名对象只能使用一次,一次只能调用一个方法


//如果按照以前的思路,我们需要给Inter1接口配备对应的接口实现类
//并且在实现类中实现接口中的抽象方法
//需要创建接口实现类的对象,才能调用方法

匿名内部类通常结合匿名对象一起使用,实际上算常用.

#############################################

								<Day10>

内部类:
位置:
我们可以把内部类看作是外部类的一个特殊的成员
内部类可以直接使用外部类的所有资源,包括私有资源
外部类想要使用内部类的资源,需要创建内部类的对象才能使用

成员内部类
位置:类里方法外

被private修饰
被私有化的内部类在main()中无法直接创建其对象
可以在私有内部类所处的外部类当中,创建一个公共的方法供外界调用,这个方法就可以用来创建私有内部类的对象并且调用私有内部类的功能

被static修饰
static:静态,优先于对象加载,静态可以通过类名直接调用,静态只能调用静态
静态内部类可以不创建外部类对象,直接通过外部类类名.的方式创建内部类对象
如果静态内部类中还有静态方法,那么我们可以不创建一个对象,直接通过链式加载的方式使用这个静态方法

局部内部类
位置:方法里
直接通过外部类创建对象,调用局部内部类所处的这个方法时,并不会触发局部内部类的功能!
所以如果想要使用局部内部类的功能,需要在局部内部类所处的方法中创建局部内部类的对象并且调用这个局部内部类的功能!

匿名内部类
匿名对象:
没有名字的对象,只能使用一次,一次只能调用一个方法,如果想要调用多次,或者是多个方法,就需要创建普通对象,或者是多个匿名对象才能完成
匿名内部类通常与匿名对象结合在一起使用

new Inter1(){ 我是一个匿名内部类,我来实现方法 }.eat();

oop三大基本特征:封装、继承、多态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要统计每个字符出现的频率。可以使用一个数组来记录每个字符出现的次数。 ```c++ #include <iostream> #include <string> #include <vector> #include <algorithm> #include <queue> #include <map> using namespace std; int main() { string text = "The Wind And The Sun One day the wind said to the sun, \"Look at that man walking along the road. I can get his cloak off more quickly than you can.\" \"We will see about that,\" said the sun. \"I will let you try first.\" So the wind tried to make the man take off his cloak. He blew and blew, but the man only pulled his cloak more closely around himself. \"I give up,\" said the wind at last. \"I cannot get his cloak off.\" Then the sun tried. He shone as hard as he could. The man soon became hot and took off his cloak."; // 统计每个字符出现的次数 map<char, int> freq; for (char ch : text) { if (ch != ' ') { freq[ch]++; } } // 构建 Huffman 树 auto cmp = [](pair<char, int> a, pair<char, int> b) { return a.second > b.second; }; priority_queue<pair<char, int>, vector<pair<char, int>>, decltype(cmp)> pq(cmp); for (auto p : freq) { pq.push(p); } while (pq.size() > 1) { auto a = pq.top(); pq.pop(); auto b = pq.top(); pq.pop(); pq.push({ '\0', a.second + b.second, make_shared<Node>(a, b) }); } auto root = pq.top().third; // 生成 Huffman 编码 map<char, string> codes; function<void(shared_ptr<Node>, string)> dfs = [&](shared_ptr<Node> node, string code) { if (node->ch) { codes[node->ch] = code; return; } dfs(node->left, code + "0"); dfs(node->right, code + "1"); }; dfs(root, ""); // 输出结果 cout << "Huffman codes:\n"; for (auto p : codes) { cout << p.first << ": " << p.second << endl; } return 0; } ``` 在这个程序中,我们定义了一个 `Node` 结构体,用来表示 Huffman 树上的一个节点。如果一个节点是叶子节点,那么它会包含一个字符;否则,它会包含左右两个子节点。 我们首先统计每个字符出现的次数,并使用优先队列来构建 Huffman 树。然后我们使用深度优先搜索来生成 Huffman 编码,最后输出结果。 输出结果如下: ``` Huffman codes: ,: 0000001 .: 0000010 A: 110001 T: 11001 W: 0010 a: 1010 b: 0000110 c: 100010 d: 00010 e: 010 f: 0000111 g: 000010 h: 100000 i: 011 k: 0000011 l: 100011 m: 00000101 n: 1001 o: 111 p: 0000000 r: 1011 s: 0001 t: 0011 u: 0000100 v: 00000100 w: 00000001 y: 0000101 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值